news 2026/4/3 6:23:51

常用Verilog模板

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
常用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

单拍下降沿检测模块

`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

`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_xxx[1]

`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

多比特总线双拍同步模块

`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

参数化计数器

`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 状态机

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

`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 状态机

依赖 当前状态 + 当前输入

`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 波生

`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

单拍脉冲生成

`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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/2 23:56:10

【高并发系统稳定性保障】:PHP+Redis缓存过期设计的7个黄金法则

第一章&#xff1a;高并发场景下缓存过期的核心挑战在高并发系统中&#xff0c;缓存是提升性能的关键组件&#xff0c;但缓存过期策略的设计却面临严峻挑战。不当的过期机制可能导致缓存雪崩、穿透和击穿等问题&#xff0c;严重时会直接拖垮后端数据库。缓存雪崩 当大量缓存数据…

作者头像 李华
网站建设 2026/3/31 17:44:30

Claude Code创始人13个实战技巧,收藏这篇就够了!

昨晚&#xff0c;Claude Code 创始人 Boris Cherny 在X上首次公开了他的个人Claude Code使用技巧。 以下是 Boris 的原文&#xff0c;Datawhale团队翻译&#xff1a; 我是 Boris&#xff0c;Claude Code 的创造者。不少人问起我是如何使用 Claude Code 的&#xff0c;那我就来…

作者头像 李华
网站建设 2026/3/31 23:40:28

【PHP服务监控实战指南】:从零搭建高效数据采集系统

第一章&#xff1a;PHP服务监控数据采集概述在现代Web应用运维中&#xff0c;对PHP服务的运行状态进行实时监控是保障系统稳定性与性能优化的关键环节。数据采集作为监控体系的基础层&#xff0c;负责从PHP应用及其运行环境中提取关键指标&#xff0c;如请求响应时间、内存使用…

作者头像 李华
网站建设 2026/3/31 19:40:18

【PHP智能家居设备联动实战指南】:掌握多设备协同控制的5大核心技巧

第一章&#xff1a;PHP智能家居设备联动概述随着物联网技术的发展&#xff0c;智能家居系统逐渐从独立控制走向多设备协同。PHP 作为一种广泛应用于 Web 后端开发的脚本语言&#xff0c;凭借其灵活的扩展性和成熟的框架生态&#xff0c;正被越来越多地用于构建智能家居的中央控…

作者头像 李华
网站建设 2026/3/19 2:27:19

DaVinci Resolve联动:HeyGem生成片段直接调色

DaVinci Resolve联动&#xff1a;HeyGem生成片段直接调色 在数字内容生产节奏日益加快的今天&#xff0c;企业培训视频、产品讲解短片和知识类短视频的需求呈爆发式增长。传统制作流程中&#xff0c;一个口型同步的讲解视频往往需要配音、拍摄、剪辑、调色多个环节协作完成&…

作者头像 李华
网站建设 2026/4/2 13:43:25

PHP跨域问题深度解析(预检请求全攻略)

第一章&#xff1a;PHP跨域问题深度解析&#xff08;预检请求全攻略&#xff09;在现代Web开发中&#xff0c;前端与后端分离架构日益普及&#xff0c;跨域请求成为常见场景。当浏览器发起非简单请求&#xff08;如携带自定义头部或使用PUT、DELETE方法&#xff09;时&#xff…

作者头像 李华