VHDL Vivado';s行为模拟在输出分配操作上返回未知(红色X)

VHDL Vivado';s行为模拟在输出分配操作上返回未知(红色X),vhdl,simulation,vivado,Vhdl,Simulation,Vivado,我写了这个简单的过程。它应该累加((b-a)/n)*yi项,其中yi是每个时钟周期更新的输入,然后输出总和的结果 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity Integrator is Port ( a : in STD_LOGIC_VECTOR(7 downto 0); b : in STD_LOGIC_VECTOR(7 downto 0);

我写了这个简单的过程。它应该累加((b-a)/n)*yi项,其中yi是每个时钟周期更新的输入,然后输出总和的结果

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all; 
entity Integrator is
    Port ( a : in STD_LOGIC_VECTOR(7 downto 0);
           b : in STD_LOGIC_VECTOR(7 downto 0);
           n : in STD_LOGIC_VECTOR(7 downto 0);
           yi : in STD_LOGIC_VECTOR (15 downto 0);
           start : in std_logic;
           clk : in std_logic;
           output : out signed (15 downto 0);
           done : out STD_LOGIC);
end Integrator;

architecture Integrator_arch of Integrator is
signal do : std_logic;
signal i : unsigned(7 downto 0);
signal tmp1, tmp2, tmp3, res : signed(15 downto 0);
begin
    process(clk)
    begin
        if(clk'event and clk='1') then
            if(start='1') then
                do <= '1';
                i <= (others=>'0');
                done <= '0';
                res <= (others=>'0');
            elsif(do='1' and done='0') then   
                if(i=unsigned(n)) then
                    output <= res;
                    do <= '0';
                    done <= '1';
                else                    
                    tmp1 <= resize(signed(b)-signed(a),16);
                    tmp2 <= resize(tmp1/signed(n),16);
                    tmp3 <= resize(tmp2*signed(yi),16);
                    res <= res + tmp3;
                    i <= i+1;
                end if;
            end if;  
        end if;         
    end process;
end Integrator_arch;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
实体集成器是
端口(a:标准逻辑向量(7到0);
b:标准逻辑向量(7到0);
n:标准逻辑向量(7到0);
yi:标准逻辑向量(15到0);
启动:在标准逻辑中;
clk:标准逻辑中;
输出:签出(15到0);
完成:输出标准(U逻辑);
终端积分器;
体系结构积分器
信号do:std_逻辑;
信号i:无符号(7到0);
信号tmp1、tmp2、tmp3、res:已签名(15向下至0);
开始
过程(clk)
开始
如果(clk'事件和clk='1'),则
如果(start='1'),则

通过更多的尝试和错误,你找到了我自己的答案吗

似乎一行
numeric\u std
表达式的结果需要一个时钟周期才能稳定下来,所以当我试图通过写来提高可读性时

tmp1 <= resize(signed(b)-signed(a),16);
tmp2 <= resize(tmp1/signed(n),16);
tmp3 <= resize(tmp2*signed(yi),16);
res <= res + tmp3;

tmp1您的启动信号的断言时间应该更长。在模拟开始时,tmp1、tmp2、tmp3未初始化,需要3个时钟周期才能正确计算tmp3值(因为您在integrator进程内部使用了Look,并查看错误所在。这是基本调试。通常,当您看到XXXX时,请检查您没有从两个位置驱动信号,例如测试台和组件本身。但初始UUU表明情况并非如此。@BrianDrummond不幸的是,调试程序工作正常很好,输出显示了正确的解决方案,这让我更加困惑为什么模拟会失败。至于驱动信号,我在整个代码中只驱动输出信号一次,所以这不是问题所在。所以你是说,如果你在波形窗口中添加tmp1-3和res,它们在时钟边缘产生信号之前都是正确的最终输出?能否将它们添加到问题中的sim卡图像中?我会将temp1-3和res声明为变量,而不是信号。@vipin为什么?然后管道长度将匹配n输入。
tmp1 <= resize(signed(b)-signed(a),16);
tmp2 <= resize(tmp1/signed(n),16);
tmp3 <= resize(tmp2*signed(yi),16);
res <= res + tmp3;
res <= res + resize((resize(b-a,16)/signed(n))*yi,16);