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

时间:2015-04-16 15:58:07

标签: vhdl 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?

2 个答案:

答案 0 :(得分:1)

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

凯文。

答案 1 :(得分:0)

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

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

通常认为100-200个逻辑单元更便宜&#34;比BlockRAM。但这主要取决于您的特定应用中哪种资源最为稀缺。

无论你是使用初始化的BlockRAM还是逻辑,我建议你将它建模为std_logic_vector数组,而不是使用case / when。 &#34; std_logic_vector&#34;数组;方法与平台无关,可以合成为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;