将AHDL转VHDL:用Generate语句创建5组18位寄存器
用VHDL Generate语句实现多组18位寄存器
别担心,Generate语句其实没那么复杂,刚好能完美匹配你原来的AHDL逻辑。我帮你把代码改好,顺便把每一步的作用讲清楚:
首先得调整实体定义,因为你要创建4组(如果是5组的话后面我会说怎么加)18位寄存器,得把所有对应的输入输出、控制信号都明确出来:
entity setup_comp_reg is generic( NUM_BITS: integer := 18 ); -- 改成更直观的名字,对应18位宽度 port ( clk: in std_logic; iDATA: in std_logic_vector(NUM_BITS-1 downto 0); -- 对应原AHDL的iDATA输入总线 reg_reset: in std_logic; -- 原AHDL里的复位信号,注意要取反后作为清零端 iWR: in std_logic; -- 全局写使能信号 -- 四个寄存器组的独立使能控制信号 adBT: in std_logic; adSP: in std_logic; adLS: in std_logic; adHS: in std_logic; -- 四个寄存器组的18位输出总线 rg_bit_time: out std_logic_vector(NUM_BITS-1 downto 0); rg_sample_time: out std_logic_vector(NUM_BITS-1 downto 0); rg_low_sync: out std_logic_vector(NUM_BITS-1 downto 0); rg_hi_sync: out std_logic_vector(NUM_BITS-1 downto 0) -- 如果要加第5组,在这里补充对应的使能输入和输出总线即可 ); end setup_comp_reg;
接下来是架构部分,用Generate语句循环生成每一位的寄存器,完全对应你原AHDL的逻辑:
architecture rtl of setup_comp_reg is -- 先定义一个通用的1位带使能、异步清零的D触发器组件 component dffe is port ( clk: in std_logic; d: in std_logic; clrn: in std_logic; ena: in std_logic; q: out std_logic ); end component; begin -- 循环生成18位的所有寄存器组,i对应每一位的索引 gen_reg_banks: for i in 0 to NUM_BITS-1 generate -- 对应原AHDL的rg_bit_time[i] reg_bit_time: dffe port map( clk => clk, d => iDATA[i], clrn => not reg_reset, -- 原AHDL里用not reg_reset作为清零信号 ena => adBT and iWR, -- 对应原AHDL的adBT&iWR q => rg_bit_time[i] ); -- 对应原AHDL的rg_sample_time[i] reg_sample_time: dffe port map( clk => clk, d => iDATA[i], clrn => not reg_reset, ena => adSP and iWR, q => rg_sample_time[i] ); -- 对应原AHDL的rg_low_sync[i] reg_low_sync: dffe port map( clk => clk, d => iDATA[i], clrn => not reg_reset, ena => adLS and iWR, q => rg_low_sync[i] ); -- 对应原AHDL的rg_hi_sync[i] reg_hi_sync: dffe port map( clk => clk, d => iDATA[i], clrn => not reg_reset, ena => adHS and iWR, q => rg_hi_sync[i] ); -- 如果要加第5组寄存器,直接复制上面的模板,修改对应的信号名即可 end generate gen_reg_banks; end rtl;
关键细节说明:
- Generate语句的核心作用:
gen_reg_banks: for i in 0 to NUM_BITS-1 generate会自动循环18次(从0到17),每次循环为四个寄存器组各创建一位的D触发器,批量完成重复逻辑的编写。 - 组件复用:先定义通用的
dffe组件,避免重复写触发器的进程逻辑,让代码更整洁。如果不想单独定义组件,也可以把触发器的进程直接写在Generate块里,效果是一样的。 - 信号完全匹配原AHDL:清零信号取反、使能信号的逻辑与、数据输入输出的对应关系,都和你原来的AHDL代码完全一致,保证逻辑等价。
如果确实需要第5组寄存器,只需要在实体中补充对应的使能输入(比如adXXX)和输出总线(比如rg_xxx),然后在Generate循环里添加一个新的dffe实例就行,非常灵活。
内容的提问来源于stack exchange,提问作者Pedro Destri
相关产品推荐
相关产品推荐

