VHDL寄存器文件的微小变化导致总逻辑元素的巨大差异

时间:2014-03-13 19:15:07

标签: vhdl

我是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;

1 个答案:

答案 0 :(得分:0)

您需要研究您正在使用的FPGA架构。当您需要大容量内存时,您很可能希望使用设备专用RAM块,在Xilinx中称为Block RAM。 Block RAM具有特定的结构 - 特别是在时钟边缘与异步(组合)的读写方面。如果你的代码匹配它,它将使用Block RAM和其他很少的逻辑。如果您的代码与Block RAM不匹配,那么您将使用逻辑单元格。

进一步查看您的报告,并查看每个案例中有关Block RAM使用情况的报告。查看Xilinx有关Block RAM结构的文档。