我正在尝试用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;
注意:sig_sel a是:'0'
注意:sig_sel b是:'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;
注意:sig_sel a是:'1' 注意:sig_sel b是:'1'
这对我来说很奇怪,因为我需要在分配sig_sel
值之前进行一些检查。可能有什么不对?
答案 0 :(得分:0)
在VHDL中,当进程结束时(或遇到等待语句),信号赋值生效。
因此,
sig_sel <= "11";
if sig_sel = "11" then
只有在sig_sel
"11"
进入流程时才会触发if,而不是每次从计算机编程的角度来看都会触发。
它适用于code2的原因(我只能猜测,因为你没有提供所有相关数据)是代码被执行两次。第一次取消置位reset
(将sig_sel
设置为"11"
),第二次将Data_in(0)
置为'1'
(触发if)。我希望你能得到以下输出:
注意:sig_sel a是:&#39; 0&#39;
注意:sig_sel b是:&#39; 0&#39;
注意:sig_sel a是:&#39; 1&#39;
注意:sig_sel b是:&#39; 1&#39;
注意:我是一个人