信号从0100变为0X00

时间:2016-10-12 12:26:37

标签: vhdl processor program-counter

我正在开发一个程序计数器,必须在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. 其他一些没用的东西。
  3. 如何修复X?我已经测试了其他数字而不是4,因为我猜测if_CounterSim中的所有'1'在转移后在'X'中转换。

2 个答案:

答案 0 :(得分:1)

您尚未包含所有代码,因此以下是猜测。

问题可能是信号的VHLD分辨率的结果,因此同一信号的多个冲突驱动程序(例如'0''1'将导致'X',但是'0'的两个驱动程序将生成'0'

请查看模块中分配了MemAddrif_CounterSum的所有位置,并删除那些不必要的分配。

答案 1 :(得分: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(因为它会被连线)。