如何在依赖的多个过程中使用敏感性列表

时间:2019-04-12 05:35:36

标签: vhdl fpga

我正在为一个简单的算术方程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之后的仿真结果:

enter image description here

1 个答案:

答案 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触发器的逻辑元件,它将在时钟沿正确更新)