news 2026/3/16 11:51:57

常用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/3/13 5:52:47

Zoom webinar后自动生成回顾视频:HeyGem插件设想

Zoom Webinar后自动生成回顾视频&#xff1a;基于HeyGem的自动化内容生产实践 在企业线上活动日益频繁的今天&#xff0c;一场成功的Zoom Webinar结束后&#xff0c;真正考验才刚刚开始——如何让这场耗时数小时准备的内容&#xff0c;不只是沉睡在云端录屏里&#xff1f;很多团…

作者头像 李华
网站建设 2026/3/4 1:44:10

流式语音合成实战:GLM-TTS在实时应用中的性能表现分析

流式语音合成实战&#xff1a;GLM-TTS在实时应用中的性能表现分析 如今&#xff0c;用户对语音交互的期待早已超越“能听清”&#xff0c;转向“像人一样自然”。无论是智能客服中一句带情绪的安抚&#xff0c;还是虚拟主播用特定音色即兴播报新闻&#xff0c;背后都依赖于新一…

作者头像 李华
网站建设 2026/3/16 5:28:06

PHP程序员进阶之路:掌握这6步,轻松实现区块链式交易追踪

第一章&#xff1a;PHP程序员进阶之路&#xff1a;从基础到区块链思维转型 对于长期深耕于Web后端开发的PHP程序员而言&#xff0c;技术进阶不仅是语言层面的拓展&#xff0c;更是一次思维范式的跃迁。从处理表单请求到构建高并发分布式系统&#xff0c;再到理解去中心化架构&a…

作者头像 李华
网站建设 2026/3/16 4:46:10

大型语言模型技术圆桌讨论:从理论到生产的挑战与未来

大型语言模型圆桌讨论&#xff1a;技术挑战与行业未来 大型语言模型&#xff08;LLMs&#xff09;的卓越能力已成为焦点&#xff0c;引发了关于其影响的广泛讨论和推测。 本次小组讨论涉及&#xff1a; 未来将何去何从&#xff1f;提示词&#xff08;prompting&#xff09;的出…

作者头像 李华
网站建设 2026/3/4 7:20:44

移动端App封装HeyGem PWA渐进式网页应用

移动端App封装HeyGem PWA渐进式网页应用 在AI内容创作工具日益普及的今天&#xff0c;一个现实问题摆在开发者面前&#xff1a;如何让基于Python和Gradio构建的数字人视频生成系统——比如HeyGem——走出实验室、PC浏览器和局域网&#xff0c;真正触达普通用户&#xff1f;尤其…

作者头像 李华
网站建设 2026/3/4 6:04:31

‌熔炉控制软件安全测试:保障玻璃制造的生命线

在玻璃制造工业中&#xff0c;熔炉是核心设备&#xff0c;其控制软件&#xff08;如基于PLC或SCADA的系统&#xff09;负责管理高温熔融过程、温度调节和安全联锁。一旦软件失效&#xff0c;可能导致灾难性事故&#xff0c;如熔炉爆炸或生产中断。因此&#xff0c;安全测试不仅…

作者头像 李华