信号从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" 上工作了几个小时,我尝试过:
- 也将 +4 行更改为同步(进入进程)但问题仍然存在。
- 其他一些无效的东西。
我该如何修复那个 X?我已经测试了其他数字而不是 4,正如我猜到的,if_CounterSim 中的所有“1”都在分配后转换为“X”。
你没有包含所有的代码,所以下面是一个猜测。
问题可能是信号的 VHLD 解析的结果,因此相同信号的多个冲突驱动程序,例如 '0'
和 '1'
将导致 'X'
,但是 '0'
的两个驱动程序将导致 '0'
.
所以查找模块中所有分配了MemAddr
和if_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
(因为它会被连线)。
我正在开发一个程序计数器,它必须在 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" 上工作了几个小时,我尝试过:
- 也将 +4 行更改为同步(进入进程)但问题仍然存在。
- 其他一些无效的东西。
我该如何修复那个 X?我已经测试了其他数字而不是 4,正如我猜到的,if_CounterSim 中的所有“1”都在分配后转换为“X”。
你没有包含所有的代码,所以下面是一个猜测。
问题可能是信号的 VHLD 解析的结果,因此相同信号的多个冲突驱动程序,例如 '0'
和 '1'
将导致 'X'
,但是 '0'
的两个驱动程序将导致 '0'
.
所以查找模块中所有分配了MemAddr
和if_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
(因为它会被连线)。