我正在开发一个程序计数器,必须在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)
我已经在这个“简单”的事情上工作了几个小时,我试过了:
如何修复X?我已经测试了其他数字而不是4,因为我猜测if_CounterSim中的所有'1'在转移后在'X'中转换。
答案 0 :(得分:1)
您尚未包含所有代码,因此以下是猜测。
问题可能是信号的VHLD分辨率的结果,因此同一信号的多个冲突驱动程序(例如'0'
和'1'
将导致'X'
,但是'0'
的两个驱动程序将生成'0'
。
请查看模块中分配了MemAddr
和if_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
(因为它会被连线)。