我是VHDL的新手,我的一项任务是创建一个8位寄存器文件。我注意到,通过更改单行代码,我可以显着增加或减少逻辑元素的总数。我试图理解为什么这会导致如此重大的变化。
当enable
为高时,寄存器文件将dataIn
的值存储在selectWrite
的位置。 dataOut
显示存储在selectRead
。
如果dataOut <= entry(readIndex);
位于process(clock)
内,则使用的逻辑元素总数为:
Total logical elements: 9/33,216 ( < 1% )
Total combinatorial functions 9/33,216 ( < 1% )
Dedicated logic registers 0/33,216 ( 0% )
但是,如果dataOut <= entry(readIndex);
位于process(clock)
之外,则会使用更多逻辑元素:
Total logical elements: 2,672/33,216 ( 8% )
Total combinatorial functions 1,656/33,216 ( 5% )
Dedicated logic registers 2,048/33,216 ( 6% )
我了解当置于process(clock)
内时,dataOut
只会在时钟边缘发生变化,而当置于process(clock)
之外时,dataOut
会无法预测地发生变化。< / p>
为什么这种改变会导致使用更多逻辑元素?
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity RegisterFile is
port(
clock : in std_logic;
reset : in std_logic;
dataIn : in std_logic_vector(7 downto 0);
enable : in std_logic;
selectRead : in std_logic_vector(7 downto 0);
selectWrite : in std_logic_vector(7 downto 0);
dataOut : out std_logic_vector(7 downto 0)
);
end RegisterFile;
architecture RegisterFileArchitecture of RegisterFile is
type RegisterEntry is array (0 to 255) of std_logic_vector(7 downto 0);
signal entry : RegisterEntry;
signal readIndex : integer;
signal writeIndex : integer;
begin
-- Update read/write indices
readIndex <= to_integer(unsigned(selectRead));
writeIndex <= to_integer(unsigned(selectWrite));
process(clock)
begin
if (rising_edge(clock)) then
-- Update selected data
dataOut <= entry(readIndex);
if (reset = '1') then
entry(writeIndex) <= "00000000";
elsif (enable = '1') then
entry(writeIndex) <= dataIn;
end if;
end if;
end process;
end RegisterFileArchitecture;
答案 0 :(得分:0)
您需要研究您正在使用的FPGA架构。当您需要大容量内存时,您很可能希望使用设备专用RAM块,在Xilinx中称为Block RAM。 Block RAM具有特定的结构 - 特别是在时钟边缘与异步(组合)的读写方面。如果你的代码匹配它,它将使用Block RAM和其他很少的逻辑。如果您的代码与Block RAM不匹配,那么您将使用逻辑单元格。
进一步查看您的报告,并查看每个案例中有关Block RAM使用情况的报告。查看Xilinx有关Block RAM结构的文档。