如果 VHDL 进程中的块不起作用,则内部的值分配
Value assignment inside if block in a VHDL process not working
我正在尝试用 VHDL 实现一些东西。代码 1 输出错误,我不明白为什么。
process(Data_in, reset)
begin
if(reset = '1') then
sig_sel <= "00";
elsif(reset = '0') then
if(Data_in(0) = '1') then
sig_sel <= "11";
report "sig_sel a is: " & STD_LOGIC'image(sig_sel(0));
report "sig_sel b is: " & STD_LOGIC'image(sig_sel(1));
if(sig_sel = "11") then
report "i am one and one";
end if;
end if;
end if;
end process;
Note: sig_sel a is: '0'
Note: sig_sel b is: '0'
但是如果我在重置后删除或注释 if 语句(如下 - 代码 2),它会起作用!
process(Data_in, reset)
begin
if(reset = '1') then
sig_sel <= "00";
elsif(reset = '0') then
--if(Data_in(0) = '1') then
sig_sel <= "11";
report "sig_sel a is: " & STD_LOGIC'image(sig_sel(0));
report "sig_sel b is: " & STD_LOGIC'image(sig_sel(1));
if(sig_sel = "11") then
report "i am one and one";
end if;
--end if;
end if;
end process;
Note: sig_sel a is: '1'
Note: sig_sel b is: '1'
这对我来说很奇怪,因为在分配 sig_sel
值之前我需要做一些检查。有什么问题吗?
在VHDL中,对signal的赋值在进程结束(或者遇到wait语句)时生效。
因此,
sig_sel <= "11";
if sig_sel = "11" then
只有当 sig_sel
为 "11"
时才会在进入进程时触发 if,而不是像您从计算机编程的角度所期望的那样每次都触发。
它对 code2 起作用的原因(我只能猜测,因为您没有提供所有相关数据)是代码被执行了两次。第一次 reset
无效(将 sig_sel
设置为 "11"
),第二次 Data_in(0)
分配给 '1'
(触发 if)。不过,我希望您能得到以下输出:
Note: sig_sel a is: '0'
Note: sig_sel b is: '0'
Note: sig_sel a is: '1'
Note: sig_sel b is: '1'
Note: i am one and one
我正在尝试用 VHDL 实现一些东西。代码 1 输出错误,我不明白为什么。
process(Data_in, reset)
begin
if(reset = '1') then
sig_sel <= "00";
elsif(reset = '0') then
if(Data_in(0) = '1') then
sig_sel <= "11";
report "sig_sel a is: " & STD_LOGIC'image(sig_sel(0));
report "sig_sel b is: " & STD_LOGIC'image(sig_sel(1));
if(sig_sel = "11") then
report "i am one and one";
end if;
end if;
end if;
end process;
Note: sig_sel a is: '0'
Note: sig_sel b is: '0'
但是如果我在重置后删除或注释 if 语句(如下 - 代码 2),它会起作用!
process(Data_in, reset)
begin
if(reset = '1') then
sig_sel <= "00";
elsif(reset = '0') then
--if(Data_in(0) = '1') then
sig_sel <= "11";
report "sig_sel a is: " & STD_LOGIC'image(sig_sel(0));
report "sig_sel b is: " & STD_LOGIC'image(sig_sel(1));
if(sig_sel = "11") then
report "i am one and one";
end if;
--end if;
end if;
end process;
Note: sig_sel a is: '1'
Note: sig_sel b is: '1'
这对我来说很奇怪,因为在分配 sig_sel
值之前我需要做一些检查。有什么问题吗?
在VHDL中,对signal的赋值在进程结束(或者遇到wait语句)时生效。
因此,
sig_sel <= "11";
if sig_sel = "11" then
只有当 sig_sel
为 "11"
时才会在进入进程时触发 if,而不是像您从计算机编程的角度所期望的那样每次都触发。
它对 code2 起作用的原因(我只能猜测,因为您没有提供所有相关数据)是代码被执行了两次。第一次 reset
无效(将 sig_sel
设置为 "11"
),第二次 Data_in(0)
分配给 '1'
(触发 if)。不过,我希望您能得到以下输出:
Note: sig_sel a is: '0'
Note: sig_sel b is: '0'
Note: sig_sel a is: '1'
Note: sig_sel b is: '1'
Note: i am one and one