我对面向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向量插入。这段代码在哪里转移?
答案 0 :(得分:1)
Xilinx的在设计(即合成)中/将包含BlockRAM到底有多明显?
AR# 46515说,尝试UG627。这些参考可能并不完全是您正在使用的参考,可能已经过了几年,但是其中的概念很好。在UG627中,可以查看第170页附近的内容。这里有一些VHDL示例,说明了如何推断BRAM,它与您在此处的内容非常相似。
由于此处的两个进程并行工作,因此知道这两个进程都在CLK的正沿开始时,哪个进程将首先启动?
请记住,该VHDL变成了专用硬件,因此这两个过程在FPGA上都有自己的电路,并且可以合法地同时发生。当我学习VHDL时,这让我绊了很长时间-如果说实话,它仍然会让我时不时-因此,也许最好的方法实际上是模拟设计,然后尝试合理化VHDL是什么根据波形来做。
此外,我不想让您感到更加困惑,但这也许会有所帮助->您可以如下轻松地重新编写counter
和memory
进程。在这种情况下,代码可能会按您期望的那样一次(顺序)处理一行,但是非常重要信号直到之后整个过程才进行物理更新完成。
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
。>