【边学边记_10】——8 位7段数码管的动态显示

news/2024/11/23 2:05:15/

数码管的驱动设计与验证

一、数码管驱动原理

其中 8 段数码管的结构图如下图所示
在这里插入图片描述
由上图可以看出数码管有两种结构:共阴极共阳极。这两者的区别在于,公共端是连接到地还是高电平,对于共阴数码管需要给对应段以高电平才会使其点亮,而对于共阳极数码管则需要给低电平才会点亮。本文采用共阳数码管。同时为了显示数字或字符,必须对数字或字符进行编码译码。这里先不考虑小数点也就是简化为 7 段数码管,其编码译码格式如下表所示:
在这里插入图片描述
段式数码管工作方式有两种:静态显示方式动态显示方式。静态显示的特点是每个数码管的段选必须接一个 8 位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。这种方法由于每一个数码管均需要独立的数据线因此硬件电路比较复杂,成本较高,很少使用。
为了节约 IO 以及成本一般采用如下图所示的电路结构,这样 3 个数码管接在一起就比静态的少了 7*2 个 I/O。
在这里插入图片描述
这样就实现了另一种显示模式,动态显示。动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
现在举例假设将扫描时间定为 1S,这三个数码管分成 3s,第 1 秒时 sel 数据线上为b100,这时数码管 0 被选中,这时 a=0,数码管 0 的 LED0 就可以点亮;第 2 秒时 sel 数据线上为b010,这时数码管 1 被选中,这时 b=0,数码管 1 的 LED1 就可以点亮;第 3 秒时 sel 数据线上为b001,这时数码管 2 被选中,这时 c=0,数码管 2 的 LED2 就可以点亮。这时的效果就会是数码管 0 的 LED0 亮一秒后数码管 1 的 LED1 亮一秒最后是数码管 2 的 LED2 亮一秒,这样再次循环。这样如果使用 1ms 刷新时间的话由于数码管的余辉效应以及人的视觉暂留这样就会出现数码管 0 的 LED0、数码管 1 的 LED1 以及数码管 2 的 LED2 “同时”亮,并不会有闪烁感。

二、模块设计

在这里插入图片描述

三、工程实现

1.设计文件

module hex8(Clk,Reset_n,disp_data,sel,seg);input Clk;input Reset_n;input [31:0] disp_data;output reg [7:0] sel;       //片选output reg [7:0] seg;     //段选//分频为1kHz  即每1ms刷新一次//使用门控时钟reg[14:0] div_cnt;     //分频计数        always@(posedge Clk or negedge Reset_n)if(!Reset_n)div_cnt <= 0;else if(div_cnt >= 24_999)div_cnt <= 0;        elsediv_cnt <= div_cnt + 1;reg clk_1k;   //此类门控时钟在大部分场合下不被允许always@(posedge Clk or negedge Reset_n)if(!Reset_n)clk_1k <= 0;else if(div_cnt == 24999)clk_1k <= ~clk_1k;    //3位计数器  reg [2:0] sel_num;always@(posedge clk_1k or negedge Reset_n)if(!Reset_n)sel_num <= 0;else sel_num <= sel_num + 1;                            //3-8译码器always@(*)case(sel_num)0: sel = 8'b00000001;1: sel = 8'b00000010;2: sel = 8'b00000100;3: sel = 8'b00001000;4: sel = 8'b00010000;5: sel = 8'b00100000;6: sel = 8'b01000000;7: sel = 8'b10000000;endcase    //多路选择器    reg[3:0]disp_tmp;always@(*)case(sel_num)7: disp_tmp = disp_data[31:28];6: disp_tmp = disp_data[27:24];5: disp_tmp = disp_data[23:20];4: disp_tmp = disp_data[19:16];3: disp_tmp = disp_data[15:12];2: disp_tmp = disp_data[11:8];1: disp_tmp = disp_data[7:4];0: disp_tmp = disp_data[3:0];endcase      //LUT查找表always@(*)case(disp_tmp)0: seg = 8'hc0;1: seg = 8'hf9;2: seg = 8'ha4;3: seg = 8'hb0;4: seg = 8'h99;5: seg = 8'h92;6: seg = 8'h82;7: seg = 8'hf8;8: seg = 8'h80;9: seg = 8'h90;4'ha: seg= 8'h88;4'hb: seg= 8'h83;4'hc: seg= 8'hc6;4'hd: seg= 8'ha1;4'he: seg= 8'h86;4'hf: seg= 8'h8e;endcase             endmodule

2.仿真文件

