常用Verilog模板

单拍上升沿检测模块

verilog 复制代码
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Module Name: edge_detect_pos_xxx
// Description: 上升沿检测模块(单拍触发),信号占位符为 xxx
/*
edge_detect_pos_xxx u_edge_rpc_start (
    .i_clk(i_clk),
    .i_rst_n(i_rst_n),
    .i_xxx(i_rpc_start),
    .o_xxx_pos(w_rpc_start_posedge)
);
*/
//////////////////////////////////////////////////////////////////////////////////
module edge_detect_pos_xxx (
    input  wire i_clk,       // 时钟
    input  wire i_rst_n,     // 异步复位,低有效
    input  wire i_xxx,       // 待检测信号
    output wire o_xxx_pos    // 上升沿脉冲输出(宽度1拍)
);

    // --------------------------
    // 延迟一拍寄存器,用于检测上升沿
    // --------------------------
    reg r_xxx_dly;

    always @(posedge i_clk or negedge i_rst_n) begin
        if (!i_rst_n)
            r_xxx_dly <= 1'b0;
        else
            r_xxx_dly <= i_xxx;
    end

    // --------------------------
    // 上升沿检测输出
    // --------------------------
    assign o_xxx_pos = i_xxx && !r_xxx_dly;

endmodule

单拍下降沿检测模块

verilog 复制代码
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Module Name: edge_detect_neg_xxx
// Description: 下降沿检测模块(单拍触发),信号占位符为 xxx
/*
edge_detect_neg_xxx u_edge_signal (
    .i_clk(i_clk),
    .i_rst_n(i_rst_n),
    .i_xxx(i_signal),
    .o_xxx_neg(w_signal_negedge)
);
*/
//////////////////////////////////////////////////////////////////////////////////
module edge_detect_neg_xxx (
    input  wire i_clk,
    input  wire i_rst_n,
    input  wire i_xxx,
    output wire o_xxx_neg
);

    // --------------------------
    // 延迟一拍寄存器
    // --------------------------
    reg r_xxx_dly;

    always @(posedge i_clk or negedge i_rst_n) begin
        if (!i_rst_n)
            r_xxx_dly <= 1'b0;
        else
            r_xxx_dly <= i_xxx;
    end

    // --------------------------
    // 下降沿检测输出
    // --------------------------
    assign o_xxx_neg = !i_xxx && r_xxx_dly;

endmodule

单比特双拍同步模块1

verilog 复制代码
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Module Name: sync_2stage_bit_xxx
// Description: 单线(单比特)双拍同步模块,占位符信号 xxx
/*
sync_2stage_bit_xxx u_sync_signal (
    .i_clk(i_clk),
    .i_rst_n(i_rst_n),
    .i_xxx(i_async_sig),
    .o_xxx_sync(w_sig_sync)
);
*/
//////////////////////////////////////////////////////////////////////////////////
module sync_2stage_bit_xxx (
    input  wire i_clk,       // 时钟
    input  wire i_rst_n,     // 异步复位,低有效
    input  wire i_xxx,       // 异步输入信号
    output reg  o_xxx_sync   // 同步输出信号
);

    // --------------------------
    // 两拍同步寄存器
    // --------------------------
    reg r_xxx_stage1;

    always @(posedge i_clk or negedge i_rst_n) begin
        if (!i_rst_n) begin
            r_xxx_stage1 <= 1'b0;
            o_xxx_sync   <= 1'b0;
        end else begin
            r_xxx_stage1 <= i_xxx;
            o_xxx_sync   <= r_xxx_stage1;
        end
    end

endmodule

单比特双拍同步模块2

可能含亚稳态,别用最新的r_xxx,应次新的r_xxx1

