我需要在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?
答案 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;