0

我正在研究必须在 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)

我已经在这个“简单”的事情上工作了几个小时,我尝试过:

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

我怎样才能修复那个X?我已经测试了其他数字而不是 4,并且我猜想 if_CounterSim 中的所有 '1' 在分配后都转换为 'X'。

4

2 回答 2

1

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

问题可能是信号的 VHLD 分辨率的结果,即相同信号的多个冲突驱动程序,例如两者'0''1'将导致'X',但其中两个驱动程序'0'将导致'0'

因此,查找模块中分配和分配的所有位置MemAddrif_CounterSum并删除那些不必要的分配。

于 2016-10-12T12:34:34.957 回答
0

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

在你的情况下,我建议你把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在进程之外添加(因为它是有线的)。

于 2016-10-12T12:38:49.173 回答