verilog 复制代码
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Module Name: sync_2stage_bit_xxx
// Description: 单线异步信号双拍同步(打两拍获取稳定值)示例,占位符信号 xxx
/*
sync_2stage_bit_xxx u_sync (
    .i_clk(i_clk),
    .i_rst_n(i_rst_n),
    .i_xxx(i_key),
    .o_xxx_sync(o_key_sync)
);
*/
//////////////////////////////////////////////////////////////////////////////////
module sync_2stage_bit_xxx (
    input  wire i_clk,      // 时钟
    input  wire i_rst_n,    // 异步复位,低有效
    input  wire i_xxx,      // 异步输入信号
    output wire o_xxx_sync  // 双拍稳定输出
);

    // --------------------------
    // 双拍同步寄存器
    // --------------------------
    reg [1:0] r_xxx;

    always @(posedge i_clk or negedge i_rst_n) begin
        if (!i_rst_n)
            r_xxx <= 2'b00;        // 复位输出
        else
            r_xxx <= {r_xxx[0], i_xxx};  // 打两拍
    end

    // --------------------------
    // 稳定输出
    // --------------------------
    assign o_xxx_sync = r_xxx[1];

endmodule

多比特总线双拍同步模块

verilog 复制代码
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Module Name: sync_2stage_bus_xxx
// Description: 多比特总线双拍同步模块,占位符信号 xxx
/*
sync_2stage_bus_xxx #(
    .WIDTH(8)
) u_sync_bus (
    .i_clk(i_clk),
    .i_rst_n(i_rst_n),
    .i_xxx(i_async_bus),
    .o_xxx_sync(w_bus_sync)
);
*/
//////////////////////////////////////////////////////////////////////////////////
module sync_2stage_bus_xxx #(
    parameter WIDTH = 8           // 总线宽度
)(
    input  wire             i_clk,           // 时钟
    input  wire             i_rst_n,         // 异步复位,低有效
    input  wire [WIDTH-1:0] i_xxx,          // 异步输入总线
    output reg  [WIDTH-1:0] o_xxx_sync      // 同步输出总线
);

    // --------------------------
    // 两拍同步寄存器
    // --------------------------
    reg [WIDTH-1:0] r_xxx_stage1;

    always @(posedge i_clk or negedge i_rst_n) begin
        if (!i_rst_n) begin
            r_xxx_stage1 <= {WIDTH{1'b0}};
            o_xxx_sync   <= {WIDTH{1'b0}};
        end else begin
            r_xxx_stage1 <= i_xxx;
            o_xxx_sync   <= r_xxx_stage1;
        end
    end

endmodule

参数化计数器

verilog 复制代码
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Module Name: counter_xxx
// Description: 参数化计数器,可回绕计数,占位符信号 xxx
/*
counter_xxx #(
    .WIDTH(8),
    .MAX(255)
) u_counter (
    .i_clk(i_clk),
    .i_rst_n(i_rst_n),
    .i_en(i_cnt_en),
    .o_cnt(o_cnt),
    .o_tc(w_tc)
);
*/
//////////////////////////////////////////////////////////////////////////////////
module counter_xxx #(
    parameter WIDTH = 8,
    parameter MAX   = 255
)(
    input  wire           i_clk,   // 时钟
    input  wire           i_rst_n, // 异步复位,低有效
    input  wire           i_en,    // 计数使能
    output reg  [WIDTH-1:0] o_cnt, // 当前计数值
    output wire           o_tc     // 终点触发信号
);

    // --------------------------
    // 终点触发
    // --------------------------
    assign o_tc = (o_cnt == MAX);

    // --------------------------
    // 计数器逻辑
    // --------------------------
    always @(posedge i_clk or negedge i_rst_n) begin
        if (!i_rst_n)
            o_cnt <= {WIDTH{1'b0}};
        else if (i_en) begin
            if (o_cnt == MAX)
                o_cnt <= {WIDTH{1'b0}};
            else
                o_cnt <= o_cnt + 1'b1;
        end
    end

endmodule

Moore 状态机

只依赖 当前状态,与输入无关

verilog 复制代码
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Module Name: fsm_moore_xxx
// Description: Moore 状态机模板,占位符信号 xxx
/*
fsm_moore_xxx u_fsm (
    .i_clk(i_clk),
    .i_rst_n(i_rst_n),
    .i_start(i_start),
    .o_state(o_state),
    .o_done(w_done)
);
*/
//////////////////////////////////////////////////////////////////////////////////
module fsm_moore_xxx #(
    parameter WIDTH = 3           // 状态编码宽度
)(
    input  wire           i_clk,    // 时钟
    input  wire           i_rst_n,  // 异步复位,低有效
    input  wire           i_start,  // 启动信号
    output reg  [WIDTH-1:0] o_state,// 状态输出
    output reg            o_done    // 完成信号
);

    // --------------------------
    // 状态定义(S_开头)
    // --------------------------
    localparam S_IDLE  = 3'b000,
               S_RUN   = 3'b001,
               S_WAIT  = 3'b010,
               S_FIN   = 3'b011,
               S_ERROR = 3'b100; // 可扩展其他状态

    // --------------------------
    // 状态寄存器逻辑
    // --------------------------
    always @(posedge i_clk or negedge i_rst_n) begin
        if (!i_rst_n)
            o_state <= S_IDLE;
        else begin
            case(o_state)
                S_IDLE:  o_state <= i_start ? S_RUN : S_IDLE;
                S_RUN:   o_state <= S_WAIT;
                S_WAIT:  o_state <= S_FIN;
                S_FIN:   o_state <= S_IDLE;
                S_ERROR: o_state <= S_IDLE;
                default: o_state <= S_IDLE;
            endcase
        end
    end

    // --------------------------
    // 输出逻辑
    // --------------------------
    always @(*) begin
        o_done = (o_state == S_FIN);
    end

endmodule

Mealy 状态机

依赖 当前状态 + 当前输入

verilog 复制代码
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Module Name: fsm_mealy_xxx
// Description: Mealy 状态机模板,占位符信号 xxx
/*
fsm_mealy_xxx u_fsm_mealy (
    .i_clk(i_clk),
    .i_rst_n(i_rst_n),
    .i_start(i_start),
    .i_ack(i_ack),
    .o_state(o_state),
    .o_done(o_done)
);
*/
//////////////////////////////////////////////////////////////////////////////////
module fsm_mealy_xxx #(
    parameter WIDTH = 3           // 状态编码宽度
)(
    input  wire           i_clk,     // 时钟
    input  wire           i_rst_n,   // 异步复位,低有效
    input  wire           i_start,   // 启动信号
    input  wire           i_ack,     // 输入信号(影响输出)
    output reg  [WIDTH-1:0] o_state, // 当前状态
    output wire           o_done     // Mealy 输出
);

    // --------------------------
    // 状态定义(S_开头)
    // --------------------------
    localparam S_IDLE  = 3'b000,
               S_RUN   = 3'b001,
               S_WAIT  = 3'b010,
               S_FIN   = 3'b011,
               S_ERROR = 3'b100; // 可扩展其他状态

    // --------------------------
    // 状态寄存器逻辑
    // --------------------------
    always @(posedge i_clk or negedge i_rst_n) begin
        if (!i_rst_n)
            o_state <= S_IDLE;
        else begin
            case(o_state)
                S_IDLE:  o_state <= i_start ? S_RUN : S_IDLE;
                S_RUN:   o_state <= S_WAIT;
                S_WAIT:  o_state <= i_ack ? S_FIN : S_WAIT;
                S_FIN:   o_state <= S_IDLE;
                S_ERROR: o_state <= S_IDLE;
                default: o_state <= S_IDLE;
            endcase
        end
    end

    // --------------------------
    // Mealy 输出逻辑(依赖状态 + 输入)
    // --------------------------
    assign o_done = (o_state == S_WAIT) && i_ack; // 当 WAIT 状态且 i_ack=1 时输出脉冲
endmodule

PWM 波生

verilog 复制代码
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Module Name: pwm_gen_xxx
// Description: 占空比可调 PWM 生成,占位符信号 xxx
/*
pwm_gen_xxx #(
    .WIDTH(8)
) u_pwm (
    .i_clk(i_clk),
    .i_rst_n(i_rst_n),
    .i_duty(i_duty),
    .o_pwm(o_pwm)
);
*/
//////////////////////////////////////////////////////////////////////////////////
module pwm_gen_xxx #(
    parameter WIDTH = 8
)(
    input  wire           i_clk,
    input  wire           i_rst_n,
    input  wire [WIDTH-1:0] i_duty, // 占空比
    output reg            o_pwm
);

    reg [WIDTH-1:0] r_cnt;

    always @(posedge i_clk or negedge i_rst_n) begin
        if (!i_rst_n)
            r_cnt <= {WIDTH{1'b0}};
        else
            r_cnt <= r_cnt + 1'b1;
    end

    always @(posedge i_clk or negedge i_rst_n) begin
        if (!i_rst_n)
            o_pwm <= 1'b0;
        else
            o_pwm <= (r_cnt < i_duty);
    end

endmodule

单拍脉冲生成

verilog 复制代码
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Module Name: pulse_gen_xxx
// Description: 单拍脉冲生成模块,占位符信号 xxx
/*
pulse_gen_xxx u_pulse_gen (
    .i_clk(i_clk),
    .i_rst_n(i_rst_n),
    .i_trig(i_trig),
    .o_pulse(w_pulse)
);
*/
//////////////////////////////////////////////////////////////////////////////////
module pulse_gen_xxx (
    input  wire i_clk,
    input  wire i_rst_n,
    input  wire i_trig,
    output wire o_pulse
);

    // --------------------------
    // 延迟一拍
    // --------------------------
    reg r_trig_dly;

    always @(posedge i_clk or negedge i_rst_n) begin
        if (!i_rst_n)
            r_trig_dly <= 1'b0;
        else
            r_trig_dly <= i_trig;
    end

    // --------------------------
    // 输出单拍脉冲
    // --------------------------
    assign o_pulse = i_trig && !r_trig_dly;

endmodule
相关推荐
FPGA小迷弟3 小时前
FPGA 与卫星:从星载硬件到在轨智能的完整技术解析
fpga开发·架构·fpga·1024程序员节·无线电
NamoAmitabha1284 小时前
CPU 内部结构是什么?---deepseek
fpga开发
abc light5 小时前
ARM 裸机开发(6)——时钟树与定时器
arm开发·单片机·fpga开发
1560820721919 小时前
JFMZQ28DR、JFMZQ68DR、RFsoc XCZU47DR、XCZU48DR 信号处理板
fpga开发·信号处理
XMAIPC_Robot21 小时前
-40~85℃宽温实测:RK3588 机器人控制器硬件底座,长时间 SLAM 定位稳定性验证
人工智能·fpga开发·机器人·边缘计算·arm+fpga·rk3588+fpga
樱木花道長1 天前
AMD Ross 深度系列 8:FAQ 七问七答(文末附网盘链接)
人工智能·fpga开发
FPGA小迷弟1 天前
FPGA 与无人机:从飞控实时性到智能载荷的硬件加速实践
人工智能·ai·fpga开发·架构·无人机·ai编程
低慢小uav1 天前
(已解决)Zynq芯片lwip协议栈,使用tcp作为服务器Service,接收大量数据时,长度接收正常,接收对数据校验,校验和异常分析
网络协议·tcp/ip·fpga开发
szxinmai主板定制专家1 天前
ARM+FPGA 数控机床控制器:选 CODESYS SoftMotion CNC,还是基于 LinuxCNC 自研搭建?架构、授权、实时性、量产风险深度对比
arm开发·fpga开发·codesys·数据采集卡·linuxcnc·rk3576
女神下凡1 天前
芯参谋(79):嵌入式学习进阶_(硬件与软件)深入实践指南
arm开发·单片机·嵌入式硬件·学习·fpga开发·设计规范