if(rising_edge(clk)) then
count := count + 1;
if count = 3 then
enable <= 1;
elsif count = 6 then
enable <= 0;
count := 0;
end if;
end if;
if enable = 0 then
a0i <= a_0;
boi <= b_0;
end if;
if enable = 1 then
a0i <= a_1;
boi <= b_1;
end if;
除计数外,所有信号都是。一旦enable变为0或1,a0i和boi的值应该响应。我尝试使用变量。但它不能让我使用过程。 I am getting the o/p as this. How ever I want to change the input as soon as enable signal change.
答案 0 :(得分:0)
将最后两个if条件放在另一个进程中
Process(enable, a_0, b_0, a_1, b_1)
begin
If(enable = '0')THEN
a0i <= ...
....
ELSE
.....
END IF;
END PROCESS;
此过程对使能信号很敏感,因此只要启用发生变化,独立于时钟,语句就会立即生效(异步)
答案 1 :(得分:0)
解决方案1:使用2个流程作为蓝图。
解决方案2:使用内部变量。
process(clk)
variable count : natural range of 0 to 6 := 0;
variable enable_i : std_logic := '0';
begin
if(rising_edge(clk)) then
count := count + 1;
if count = 3 then
enable_i := '1';
elsif count = 6 then
enable_i := '0';
count := 0;
end if;
end if;
if enable = '0' then
a0i <= a_0;
boi <= b_0;
else
a0i <= a_1;
boi <= b_1;
end if;
enable <= enable_i;
end process;
一些提示:
enable_i
enable_i
仅在流程中使用,那么您可以将转化移至enable
答案 2 :(得分:0)
你也可以从你的过程中取出以下两个等式。
process(...)
[...]
if enable = 0 then
a0i <= a_0;
boi <= b_0;
end if;
if enable = 1 then
a0i <= a_1;
boi <= b_1;
end if;
end process
然后你不能再使用IF语句了,但你可以使用WHEN语句:
a0i <= a_0 when enable = '0' else a_1;
boi <= b_0 when enable = '0' else b_1;
请注意,在这种情况下,多路复用器将位于锁存器之后。如果您对这些信号有时序问题,这可能很重要。
答案 3 :(得分:0)
从您的模拟波形中,我认为您未能在灵敏度中包含enable
,a_0
,b_0
,a_1
和b_1
列表,但我不能确定,因为你没有发布完整的例子。因为您在if rising_edge(clk)
之外测试了5个提到的信号的值,所以需要包含它们。这些值仅在clk
的下降沿更新,因为假设clk
是敏感列表中的唯一内容,即下次评估该过程时。
尽管您可以使用else
而不是enable = 0
的单独测试来提高可读性,但它应该是书面的功能。合成通常忽略敏感性列表(它只是使模拟更有效),所以如果你要合成它应该已经有效了。