You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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;

关键细节说明:

  1. Generate语句的核心作用:gen_reg_banks: for i in 0 to NUM_BITS-1 generate 会自动循环18次(从0到17),每次循环为四个寄存器组各创建一位的D触发器,批量完成重复逻辑的编写。
  2. 组件复用:先定义通用的dffe组件,避免重复写触发器的进程逻辑,让代码更整洁。如果不想单独定义组件,也可以把触发器的进程直接写在Generate块里,效果是一样的。
  3. 信号完全匹配原AHDL:清零信号取反、使能信号的逻辑与、数据输入输出的对应关系,都和你原来的AHDL代码完全一致,保证逻辑等价。

如果确实需要第5组寄存器,只需要在实体中补充对应的使能输入(比如adXXX)和输出总线(比如rg_xxx),然后在Generate循环里添加一个新的dffe实例就行,非常灵活。

内容的提问来源于stack exchange,提问作者Pedro Destri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:40:21