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



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

我写的程序是:

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_vvector的数组,而不是使用case/when。"std_logic_vvector数组"方法是独立于平台的,可以合成为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;

最新更新