Ответ 1
Переменные используются, когда вы хотите создать сериализованный код, в отличие от обычного параллельного кода. (Сериализованный означает, что команды выполняются в порядке, один за другим, а не вместе). Переменная может существовать только внутри процесса, а присвоение значений не является параллельным. Например, рассмотрим следующий код:
signal a,b : std_logic_vector(0 to 4);
process (CLK)
begin
if (rising_edge(clk)) then
a <= '11111';
b <= a;
end if;
end process;
помещает в b
значение a
до запуска процесса, а не '11111
'. С другой стороны, код:
signal a,b : std_logic_vector(0 to 4);
process (CLK)
variable var : std_logic_vector(0 to 4);
begin
if (rising_edge(clk)) then
var := '11111';
a <= var;
b <= var;
end if;
end process;
поместит значение '11111'
в a
и b
.
Честно говоря, по моему опыту, большую часть времени, когда вам не нужно использовать переменные, единственное место, которое я использовал, было в цикле, где мне нужно было проверить, не имеет ли какое-либо количество сигналов 1:
type BitArray is array (natural range <>) of std_logic;
--...
entity CAU_FARM is
port
(
-- IN --
REQUEST : in BitArray(0 to (FLOW_num -1));
--..
);
end CAU_FARM;
--...
farm_proc: process(CLK_FARM, RESET)
variable request_was_made_var : std_logic;
begin
if RESET = C_INIT then
-- ...
elsif rising_edge(CLK_FARM) then
-- read state machine --
case read_state is
when st_read_idle =>
request_was_made_var := '0';
for i in 0 to (FLOW_num -1) loop
if (REQUEST(i) = '1') then
request_was_made_var := '1';
end if;
end loop;
if (request_was_made_var = '1') and (chosen_cau_read_sig /= 8) then
read_state <= st_read_stage_1;
for i in 0 to (FLOW_num -1) loop
if (i = choice_out_sig) then
ACKNOWLEDGE(i) <= '1';
end if;
end loop;
else
read_state <= st_read_idle;
end if;
------------------------
when st_read_stage_1 =>
--...