VHDL Vivado';s行为模拟在输出分配操作上返回未知(红色X)
我写了这个简单的过程。它应该累加((b-a)/n)*yi项,其中yi是每个时钟周期更新的输入,然后输出总和的结果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);
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);