gpt4 book ai didi

VHDL 变量 Vs。信号

转载 作者:行者123 更新时间:2023-12-03 08:37:17 24 4
gpt4 key购买 nike

我一直在阅读有关 VHDL 编程的文本(前面没有,所以不能给出标题)。我一直很难从文本中理解的一个问题是何时使用变量与信号。我想我对何时使用信号(即内部信号)有清楚的了解,但对于变量却没有那么多。

我确实注意到文本通常在定义进程之前声明和初始化信号,而在进程内部声明一个变量(我猜从未初始化......)。

无论如何要弄清楚这一点,无论是根据定义还是通过示例都会很棒!

最佳答案

与普通的并行代码不同,当您想要创建序列化代码时会使用变量。 (序列化意味着命令按顺序执行,一个接一个而不是一起执行)。一个变量只能存在于一个进程中,值的赋值不是并行的。例如,考虑以下代码:

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'进入两者 ab .

坦率地说,根据我的经验,大多数时候你不需要使用变量,我唯一使用它的地方是在一个循环中,我需要检查多个信号中的任何一个是否为 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 =>
--...

关于VHDL 变量 Vs。信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15485749/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com