FPGA项目(5)--FPGA控制数码管动态显示的原理

这篇具有很好参考价值的文章主要介绍了FPGA项目(5)--FPGA控制数码管动态显示的原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        数码管是现在电子产品上常用的显示器件,它有驱动简单、显示清晰、价格低廉等优势。数码管的实物图:

fpga数码管显示实验原理,FPGA项目,fpga开发,嵌入式硬件

         数码管的内部结构图如下所示:

fpga数码管显示实验原理,FPGA项目,fpga开发,嵌入式硬件

         从图中可以看出,它由八个段组成,即A B C D E F G DP(小数点),只要将这八个段按规律组合点亮,就能显示出一定的数字。例如,对于数字1,只需要将B C两段点亮,其他全部熄灭,那么就可以在数码管上显示出数字1.数码管还有一个公共端,用于接电源或地。

        数码管又分为两种,一种是共阴极数码管,一种是共阳极数码管。对于共阴极数码管而言,它的各个段是高电平点亮,公共端接地。对于共阳极数码管,它的各个段是低电平点亮,公共端接电源。现在给出两种数码管的0-9这十个数字的段码表:

        共阴极(兼有共阳极):

        fpga数码管显示实验原理,FPGA项目,fpga开发,嵌入式硬件

        共阳极:

         fpga数码管显示实验原理,FPGA项目,fpga开发,嵌入式硬件

         至此,对于如何在数码管上显示出数字,我们就有了思路。本次我用的是共阳极数码管,不需要显示小数点,所以对我而言,我只需要控制数码管的七个段即可。用FPGA控制数码管静态显示是很容易的,直接给七个段分配七个管脚,然后再输出对应的电平,就能静态显示出数字。如果要显示数字1,只要输出电平 1111001即可。难点在于如何动态显示。下面讲解FPGA驱动四位数码管动态显示的思路:

        本次使用的四位数码管按如下方式排列:

fpga数码管显示实验原理,FPGA项目,fpga开发,嵌入式硬件

         每个数码管都有一个位选端,通过位选端的控制,就可以一次只点亮一个数码管,然后快速切换到另一个数码管,只要频率够快,就能达到动态显示的效果。本次我使用的4位数码管的位选端是低电平有效,那么当位选信号为1110时,标号为4的数码管被点亮,可以显示相应的数字。要使得标号为3的数码管也被点亮显示数字时,只需要将位选信号赋值为1101即可。只要以足够快的频率,依次给位选信号赋值为1110 ,1101 , 1011 , 0111,就可以同时点亮四个数码管。

        下面给出FPGA驱动数码管动态显示的代码,并对代码进行具体的分析、解释。

module seg(
input 				sys_clk,sys_rest,
input	[15:0]		data,
output	reg [3:0]	sel,
output  reg [6:0]	seg_led
);

parameter	CLK_NUM=4'd10;
parameter	MSNUM=14'd5000;
reg	[3:0]	CNT_NUM;
reg			CLK;

reg [12:0]	MSCNT;
reg			MS_flag;
reg [3:0]	num_display;

reg [15:0]	num;
reg [2:0]	sel_num; //选择哪一位数码管被点亮
//wire define
wire   [3:0]              data0    ;        // 个位数
wire   [3:0]              data1    ;        // 十位数
wire   [3:0]              data2    ;        // 百位数
wire   [3:0]              data3    ;        // 千位数


//提取显示数值所对应的十进制数的各个位
assign  data0 = data[3:0];      // 个位数
assign  data1 = data[7:4];    // 十位数
assign  data2 = data[11:8];    // 百位数
assign  data3 = data[15:12];   // 千位数


