基于Verilog的7段数码管动态扫描驱动模块设计
1、7段数码管动态扫描驱动模块概述
功能:通过动态扫描方式驱动6位共阳极7段数码管
特性:
(1)支持6位数码管显示(24位输入数据,每4位代表一个数字)
(2)采用动态扫描技术,降低功耗
(3)支持十六进制显示(0-F)
(4)带异步复位功能
2、7段数码管模块硬件原理图+6位一体共阳极数码管

3、7段数码管动态扫描驱动模块的Verilog描述

1 module disp7led_dyna(
2
3 input wire clk, // 系统时钟输入(50MHz)
4 input wire rst_n, // 异步复位信号,低电平有效
5 input wire [23:0] data_in, // 24位显示数据输入,[23:20]为第1位,[3:0]为第6位
6 output reg [5:0] sel6, // 6位数码管位选信号(低电平有效,sel6[0]对应第1位)
7 output reg [7:0] seg7 // 7段+小数点输出(低电平有效,seg7[7]为小数点)
8 );
9
10 parameter DELAY_1MS = 16'd50_000; // 1ms延时计数值,数码管扫描时间
11
12 // 内部寄存器定义
13 reg [15:0] count; // 1ms定时计数器(16位宽度可支持最大65535个周期)
14 reg [2:0] cnt; // 当前显示位计数器(0-5对应6位数码管)
15 reg [3:0] show_data; // 当前要显示的数字(4位二进制,可表示0-15)
16
17
18 //------------------------------------------------------------------
19 // 1ms定时器生成逻辑
20 // 功能:产生精确的1ms时间间隔,用于数码管动态扫描
21 // 工作原理:在50MHz时钟下,每计数50,000次产生一个1ms标志
22 //------------------------------------------------------------------
23 always@(posedge clk or negedge rst_n)begin
24 if(rst_n == 1'b0)
25 count <= 16'b0; // 异步复位,计数器清零
26 else if(count < DELAY_1MS - 1'b1)
27 count <= count + 1'b1; // 计数器递增
28 else
29 count <= 16'b0; // 达到1ms时计数器归零
30 end
31
32 //------------------------------------------------------------------
33 // 数码管位选择计数器
34 // 功能:循环计数0-5,对应6位数码管
35 // 扫描频率:每1ms切换一位,6ms完成一个完整扫描周期(约167Hz刷新率)
36 //------------------------------------------------------------------
37 always@(posedge clk or negedge rst_n)begin
38 if(rst_n == 1'b0)
39 cnt <= 3'd0; // 复位时指向第1位数码管
40 else if(count == DELAY_1MS - 1'b1)begin // 每1ms更新一次
41 if(cnt < 3'd6)
42 cnt <= cnt + 1'b1; // 循环计数0→1→2→3→4→5
43 else
44 cnt <= 3'd0; // 计数到5后归零
45 end
46 else
47 cnt <= cnt; // 保持当前计数值
48 end
49
50 //------------------------------------------------------------------
51 // 数据选择器(多路复用器)
52 // 功能:根据当前位选择对应4位数据输出
53 // 注意:这是组合逻辑电路,无时钟延迟
54 //------------------------------------------------------------------
55 always@(*)begin
56 case(cnt)
57 3'd0: show_data = data_in[23:20]; // 选择第1位数据(最高4位)
58 3'd1: show_data = data_in[19:16]; // 选择第2位数据
59 3'd2: show_data = data_in[15:12]; // 选择第3位数据
60 3'd3: show_data = data_in[11:8]; // 选择第4位数据
61 3'd4: show_data = data_in[7:4]; // 选择第5位数据
62 3'd5: show_data = data_in[3:0]; // 选择第6位数据(最低4位)
63 default: show_data = 4'b0000; // 默认情况(理论上不会发生)
64 endcase
65 end
66
67 //------------------------------------------------------------------
68 // 7段译码器(带小数点)
69 // 功能:将4位二进制数转换为7段数码管控制信号
70 // 编码规则(共阳极数码管,低电平有效):
71 // seg7[7] = dp (小数点)
72 // seg7[6:0] = g f e d c b a (从高位到低位)
73 // 注意:此实现未使用小数点(默认熄灭)
74 //------------------------------------------------------------------
75 always@(posedge clk or negedge rst_n)begin
76 if(rst_n == 1'b0)
77 seg7 <= 8'b1111_1111; // 复位时关闭所有段
78 else
79 case(show_data)
80 4'd0: seg7 = 8'b1100_0000; // 显示"0"
81 4'd1: seg7 = 8'b1111_1001; // 显示"1"
82 4'd2: seg7 = 8'b1010_0100; // 显示"2"
83 4'd3: seg7 = 8'b1011_0000; // 显示"3"
84 4'd4: seg7 = 8'b1001_1001; // 显示"4"
85 4'd5: seg7 = 8'b1001_0010; // 显示"5"
86 4'd6: seg7 = 8'b1000_0010; // 显示"6"
87 4'd7: seg7 = 8'b1111_1000; // 显示"7"
88 4'd8: seg7 = 8'b1000_0000; // 显示"8"
89 4'd9: seg7 = 8'b1001_0000; // 显示"9"
90 4'd10:seg7 = 8'b1000_1000; // 显示"A"
91 4'd11:seg7 = 8'b1000_0011; // 显示"b"
92 4'd12:seg7 = 8'b1100_0110; // 显示"C"
93 4'd13:seg7 = 8'b1010_0001; // 显示"d"
94 4'd14:seg7 = 8'b1000_0110; // 显示"E"
95 4'd15:seg7 = 8'b1000_1110; // 显示"F"
96 default: seg7 <= 8'b1111_1111; // 默认关闭所有段
97 endcase
98 end
99
100 //------------------------------------------------------------------
101 // 位选信号生成器
102 // 功能:根据当前位计数器生成对应的位选信号
103 // 特性:
104 // - 低电平有效(0表示选中对应位数码管)
105 // - 每次只选中一位,实现动态扫描
106 //------------------------------------------------------------------
107 always@(posedge clk or negedge rst_n)begin
108 if(rst_n == 1'b0)
109 sel6 <= 6'b11_1111; // 复位时关闭所有位数码管
110 case(cnt)
111 3'd0: sel6 <= 6'b11_1110; // 选中第1位数码管(sel6[0]=0)
112 3'd1: sel6 <= 6'b11_1101; // 选中第2位数码管(sel6[1]=0)
113 3'd2: sel6 <= 6'b11_1011; // 选中第3位数码管(sel6[2]=0)
114 3'd3: sel6 <= 6'b11_0111; // 选中第4位数码管(sel6[3]=0)
115 3'd4: sel6 <= 6'b10_1111; // 选中第5位数码管(sel6[4]=0)
116 3'd5: sel6 <= 6'b01_1111; // 选中第6位数码管(sel6[5]=0)
117 default: sel6 <= 6'b11_1111; // 默认关闭所有位数码管
118 endcase
119 end
120
121 endmodule
4、7段数码管动态扫描驱动模块的测试平台
功能:对disp7led_dyna模块进行仿真测试
测试内容:复位功能测试、动态扫描时序测试、数据显示正确性测试
1 `timescale 1ns/1ns // 仿真时间单位1ns,精度1ns
2
3 module disp7led_dyna_tb();
4
5 // 测试信号定义
6 reg clk; // 模拟系统时钟信号(50MHz,周期20ns)
7 reg rst_n; // 模拟异步复位信号,低电平有效
8 reg [23:0] data_in; // 模拟24位显示数据输入,[23:20]为第1位,[3:0]为第6位
9
10 wire [5:0] sel6; // 监测位选信号输出(低电平有效,sel6[0]对应第1位)
11 wire [7:0] seg7; // 监测段选信号输出(低电平有效,seg7[7]为小数点)
12
13 // 实例化被测模块
14 disp7led_dyna uut(
15 .clk (clk), // 连接测试时钟
16 .rst_n (rst_n), // 连接测试复位信号
17 .data_in (data_in), // 连接测试数据输入
18 .sel6 (sel6), // 连接位选信号输出
19 .seg7 (seg7) // 连接段选信号输出
20 );
21
22 // 修改被测模块参数(缩短仿真时间)
23 // 将原1ms扫描间隔缩短为50个时钟周期(1us)
24 defparam uut.DELAY_1MS = 50;
25
26 // 时钟信号生成(50MHz)
27 initial clk = 1'b0; // 初始时钟置0
28 always #10 clk = ~clk; // 每10ns翻转一次(周期20ns)
29
30 // 测试激励生成
31 initial begin
32 rst_n = 1'b0; // 复位信号有效(低电平)
33 data_in = 24'h123456; // 测试数据:6位数码管显示1-2-3-4-5-6
34 #203; // 等待203ns(超过10个时钟周期)
35 rst_n = 1'b1; // 释放复位(开始正常工作)
36
37 // 观察完整扫描周期
38 // 等待2个完整扫描周期(6位数×50周期×2次)
39 #(20*50*6*2);
40 $stop; // 停止仿真(在Modelsim等工具中暂停)
41 end
42
43 endmodule

提示:当数码管的段选段(seg7)和位选段(sel)不同步时,就会导致选中的管子和想要显示的数字不是完全同步的,由于不同步的时间相对比较少,所以显示出错误的数字的时间较短,点亮的程度就会比较小,称为“鬼影”。
5、7段数码管动态扫描驱动顶层模块+开发板测试
主要用于测试和展示disp7led_dyna模块的功能
实际使用时,可将data_in替换为需要显示的真实数据
1 // 7段数码管动态扫描驱动顶层模块
2 // 功能:实例化动态扫描驱动模块并提供测试数据
3 // 特性:
4 // 1. 连接系统时钟和复位信号
5 // 2. 提供固定的24位测试数据(0x123456)
6 // 3. 输出数码管位选和段选信号
7 module disp7led_dyna_top(
8 input wire clk, // 系统时钟输入(50MHz)
9 input wire rst_n, // 异步复位信号,低电平有效
10 output wire [5:0] sel6, // 6位数码管位选信号输出,低电平有效,sel6[0]对应最左边的数码管
11 output wire [7:0] seg7 // 7段数码管段选信号输出(包含小数点)
12 );
13
14 // 内部信号定义
15 wire [23:0] data_in; // 24位显示数据线
16
17 assign data_in = 24'h123456; // 将24'h123456固定赋值给data_in
18
19 // 动态扫描驱动模块实例化
20 // 将顶层模块的端口与驱动模块连接
21 disp7led_dyna uut(
22 .clk (clk), // 连接系统时钟
23 .rst_n (rst_n), // 连接复位信号
24 .data_in (data_in), // 连接显示数据
25 .sel6 (sel6), // 连接位选信号输出
26 .seg7 (seg7) // 连接段选信号输出
27 );
28
29 endmodule
基于Verilog的7段数码管动态扫描驱动模块设计的更多相关文章
- nexys4ddr数码管动态扫描Verilog例程
题目:实现数码管动态扫描功能,将十六个开关的值以十六进制的方式在4个数码管上同时显示出来. `timescale 1ns / 1ps module top( clk, sw, seg, an ); / ...
- AC620教程 第十五节 8位7段数码管驱动设计与验证
本章导读 电子系统中常用的显示设备有数码管.LCD液晶以及VGA显示器等.其中数码管又可分为段式显示(7段.米字型等)以及点阵显示(8*8.16*16等),LCD液晶的应用可以分为字符式液晶(1602 ...
- 10-8位7段数码管驱动实验——小梅哥FPGA设计思想与验证方法视频教程配套文档
芯航线--普利斯队长精心奉献 实验目的: 1.实现FPGA驱动数码管动态显示: 2.使用In system sources and probes editor工具,输入需要显示在数码管上的的数据, ...
- 基于Verilog HDL 的数字时钟设计
基于Verilog HDL的数字时钟设计 一.实验内容: 利用FPGA实现数字时钟设计,附带秒表功能及时间设置功能.时间设置由开关S1和S2控制,分别是增和减.开关S3是模式选择:0是正常时钟 ...
- 基于Verilog HDL 的数字电压表设计
本次实验是在“基于Verilog HDL的ADC0809CCN数据采样”实验上进一步改进,利用ADC0809采集到的8位数据,进行BCD编码,以供查表方式相加进行显示,本次实验用三位数码管. ADC0 ...
- 基于Verilog HDL整数乘法器设计与仿真验证
基于Verilog HDL整数乘法器设计与仿真验证 1.预备知识 整数分为短整数,中整数,长整数,本文只涉及到短整数.短整数:占用一个字节空间,8位,其中最高位为符号位(最高位为1表示为负数,最高位为 ...
- 基于Verilog HDL 各种实验
菜鸟做的的小实验链接汇总: 1.基于Verilog HDL 的数字时钟设计 2.乘法器 3.触发器(基本的SR触发器.同步触发器.D触发器) 4.基于Verilog HDL的ADC ...
- 基于Verilog HDL的ADC0809CCN数据采样
本实验是用ADC0809CCN进行数据采样,并用7段数码管进行显示. ADC0809由一个8路模拟开关.一个地址锁存与译码器.一个A/D转换器和一个三态输出锁存器组成.多路开关可选通8个模拟通道,允许 ...
- 基于Verilog的带FIFO输出缓冲的串口接收接口封装
一.模块框图及基本思路 rx_module:串口接收的核心模块,详细介绍请见“基于Verilog的串口接收实验” rx2fifo_module:rx_module与rx_fifo之间的控制模块,其功能 ...
- 基于Verilog的带FIFO写入缓冲的串口发送接口封装
一.模块框图及基本思路 tx_module:串口发送的核心模块,详细介绍请参照前面的“基于Verilog的串口发送实验” fifo2tx_module:当fifo不为空时,读取fifo中的数据并使能发 ...
随机推荐
- 下一代 2D 图像设计工具「GitHub 热点速览」
长期以来,2D 设计领域似乎已是 Adobe 与 Figma 的天下,层叠的图层.熟悉的工具栏,一切都显得那么顺理成章,却也让不少设计师在创意的边界上感到了些许乏力.当我们以为设计工具的革新只能是小修 ...
- C/C++读取地震切片数据
SliceData IO 本文档将介绍文本格式文件的读写,常见的文本资料主要有: 层位(.txt) 切片(.txt) 测井(.las..txt) 断层(.txt)等.这些资料实质上均为表格(Table ...
- 统计Excel单元格中某个字符出现的次数
具体目标:统计A列单元格"/"出现的次数. 方法:先计算A2单元格中字符个数,然后将"/"替换为空再次计算字符个数,最后两者相减. Substitute函数 S ...
- 不支持tpm2.0 升级windows11
前提 我计划给我的macbook pro2020装双系统 但是双击启动转换助理 看到只能装windows10,只好手动选择下载好的win11镜像,则提示驱动软件失败TMDDD 那我就先用启动转换助理安 ...
- springBoot2.x启用https和兼容http
前言之前我嫌弃tomcat(spring)项目,开启https麻烦,所以一直都是nginx代理为https.今儿突然不想了.在springBoot2.x的情况下,直接开启https,并兼容http方式 ...
- qsort 浅度解析
#include <stdio.h>#include <string.h>#include <stdlib.h>//标准库 qsort的标准库ch ...
- spring-ai 学习系列(7)-MCP 安全认证
继续先前的MCP学习,实际企业级应用中,很多信息都是涉及商业敏感数据,需要考虑安全认证,不可能让MCP Server在网上裸奔.spring web开发中,提供了拦截器功能,最简单的思路,在Clien ...
- ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061) --九五小庞
修改Mysql数据库默认密码后登陆报 ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061) 注意:当修改M ...
- Linux关闭防火墙命令---九五小庞
题:老是关闭防火墙太麻烦,所以选择彻底关闭防火墙,发现每次都记不住命令! 下面是red hat/CentOs7关闭防火墙的命令! 1:查看防火状态 systemctl status firewalld ...
- Win11正式版电脑回收站为什么显示灰色的问题
一些雨林木风官网的win11正式版用户发现桌面上的回收站图标显示是灰色,点击无法进行,不能操作.这该如何解决呢?我们可以先尝试删除回收站图标,并在图标设置中添加相同的图标.此外,雨林木风小编再来分享其 ...