目录
使用Verilog语言设计一个3bit的计数器电路
一、逻辑设计
1.端口设计
模块的输入端口包含系统时钟sys_clk、复位信号sys_rst_n;输出端口包含3bit的计数器信号cnt[2:0]。
2.波形图绘制
每个时钟上升沿之后,计数器的值就加1,cnt循环从0计数到7,每当计数器计数到最大值时,就会从零开始重新累加。
二、程序设计
根据波形图使用Verilog编写计数器(counter.v)代码
1.计数器代码
代码如下:
module counter(
input sys_clk, // 系统时钟信号
input sys_rst_n, // 系统复位信号(低电平有效)
output reg [2:0] cnt // 输出计数器值,3位宽度
);
always @(posedge sys_clk or negedge sys_rst_n) begin
if (!sys_rst_n) // 如果复位信号为低电平
cnt <= 3'd0; // 计数器复位为0
else
cnt <= cnt + 3'd1; // 计数器值加1
end
endmodule
2.仿真代码
代码如下:
`timescale 1ns / 1ns // 仿真单位/仿真精度
module tb_counter();
// 定义输入端口
reg sys_clk; // 系统时钟信号
reg sys_rst_n; // 系统复位信号(低电平有效)
// 定义输出端口
wire [2:0] cnt; // 计数器值输出端口
// 初始化模块
initial begin
sys_clk = 1; // 初始时钟信号为高电平
sys_rst_n = 1'b0; // 初始复位信号为低电平
#201 // 延迟201个时间单位
sys_rst_n = 1'b1; // 将复位信号置为高电平,使计数器开始计数
end
// 时钟信号反转模拟
always #10 sys_clk = ~sys_clk;
// 实例化计数器模块
counter counter_inst(
.sys_clk(sys_clk), // 传递时钟信号
.sys_rst_n(sys_rst_n), // 传递复位信号
.cnt(cnt) // 传递计数器输出
);
endmodule
3.仿真结果
仿真波形与我们绘制的波形图一致
总结
计数器是逻辑设计中非常常用的一个时序电路,计数器是由寄存器和加法器组成的,使用计数器可以实现使用计数器可以对脉冲的个数计数,以实现测量、计数、分频和控制的功能。