问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

FPGA学习笔记:3位计数器设计

创作时间:
作者:
@小白创作中心

FPGA学习笔记:3位计数器设计

引用
CSDN
1.
https://blog.csdn.net/qq_45910789/article/details/139013650

FPGA(现场可编程门阵列)是一种重要的可编程逻辑器件,在数字电路设计中有着广泛的应用。本文将介绍如何使用Verilog语言设计一个3位计数器,这是一个FPGA学习的基础内容。

一、逻辑设计

1.端口设计

模块的输入端口包含系统时钟sys_clk、复位信号sys_rst_n;输出端口包含3位的计数器信号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.仿真结果

仿真波形与我们绘制的波形图一致

总结

计数器是逻辑设计中非常常用的一个时序电路,计数器是由寄存器和加法器组成的,使用计数器可以实现使用计数器可以对脉冲的个数计数,以实现测量、计数、分频和控制的功能。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号