1

我在 VHDL 顺序过程中有一个地址计数器。它的空闲值在配置寄存器中设置为某个最大值;之后,只要它进入某个状态,它就应该加一。

为了获得最大值,我将输入 std_logic_vector 的子集声明为别名。

我将 address_int 声明为无符号变量。然后,我在敏感度列表中定义了一个带有 clk 和 reset 的顺序过程。当复位有效时,地址计数器设置为别名值。释放复位后,计数器在处于特定状态时在上升沿翻转/递增。

综合工具给了我这个消息:*WARNING:Xst:819 line 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;
4

2 回答 2

0

这:

if RST_N_CORE = '0' then
    address_int <= unsigned(aMaxWords)

描述了一个异步复位——因此aMaxWords无论是否同步,合成器都将其视为异步。

合成器将您的代码解释为“当 rst_n_core 为低时,将 aMaxWords 的值复制到 address_int”,因此如果 aMaxWords 在重置期间发生更改,则必须复制该值。您的灵敏度列表中缺少该信号意味着合成器正在制作的电路与语言所说的行为不同,因此会发出警告。


它真的不应该这样做:没有灵敏度列表中的信号,它应该在复位线的下降沿捕获信号。但由于大多数芯片不是这样工作的,合成器设计者(以他们无限的智慧)多年前决定假设设计者打算将该信号放在灵敏度列表中,并发出警告,而不是说“这行不通, 修理它”。因此,您将获得在模拟和综合中工作方式不同的代码。结束吐槽。

于 2012-11-05T15:20:05.623 回答
-1

您的重置代码:

if RST_N_CORE = '0' then
    address_int <= unsigned(aMaxWords);

是错的。复位的定义是将您的电路设置为已知状态。但是您的代码将其分配给信号。您应该将其分配为 all0或 all1以进行重置,或者您aMaxWords必须是常量(请注意,您的合成器可能没有足够的智能来知道它,然后应该将其分配为常量):

if RST_N_CORE = '0' then
    address_int <= (others => '0');

或者

if RST_N_CORE = '0' then
    address_int <= (others => '1');
于 2012-11-02T05:52:30.117 回答