繁体   English   中英

如何在FPGA中正确存储寄存器

[英]How to correctly storage registers in an FPGA

我需要在VHDL中编写一个程序,该程序使用i2c初始化传感器寄存器。 我的问题是编写一种不会浪费所有FPGA空间的高效程序。 我需要存储的寄存器数量是400个寄存器,由8位地址和8位数据组成。

我写的程序是:

entity i2cReg is
    port (
            RegSel : in std_logic;
            Address : out std_logic_vector (15 downto 0);
            Data : out std_logic_vector (7 downto 0);
            RegStop : out std_logic;
            ModuleEN : in std_logic
    );
end i2cReg;

architecture i2cReg_archi of i2cReg is
    signal counter :integer := 0;

    begin
        process(RegSel, ModuleEN)
        begin
            if ModuleEN = '0' then
                    Address <= x"10";  
                    Data <= x"10";
                    RegStop <= '0';
                    counter <= 0;
            elsif rising_edge(RegSel) then
                counter <= counter + 1;
                case counter is
                    when 0 =>
                     Address <= x"10";
                     Data <= x"10";
                    when 1 =>
                     Address <= x"10";
                     Data <= x"10";
                    when 2 =>
                     Address <= x"10";
                     Data <= x"10";
                    when 3 =>
                     Address <= x"10";
                     Data <= x"10";
                    when 4 =>
                     Address <= x"10";
                     Data <= x"10";
                    when 5 =>
                     Address <= x"10";
                     Data <= x"10";
                    when 400 =>
                        RegStop <= '1';
                    when others =>
                end case;
            end if;
        end process;

end i2cReg_archi;

有没有一种方法可以优化此代码? 或者您建议我使用外部eeprom?

Yaro-您没有提到FPGA供应商或设备,但答案是:是的,您可以在FPGA中初始化ROM,以便在配置后显示所需的值。 Altera和Xilinx都允许您在合成期间为文件提供初始值。

凯文。

如果您在Xilinx或Altera上,初始化的BlockRAM通常是正确的解决方案。

但是在某些情况下,逻辑实现也可以起作用:例如,如果您400个寄存器的内容具有重复模式或许多具有相同值的寄存器(例如您的示例代码中)。 在这种情况下,如果将其实现为逻辑,则综合工具将对其进行优化。 如果寄存器的内容非常重复,您实际上可能会得到很少的逻辑。 有时还可以通过对寄存器进行巧妙的重新排序来改善优化。

100-200个逻辑单元通常被认为比BlockRAM更“便宜”。 但这主要取决于特定应用程序中最稀缺的资源。

无论您要使用初始化的BlockRAM还是逻辑,我都建议您将其建模为std_logic_vector数组,而不要使用case / when。 “ std_logic_vector数组”方法与平台无关,可以合成为BlockRAM或逻辑。 您的综合工具通常会尝试自动选择最佳实施。 但是您也可以通过使用供应商特定的属性来强制合成工具使用逻辑或BlockRAM。 (由于我不知道您使用的是哪个平台,所以我无法告诉您要使用的属性)

例:

type REG_TYPE is array (0 to 3) of std_logic_vector(15 downto 0);
constant REGISTERS : REG_TYPE :=
    (x"0000",
     x"0001",
     x"0010",
     x"0100");

在您的过程中,类似:

if rising_edge(RegSel) then
    Address <= REGISTERS( counter )(15 downto 8);
    Data    <= REGISTERS( counter )( 7 downto 0);
end if;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM