带BlockRAM的移位寄存器-XILINX

时间:2019-08-28 10:25:14

标签: vhdl

我对面向XILINX解决方案的VHDL还是很陌生。读XST manual(第155页),我看到了在BlockRAM上实现移位寄存器的示例。

entity srl_512_bram is 
  generic ( 
    LENGTH     : integer := 512; 
    ADDRWIDTH : integer := 9; 
    WIDTH      : integer := 8); 
 port ( 
    CLK        : in  std_logic; 
    SHIFT_IN  : in  std_logic_vector(WIDTH-1 downto 0); 
    SHIFT_OUT : out std_logic_vector(WIDTH-1 downto 0)); 
end srl_512_bram; 

architecture behavioral of srl_512_bram is 

  signal CNTR : std_logic_vector(ADDRWIDTH-1 downto 0); 
  signal SHIFT_TMP : std_logic_vector(WIDTH-1 downto 0); 
  type ram_type is array (0 to LENGTH-3) of std_logic_vector(WIDTH-1 downto 0); 
  signal RAM : ram_type := (others => (others => ’0’)); 
begin 

  counter : process (CLK) 
  begin 
    if CLK’event and CLK = ’1’ then 
       if CNTR = conv_std_logic_vector(LENGTH-3, ADDRWIDTH)  then 
         CNTR <= (others => ’0’); 
       else 
         CNTR <= CNTR + ’1’; 
       end if; 
    end if; 
  end process counter; 

  memory : process (CLK) 
  begin 
    if CLK’event and CLK = ’1’ then 
       RAM(conv_integer(CNTR)) <= SHIFT_IN; 
       SHIFT_TMP                 <= RAM(conv_integer(CNTR)); 
       SHIFT_OUT                 <= SHIFT_TMP; 
    end if; 
  end process memory; 

end behavioral;

我在那找到的几个问题:

  • 在设计(即合成)中/将包含BlockRAM到底有多明显?

  • 这是两个进程并行工作的过程,因此首先知道哪个进程都在CLK的正沿启动?

  • 我的观点是“内存”过程不提供移位,而是在“当前” RAM位置(以CNTR索引的位置)上进行SHIFT_IN向量插入。这段代码在哪里转移?

1 个答案:

答案 0 :(得分:1)

  

在设计(即合成)中/将包含BlockRAM到底有多明显?

Xilinx的

AR# 46515说,尝试UG627。这些参考可能并不完全是您正在使用的参考,可能已经过了几年,但是其中的概念很好。在UG627中,可以查看第170页附近的内容。这里有一些VHDL示例,说明了如何推断BRAM,它与您在此处的内容非常相似。

  

由于此处的两个进程并行工作,因此知道这两个进程都在CLK的正沿开始时,哪个进程将首先启动?

请记住,该VHDL变成了专用硬件,因此这两个过程在FPGA上都有自己的电路,并且可以合法地同时发生。当我学习VHDL时,这让我绊了很长时间-如果说实话,它仍然会让我时不时-因此,也许最好的方法实际上是模拟设计,然后尝试合理化VHDL是什么根据波形来做。

此外,我不想让您感到更加困惑,但这也许会有所帮助->您可以如下轻松地重新编写countermemory进程。在这种情况下,代码可能会按您期望的那样一次(顺序)处理一行,但是非常重要信号直到之后整个过程才进行物理更新完成。

counter_and_memory_combined : process (CLK) 
begin 
    if CLK’event and CLK = ’1’ then 
        -- From the counter process
        if CNTR = conv_std_logic_vector(LENGTH-3, ADDRWIDTH)  then 
            CNTR <= (others => ’0’); 
        else 
            CNTR <= CNTR + ’1’; 
        end if; 

        -- From the memory process
        RAM(conv_integer(CNTR)) <= SHIFT_IN; 
        SHIFT_TMP               <= RAM(conv_integer(CNTR)); 
        SHIFT_OUT               <= SHIFT_TMP; 
    end if; 
end process memory; 

有时候,当您像这样组合使用时,查看VHDL会更容易,尽管我绝对不是说这总是最好的方法。有时它会使代码更混乱。

  我的观点是,“内存”过程不提供移位,而是在“当前” RAM位置(以CNTR索引的位置)上进行SHIFT_IN向量插入。这段代码在哪里转移?

如果将SHIFT_IN重新标记为DATA_IN,并且将SHIFT_OUT重新标记为DATA_OUT(并且将SHIFT_TMP重新标记为DATA_TMP,则您发布的代码可能会更清晰)。因此,在这种情况下,“移位”意味着数据SHIFT_IN被存储到RAM中,而已经在RAM中的数据被移出到SHIFT_OUT