always @(posedge sys_clk or negedge sys_rest) begin
	if(!sys_rest)
		begin
		CNT_NUM<=4'd0;
		CLK<=1'd1;
		end
	else if(CNT_NUM<=CLK_NUM/2-1'b1)
		begin
		CLK<=~CLK;
		CNT_NUM<=4'd0;
		end
	else
		begin
		CNT_NUM<=CNT_NUM+1;
		CLK<=CLK;
		end
end

always @(posedge CLK or negedge sys_rest) begin
	if(!sys_rest)
		num<=16'd0;
	else 
		begin		    
            num[15:12] <= data3;	//则依次给4位数码管赋值
            num[11:8]  <= data2;
            num[ 7:4]  <= data1;
            num[ 3:0]  <= data0;
		end
end


always @(posedge CLK or negedge sys_rest) begin  //产生1ms脉冲
	if(!sys_rest)
		begin
			MSCNT<=13'd0;
			MS_flag<=1'b0;
		end
	else if(MSCNT==MSNUM-1)
		begin
			MSCNT<=13'd0;
			MS_flag<=1'b1;
		end
	else
		begin
			MSCNT<=MSCNT+1;
			MS_flag<=1'b0;
		end
end


always @(posedge CLK or negedge sys_rest) begin
	if(!sys_rest)
		sel_num<=0;
	else if(MS_flag)
		begin
			if(sel_num<3'd3)
				sel_num<=sel_num+1;
			else
				sel_num<=0;
		end
	else
		sel_num<=sel_num;
end

always @(posedge CLK or negedge sys_rest) begin
	if(!sys_rest)
		sel<=4'b1111;
	else
		begin
			case(sel_num)
				3'd0:	begin
						sel<= 4'b1110;  //显示数码管最低位
						num_display<=num[3:0];
						end
				3'd1:	begin
						sel<= 4'b1101;  //显示数码管第1位
						num_display<=num[7:4];
						end
				3'd2:	begin
						sel<= 4'b1011;  //显示数码管第2位
						num_display<=num[11:8];
						end
				3'd3:	begin
						sel<= 4'b0111;  //显示数码管第3位
						num_display<=num[15:12];
						end
				default	sel<= 4'b1111;
			endcase
		end
end

always @(posedge CLK or negedge sys_rest) begin
	if(!sys_rest)
		seg_led<=7'b100000;
	else
		begin
			case(num_display)
			4'h0 :    seg_led <= 7'b1000000;
            4'h1 :    seg_led <= 7'b1111001;
            4'h2 :    seg_led <= 7'b0100100;
            4'h3 :    seg_led <= 7'b0110000;
            4'h4 :    seg_led <= 7'b0011001;
            4'h5 :    seg_led <= 7'b0010010;
            4'h6 :    seg_led <= 7'b0000010;
            4'h7 :    seg_led <= 7'b1111000;
            4'h8 :    seg_led <= 7'b0000000;
            4'h9 :    seg_led <= 7'b0010000;
			4'd10: 	  seg_led <= 7'b1111111;           //不显示任何字符
            default : seg_led <= 7'b1000000;
        endcase
		end
end

endmodule

        首先显示的数据是以BCD码的格式传入的,例如我要显示数据1234,那么就要传入0001_0010_0011_0100给该模块,所以输入数据data的位宽为16。然后定义4个内部变量,data0到data3,用于保存个位 ,十位, 百位 ,千位上的数字,方便后面的显示。随后又分频,产生了5M的时钟CLK和1K的时钟MS_flag。位选信号的变化就是在MS_flag信号的驱动下变换的,也就是说,数码管以1KHZ的频率切换显示,人眼是分辨不出来的,所以看起来就是同时显示了四个数字。最后,根据位选信号,将对应位(个位/十位/百位/千位)的数字传给num_display,再由num_display变量控制数码管段选信号的输出。这样就实现了动态的显示!

        备注:数码管的段选信号就是数码管A B C D E F G等七个段的控制信号,数码管位选信号就是公共端的控制信号。文章来源地址https://www.toymoban.com/news/detail-516118.html

到了这里,关于FPGA项目(5)--FPGA控制数码管动态显示的原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA基本实验之数码管的动态显示

            关于数码管的基本知识大家可以参考我上一篇文章数码管的静态显示,         使用 1ms 的刷新时间让六个数码管轮 流显示:第 1ms 点亮第一个数码管,第 2ms 点亮第二个数码管,以此类推依次点亮六个数 码管,6ms 一个轮回,也就是说每个数码管每 6ms 点亮

    2024年02月08日
    浏览(41)
  • FPGA 驱动数码管动态显示(Verilog&Vivado)

    应用实例: (1)使用串口发送实现ACX720开发板时钟显示 本章将实现 FPGA 驱动数码管动态显示并提取出实现的电路结构,从电路结构入手编写代码,仿真对设计进行验证。最终板级调试时使用 Virtual Input/Output(VIO,虚拟输入/输出端口工具),输入需要显示的数据,数码管则显

    2023年04月12日
    浏览(57)
  • 51单片机控制数码管动态显示

    首先打开proteus,导入8位数码管和89c51。 然后如图连线,分清断码和位码, 断码就是一个数码管的7个LED灯。 位码:就是第几位显示,由于是共阴极,所以哪位接地就显示哪位。 下面通过改变位码的接线就可以看出不同的效果 下面就编写程序,从第1位到第8位显示从0到7的八

    2023年04月21日
    浏览(46)
  • FPGA项目五:数码管动态扫描

    led 数码管( LED Segment Displays )是由多个发光二极管封装在一起的器件,这些二极管组成“8”字型,在内部完成引线连接,只引出它们的各个笔划和公共电极。一般来说, led 数码管常用段数为 7 段,如下图中所示的 a、b、c、d、e、f、g,有的数码管还会添加一个小数点,如图

    2024年02月06日
    浏览(58)
  • <微机原理>[汇编语言]-[实验七]数码管动态显示实验

    实验一 软件开发环境和简单程序设计 实验二 I_O输入输出实验 实验三 键盘扫描显示实验 实验四 中断实验 实验五 定时器实验 实验六 串行口实验 实验七 数码管动态显示实验 实验八 矩阵键盘应用实验 实验九 电子时钟 微机原理实验课程,会陆续根据目录更新文章 掌握LED八段

    2024年02月07日
    浏览(39)
  • 学习笔记|认识数码管|控制原理|数码管实现0-9的显示|段码跟位码|STC32G单片机视频开发教程(冲哥)|第九集:数码管静态显示

    数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多一个小数点(DP)这个小数点可以更的表示数码管想要显示的内容;按能显示多少个(8)可分为1位、2位、3位、4位、5位、6位、7位等数码管。 按发光二极管单元连接方

    2024年02月10日
    浏览(53)
  • FPGA_数码管显示

    一位数码管: 数码管等效电路(共阴极 和 共阳极) 数码管显示的值: 假设我们需要b,c亮,我们只需要给b,c接高电平,其他接低电平就可。 seg[7:0]  = 8\\\'b0000_0110 对于数码管显示的值,seg值如下图: 多位数码管-----如下图(以3位为例) 假设现在需要LED1亮,那么就让sel0为1,

    2024年01月23日
    浏览(50)
  • FPGA学习—数码管显示

    数码管动态显示采用了人眼暂存的原理,即时分复用,在数码管实现动态显示。 整个实验设计流程框架如下图所示: 开发板采用共阳极数码管,即低电平点亮。 本实验准备设计一个定时器,6为数码管显示24小时制的时间,所以编写一个计数模块。 改变变量COUNT的数值,可实

    2024年02月09日
    浏览(44)
  • Intel FPGA:数码管显示

    个人说明: 限于时间紧迫以及作者水平有限,本文错误、疏漏之处恐不在少数,恳请读者批评指正。意见请留言或者发送邮件至:“Email:noahpanzzz@gmail.com” 。 本博客的工程文件均存放在:GitHub:https://github.com/panziping。 本博客的地址:CSDN:https://blog.csdn.net/ZipingPan 。 参考: 芯

    2024年04月15日
    浏览(40)
  • 51单片机(四)静态数码管和动态数码管显示

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月09日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包