我在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;
答案 0 :(得分:0)
此:
if RST_N_CORE = '0' then
address_int <= unsigned(aMaxWords)
描述了异步重置 - 因此aMaxWords
将被合成器视为异步,无论它是否是异步。
合成器将您的代码解释为“当rst_n_core为低时,将aMaxWords的值复制到address_int”,因此如果aMaxWords在重置期间发生更改,则必须复制该值。灵敏度列表中缺少该信号意味着合成器正在制作一个与语言应该表现不同的电路,因此警告。
确实不应该这样做:没有灵敏度列表中的信号,它应该在复位线的下降沿捕获信号。但由于大多数芯片不起作用,合成器设计师(他们无限的智慧)多年前决定假设设计师打算在敏感度列表中包含该信号,并发出警告,而不是说“这不行,修好”。那么你得到的代码在模拟和综合中的工作方式不同。结束咆哮。
答案 1 :(得分:-1)
您的重置代码:
if RST_N_CORE = '0' then
address_int <= unsigned(aMaxWords);
错了。复位的定义是将电路设置为已知状态。但是你的代码将它分配给一个信号。您应该将其指定为所有0
或全部1
以进行重置,或者您的aMaxWords
必须常量(请注意,您的合成器可能不足以知道已知的智能它,然后应该将其指定为常量):
if RST_N_CORE = '0' then
address_int <= (others => '0');
或
if RST_N_CORE = '0' then
address_int <= (others => '1');