`timescale 1ns / 1ps
module hex8_tb();reg Clk;reg Reset_n;reg [31:0]disp_data;wire [7:0]sel;wire [7:0]seg;hex8_2 hex8(Clk,Reset_n,disp_data,sel,seg);  initial Clk = 1;always#10 Clk = ~Clk;initial beginReset_n = 0;disp_data = 32'h00000000;#201;Reset_n = 1;#2000;disp_data = 32'h12345678;#10000000;disp_data = 32'h9abcdef0;#10000000;$stop;endendmodule

3.仿真结果

在这里插入图片描述

四、思考

关于门控时钟使能时钟:使用门控时钟,将门控时钟直接作为DFF的工作时钟(即如上面第1部分代码所示),使用使能时钟的情况,DFF的工作时钟继续使用全局的高质量时钟,而将使能时钟作为DFF的使能信号使用(如下面代码所示)。关于时钟质量对FPGA设计的重要性,可以参考使能时钟与门控时钟的原理与差异视频学习。

module hex8_2(Clk,Reset_n,disp_data,sel,seg);input Clk;input Reset_n;input [31:0] disp_data;output reg [7:0] sel;       //片选output reg [7:0] seg;     //段选//分频为1kHz  即每1ms刷新一次//使用使能时钟reg[15:0] div_cnt;     //分频计数        always@(posedge Clk or negedge Reset_n)if(!Reset_n)div_cnt <= 0;else if(div_cnt >= 49_999)div_cnt <= 0;        elsediv_cnt <= div_cnt + 1;reg clk_1k;   always@(posedge Clk or negedge Reset_n)if(!Reset_n)clk_1k <= 0;else if(div_cnt == 49999)clk_1k <= 1;    else    clk_1k <= 0;//3位计数器  reg [2:0] sel_num;always@(posedge Clk or negedge Reset_n)if(!Reset_n)sel_num <= 0;else if(clk_1k) sel_num <= sel_num + 1;                            //3-8译码器always@(posedge Clk)case(sel_num)0: sel = 8'b00000001;1: sel = 8'b00000010;2: sel = 8'b00000100;3: sel = 8'b00001000;4: sel = 8'b00010000;5: sel = 8'b00100000;6: sel = 8'b01000000;7: sel = 8'b10000000;endcase    //多路选择器    reg[3:0]disp_tmp;always@(posedge Clk)case(sel_num)7: disp_tmp = disp_data[31:28];6: disp_tmp = disp_data[27:24];5: disp_tmp = disp_data[23:20];4: disp_tmp = disp_data[19:16];3: disp_tmp = disp_data[15:12];2: disp_tmp = disp_data[11:8];1: disp_tmp = disp_data[7:4];0: disp_tmp = disp_data[3:0];endcase      //LUT查找表always@(posedge Clk)case(disp_tmp)0: seg = 8'hc0;1: seg = 8'hf9;2: seg = 8'ha4;3: seg = 8'hb0;4: seg = 8'h99;5: seg = 8'h92;6: seg = 8'h82;7: seg = 8'hf8;8: seg = 8'h80;9: seg = 8'h90;4'ha: seg= 8'h88;4'hb: seg= 8'h83;4'hc: seg= 8'hc6;4'hd: seg= 8'ha1;4'he: seg= 8'h86;4'hf: seg= 8'h8e;endcase             endmodule

仿真结果
在这里插入图片描述


http://www.ppmy.cn/news/546569.html

相关文章

tensorflow安装测试教程【一文读懂】

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ &#x1f34a; 精选专栏&#xff0c;环境搭建&#xff0c;一文读懂&#xff1a; 每篇博文…

FPGA驱动OLED Verilog代码 (四)------ 字符和汉字显示

一、概述&#xff1a; 首先展示一下成果图&#xff0c;使用RAM的读写来完成&#xff0c;下面依次介绍各个模块 二、OLED显示原理&#xff08;部分&#xff09; oled分为7页&#xff0c;每一页有128个字节用来显示 首先先设置页地址&#xff0c;然后设置列的低地址和高地址&…

android功能相同的view,Android自定义View实现扫描效果

本文实例为大家分享了Android自定义View实现扫描效果的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 演示效果如下&#xff1a; 实现内容&#xff1a; 1、控制动画是竖向或者横向 2、控制动画初始是从底部/左边开始&#xff0c;或者从上边/右边开始 3、控制动画的时…

Samba实用技巧:更换用户、端口监听、列表控制

本文一步一步介绍了FreeBSD8.1下的samba的基础配置。SMB协议可以看作是局域网上的共享文件/打印机的一种协议&#xff0c;它可以为网络内部的其它Windows和Linux机器提供文件系统、打印服务或是其他一些信息。而Samba是用来实现SMB的一种软件&#xff0c;由澳大利亚的Andew Tri…

IIC通信协议详解 PCF8591应用(Verilog实现FPGA)

IIC通信协议详解 & PCF8591应用(Verilog实现/FPGA) 该文章结合PCF8591 8-bit AD/DA 模数/数模转换器来详细介绍IIC通信协议&#xff0c;尽量做到条理清晰&#xff0c;通俗易懂。该文图片均从PCF8591手册中截取&#xff0c;一定程度上引导读者学习阅读data sheet。 之后可…

Mac下MySql无法启动的原因

由于很长时间没有使用MySql&#xff0c;今天想启动一下发现启动不了&#xff0c;输入MySql启动命令报错。 操作步骤如下&#xff1a; 输入MySql启动命令&#xff1a; sudo /usr/local/mysql/support-files/mysql.server start报错信息如下&#xff1a; Starting MySQL .Logging…

四级嵌入式题目——计算机原理与组成 第四章中断技术及8259芯片

第1题&#xff1a;(单项选择题)(本题:1分) 8086CPU在响应INTR中断时 A. 中断类型码等于8 B. 中断类型码等于16 C. 中断类型码由I/O提供 D. 中断类型码由CPU提供 正确答案&#xff1a;C 第2题&#xff1a;(单项选择题)(本题:1分) 8086CPU在响应INTR中断时&#xff0c;为了得到…

CTF——常见密码

CTF题中遇到的密码总结&#xff1a; 序号名称密文原文备注1栅栏密码&#xff1a;fg2ivyo}l{2s3_oaw__rclflag{w22_is_v3ry_cool} 所谓栅栏密码&#xff0c;就是把要加密的明文分成N个一组&#xff0c;然后把每组的第1个字连起来&#xff0c;形成一段无规律的话。 不过栅栏密码…