VHDL筛选器未获取第一个值的输出

VHDL筛选器未获取第一个值的输出,vhdl,Vhdl,我尝试用VHDL实现fir滤波器,但在前三个时钟期间,我没有得到任何输出,并且在0 ps时出现错误,Instance/filter_tb/uut/:警告:算术操作数中有一个“U”|“X”|“W”|“Z”|“-”,结果将是“X”(es)。 源文件(我还有另外两个用于D触发器的文件): IEEE库; 使用IEEE.STD_LOGIC_1164.ALL; 使用ieee.std_logic_unsigned.all; 实体过滤器是 端口(x:STD_逻辑_向量中(3到0); clk:标准逻辑中; y:输

我尝试用VHDL实现fir滤波器,但在前三个时钟期间,我没有得到任何输出,并且在0 ps时出现错误
,Instance/filter_tb/uut/:警告:算术操作数中有一个“U”|“X”|“W”|“Z”|“-”,结果将是“X”(es)。

源文件(我还有另外两个用于D触发器的文件):

IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用ieee.std_logic_unsigned.all;
实体过滤器是
端口(x:STD_逻辑_向量中(3到0);
clk:标准逻辑中;
y:输出标准逻辑向量(9到0);
末端过滤器;
过滤器的体系结构是
array1型是标准逻辑向量(3到0)的数组(0到3);
信号系数:阵列1:=(“0001”、“0011”、“0010”、“0001”);
信号c0、c1、c2、c3:STD_逻辑_向量(7到0):=“00000000”;
信号s0、s1、s2、s3:STD_逻辑_向量(3向下至0):=“0000”;
信号和:标准逻辑向量(9到0):=“0000000000”;
组件DFF是
端口(d:标准逻辑向量(3到0);
clk:标准逻辑中;
q:输出标准逻辑向量(3到0);
端部元件;
组件lDFF为
端口(d:标准逻辑向量(9到0);
clk:标准逻辑中;
q:输出标准逻辑向量(9到0);
端部元件;
开始

s0您已经构建了一系列由三个寄存器组成的级联寄存器。
您未提供重置,因此寄存器内容未知。您可以无条件地使用寄存器进行计算。因此,您的算术计算将看到未知值,并且会像您看到的那样失败

第一个(最简单的)解决方案是添加重置。但这不是最好的解决办法。您将不再收到警告,但输出的前三个周期将基于寄存器重置值,而不是输入信号。
如果您有一个大的数据流,并且不关心第一个时钟周期中的一些错误值,那么您可以接受它

真正正确的方法是让“有效”信号沿着数据传输。仅当存在“有效”时才显示输出数据。这是通过任何管道硬件结构处理数据的标准方法

顺便说一句:你通常不会自己建造D-ffs。合成器会帮你的。您只需使用时钟进程并处理其中的数据向量



我有一些问题。如果我添加一个重置引脚,我什么时候将其从1切换到0?如何在不明确使用D-ffs的情况下创建此回路

你用和制造时钟一样的方法制造重置信号

至于D寄存器:如果使用标准寄存器VHDL代码,它们就会出现:

reg : process (clk,reset_n)
begin
   // a-synchronous active low reset
   if (reset_n='0') then 
      s0 <= "0000";
      s1 <= "0000";
      s2 <= "0000";
    elsif (rising_edge(clk)) then
      s0 <= x;
      s1 <= s0;
      s2 <= s1;
 ....
reg:进程(时钟、复位)
开始
//a同步有源低电平复位
如果(重置)_n='0'),则

s0您已经构建了一系列由三个寄存器组成的级联寄存器。
您未提供重置,因此寄存器内容未知。您可以无条件地使用寄存器进行计算。因此,您的算术计算将看到未知值,并且会像您看到的那样失败

第一个(最简单的)解决方案是添加重置。但这不是最好的解决办法。您将不再收到警告,但输出的前三个周期将基于寄存器重置值,而不是输入信号。
如果您有一个大的数据流,并且不关心第一个时钟周期中的一些错误值,那么您可以接受它

真正正确的方法是让“有效”信号沿着数据传输。仅当存在“有效”时才显示输出数据。这是通过任何管道硬件结构处理数据的标准方法

顺便说一句:你通常不会自己建造D-ffs。合成器会帮你的。您只需使用时钟进程并处理其中的数据向量



我有一些问题。如果我添加一个重置引脚,我什么时候将其从1切换到0?如何在不明确使用D-ffs的情况下创建此回路

你用和制造时钟一样的方法制造重置信号

至于D寄存器:如果使用标准寄存器VHDL代码,它们就会出现:

reg : process (clk,reset_n)
begin
   // a-synchronous active low reset
   if (reset_n='0') then 
      s0 <= "0000";
      s1 <= "0000";
      s2 <= "0000";
    elsif (rising_edge(clk)) then
      s0 <= x;
      s1 <= s0;
      s2 <= s1;
 ....
reg:进程(时钟、复位)
开始
//a同步有源低电平复位
如果(重置)_n='0'),则

s0FIR滤波器包含触发器。这些触发器没有复位输入,因此在未知状态下通电。您可以通过将触发器的输出初始化为
“UUUU”
(因为它们是四位宽)来对此进行建模。一个
'U'
std\U逻辑
值表示未初始化的值


因此,您的代码的行为与您应该期望的一样。如果您对这种行为不满意,您需要添加一个重置输入并将其连接到触发器

FIR滤波器包含触发器。这些触发器没有复位输入,因此在未知状态下通电。您可以通过将触发器的输出初始化为
“UUUU”
(因为它们是四位宽)来对此进行建模。一个
'U'
std\U逻辑
值表示未初始化的值


因此,您的代码的行为与您应该期望的一样。如果您对这种行为不满意,您需要添加一个重置输入并将其连接到触发器

我有一些问题。如果我添加一个重置引脚,我什么时候将其从1切换到0?我如何在不明确使用D-ffs的情况下创建这个电路?我有一些问题。如果我添加一个重置引脚,我什么时候将其从1切换到0?如何在不显式使用D-ffs的情况下创建此电路?何时将重置引脚从1转到0?VHDL是一种硬件描述语言。你在这里设计数字硬件。我认为你需要学习一些基本的数字电子学,特别是关于触发器和同步/异步复位。什么时候我应该把复位引脚从1转到0?VHDL是一种硬件描述语言。你在设计
reg : process (clk,reset_n)
begin
   // a-synchronous active low reset
   if (reset_n='0') then 
      s0 <= "0000";
      s1 <= "0000";
      s2 <= "0000";
    elsif (rising_edge(clk)) then
      s0 <= x;
      s1 <= s0;
      s2 <= s1;
 ....