为什么在VHDL中使用并发语句?
我只是从学习vhdl开始。 考虑这里的代码:-< /P> 我不明白什么是并发语句,为什么这里需要它们?为什么在VHDL中使用并发语句?,vhdl,Vhdl,我只是从学习vhdl开始。 考虑这里的代码:-< /P> 我不明白什么是并发语句,为什么这里需要它们? 如果我们在进程p中直接修改Q和Qbar而不使用内部信号“状态”是否正确?另外,为什么J,K不在代码段中进程p的敏感度列表中?您可能知道,从纯功能意义上讲(即不考虑硬件实现),并发语句不会引起任何延迟。所以当你写作的时候 Q <= state; 这是因为在VHDL中不严格允许读取输出信号。通过使用“状态”,您有一个内部信号,您可以从中导出Q和Qbar 另一种等效的实现方法是在状态机中的每
如果我们在进程p中直接修改Q和Qbar而不使用内部信号“状态”是否正确?另外,为什么J,K不在代码段中进程p的敏感度列表中?您可能知道,从纯功能意义上讲(即不考虑硬件实现),并发语句不会引起任何延迟。所以当你写作的时候
Q <= state;
这是因为在VHDL中不严格允许读取输出信号。通过使用“状态”,您有一个内部信号,您可以从中导出Q
和Qbar
另一种等效的实现方法是在状态机中的每种情况下分配输出Q
和Qbar
,并完全消除中间状态
信号。然而,这似乎有点复杂,因为对于一个等效的功能,代码行数几乎是原来的两倍
回答第二个问题:J,K不在敏感度列表中,因为过程
p
是一个同步过程。您描述的是一个内存元素(JK触发器),根据定义,它仅在时钟
或重置
更改时更新其输出。输入信号J
和K
可能会改变,过程不会更新其输出。每当出现时钟边缘或断言重置时,该过程“唤醒”并评估输入,并确定输出应该是什么。即使在J中,K也包括在敏感度列表中,如果输出仅在上升沿(时钟)上更新,则总体功能将是相同的(尽管代码可能会混淆)。没有理由不在流程中分配Q
和Qbar
。不过你需要稍微小心一点
无论何时分配信号,该值都不会更新,直到模拟器进入下一个“增量循环”。这意味着,在进程中,当您分配信号时,实际上您只是在进行cheduling和update,如果您读取信号,您将获得“old”值。为了获得您可能期望的顺序更新,您使用了一个变量。因此,您可以像这样对JKFF进行建模:
architecture behv of JK_FF is
begin
p : process(clock, reset) is
variable state : std_logic;
variable input : std_logic_vector(1 downto 0);
begin
if (reset = '1') then
state := '0';
elsif (rising_edge(clock)) then
input := J & K;
case (input) is
when "11" =>
state := not state;
when "10" =>
state := '1';
when "01" =>
state := '0';
when others =>
null;
end case;
end if;
Q <= state;
Qbar <= not state;
end process;
end behv;
JK\U FF的架构是
开始
p:过程(时钟、复位)为
可变状态:标准逻辑;
变量输入:标准逻辑向量(1到0);
开始
如果(重置='1'),则
状态:='0';
elsif(上升沿(时钟))然后
输入:=J&K;
案例(输入)为
当“11”=>
状态:=非状态;
当“10”=>
状态:='1';
当“01”=>
状态:='0';
当其他人=>
无效的
终例;
如果结束;
学究模式:并发分配确实会导致增量周期延迟。
architecture behv of JK_FF is
begin
p : process(clock, reset) is
variable state : std_logic;
variable input : std_logic_vector(1 downto 0);
begin
if (reset = '1') then
state := '0';
elsif (rising_edge(clock)) then
input := J & K;
case (input) is
when "11" =>
state := not state;
when "10" =>
state := '1';
when "01" =>
state := '0';
when others =>
null;
end case;
end if;
Q <= state;
Qbar <= not state;
end process;
end behv;