我正在为一个简单的算术方程d = 1 +(k * o)写代码。我的代码中有三个过程。第三个过程依赖于第二个,第二个依赖于第一个。我无法保持敏感性列表正确。输出未定义。
fun1
在第一个过程中,转换完成。当完成过程1时,应在过程2中计算d2。当在过程2中计算d2时,应在过程3中更新d。这是我的测试台代码:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity dcalc is
Port ( k : in STD_LOGIC_VECTOR (7 downto 0);
o : in STD_LOGIC_VECTOR (7 downto 0);
e : in STD_LOGIC_VECTOR (7 downto 0);
d : out STD_LOGIC_VECTOR (7 downto 0);
clk: in STD_LOGIC);
end dcalc;
architecture Behavioral of dcalc is
COMPONENT divd
PORT(
d1 : IN std_logic_vector(7 downto 0);
e : IN std_logic_vector(7 downto 0);
remi : OUT std_logic_vector(7 downto 0);
clk : IN std_logic
);
END COMPONENT;
signal endp1,d2,k1,o1,e1,d3: unsigned (7 downto 0);
--signal d3:std_logic_vector(7 downto 0);
begin
--process 1
process(k,o,e)
begin
if(clk'event and clk='1') then
k1<=unsigned(k);
o1<=unsigned(o);
e1<=unsigned(e);
endp1<=x"01";
end if;
end process;
--process 2
process(endp1)
begin
if(clk'event and clk='1') then
d2<=1+(k1*o1);
end if;
end process;
--process 3
process(d2)
begin
if(clk'event and clk='1') then
d<=std_logic_vector(d2);
end if;
end process;
end Behavioral;
请帮助。 这是将所有过程灵敏度列表更改为仅clk之后的仿真结果:
答案 0 :(得分:1)
在同步(计时)过程中,要求灵敏度列表仅是时钟(并且可能是异步复位):
process(clk)
begin
if RISING_EDGE(clk) then
k1<=unsigned(k);
o1<=unsigned(o);
e1<=unsigned(e);
endp1<=x"01";
end if;
end process;
在您的原始灵敏度列表中,D触发器(或D触发器的向量的寄存器)上的输入更改触发了进程执行,但是我们知道输出不会立即更改,因此它会等待时钟边沿。然后,当时钟沿到来时,clk
不在灵敏度列表中,因此模拟将其忽略。结果,您的输出永远不会在仿真中更新。
(相反,综合趋向于忽略您的敏感度列表,而只是放置一个配置为真正的D触发器的逻辑元件,它将在时钟沿正确更新)