信号从0100变为0X00

Signal becomes 0X00 from 0100

我正在开发一个程序计数器,它必须在 clk 的每个上升沿加 4:

代码:

if_CounterSum <= MemAddr + 4;

process (Clk, Reset)
begin
    if Reset = '1' then
        MemAddr <= (OTHERS => '0');
    elsif rising_edge(Clk) then 
        MemAddr <= if_CounterSum;
    end if;
end process;

在 ISIM 中模拟时,

After Reset is set to 0:
Initial state:
MemAddr = 0 (0000)
if_CounterSum = 4 (0100)

First CLK rising_edge:
MemAddr = X (0X00)
if_CounterSum = X (XXXX)

我已经在这个 "simple" 上工作了几个小时,我尝试过:

  1. 也将 +4 行更改为同步(进入进程)但问题仍然存在。
  2. 其他一些无效的东西。

我该如何修复那个 X?我已经测试了其他数字而不是 4,正如我猜到的,if_CounterSim 中的所有“1”都在分配后转换为“X”。

你没有包含所有的代码,所以下面是一个猜测。

问题可能是信号的 VHLD 解析的结果,因此相同信号的多个冲突驱动程序,例如 '0''1' 将导致 'X',但是 '0' 的两个驱动程序将导致 '0'.

所以查找模块中所有分配了MemAddrif_CounterSum的地方,并删除那些不必要的分配。

在进程外部分配信号时,实际上是将其连接到箭头的右侧。 在同步过程中分配信号时,您可以使用触发器在时钟边沿为信号分配一个值。

对于您的情况,我建议您将 if_CounterSum <= MemAddr + 4; 放入您的流程中。这样,增量将在每个时钟上升沿完成。

process (Clk, Reset)
begin
    if Reset = '1' then
        MemAddr <= (OTHERS => '0');
    elsif rising_edge(Clk) then 
        MemAddr <= MemAddr + 4;
    end if;
end process;

如果你真的需要 if_CounterSum 这次你可以在进程外添加 if_CounterSum <= MemAddr(因为它会被连线)。