我在VHDL顺序过程中有一个地址计数器 . 其空闲值在配置寄存器中设置为某个最大值;之后,只要它进入某个状态,它就应该增加一个 .
为了获得最大值,我将输入std_logic_vector的子集声明为别名 .
我将address_int声明为无符号变量 . 然后,我在灵敏度列表中使用clk和重置定义了一个顺序过程 . 当复位被置位时,地址计数器被设置为别名值 . 复位释放后,当处于某种状态时,计数器在上升沿上翻转/递增 .
综合工具给出了以下消息:*警告:Xst:819 134行:过程灵敏度列表中缺少以下信号:DL_CADU_SIZE *
并且所有地址线都成为异步信号!这里发生了什么?是否有一些奇怪的无符号行为,整数不会出现?我通常在这里使用整数,但是为了代码维护,转换似乎更简单 . 我试过抛弃别名并进行直接转换,但它没有帮助 .
library IEEE;
use ieee.std_logic_1164.a
use ieee.numeric_std.all;
-- entity declaration, ports, architecture, etc.
signal address_int : unsigned(8 downto 0);
alias aMaxWords : std_logic_vector(8 downto 0) is DL_CADU_SIZE(10 downto 2);
begin
WADDR <= std_logic_vector(address_int);
OUT_PROC: process (CLK_CORE, RST_N_CORE)
begin
if RST_N_CORE = '0' then
address_int <= unsigned(aMaxWords);
elsif rising_edge(CLK_CORE) then
if next_state = WRITE_WORD then
if address_int = unsigned(aMaxWords) then
address_int <= (others => '0');
else
address_int <= address_int + 1;
end if;
end if; -- WRITE_WORD
end if; -- rising_edge
end process OUT_PROC;
end RTL;
2 回答
这个:
描述了异步复位 - 因此
aMaxWords
将被合成器视为异步,无论它是否存在 .合成器将您的代码解释为“当rst_n_core为低时,将aMaxWords的值复制到address_int”,因此如果aMaxWords在重置期间发生更改,则必须复制该值 . 灵敏度列表中缺少该信号意味着合成器正在制作一种电路,其行为与语言应该表达的不同,因此警告 .
它真的不应该是大多数芯片工作的方式,合成器设计师(他们的无限智慧)多年前决定假设设计师打算在灵敏度列表中包含该信号,并发出警告,而不是说"this can't work, fix it" . 那么你得到的代码在模拟和综合中的工作方式不同 . 结束咆哮 .
你的重置代码:
是错的 . 复位的定义是将电路设置为已知状态 . 但是你的代码将它分配给一个信号 . 您应该将其指定为全部
0
或全部1
以进行重置,或者您的aMaxWords
必须是 constant (请注意,您的合成器可能没有足够的智能,因此应将其指定为常量):要么