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

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

此实验基于FPGA征途pro开发板实现,

数码管的基本知识

数码管简介

数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数一般分为七 段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管(多一个小数点显 示)。当然也还有一些其他类型的数码管如“N”形管、“米”字管以及工业科研领域用 的 16 段管、24 段管等,本次实验我们采用8段数码管。

八段数码管知识

fpga手册的数码管,fpga开发,学习

        由上图可以看出,八段数码管是一个八字型数码管,分为八段:a、b、c、d、e、 f、g、dp,其中 dp 为小数点,每一段即为一个发光二极管,这样的八段我们称之为段选信 号。数码管常用的有 10 根管脚,每一段有一根管脚,另外两根管脚为一个数码管的公共 端,两根互相连接。

        数码管分为共阳极数码管和共阴极数码管。共阳极数码管就是把发光二极管的正极连 接在一起作为一个引脚,负极分开。相反的,共阴极数码管就是把发光二极管的阴极连接 在一起作为一个引脚,正极分开。这两者的区别在于,公共端是连接到地还是高电平,对 于共阳极数码管需要给对应段低电平才会使其点亮,而对于共阴极数码管则需要给其高电 平才会点亮。本次实验使用的是共阳极数码管,也就是说给对应段低电平才会被点亮。给 不同的段点亮可显示 0~f 的值,

下图是提供的数码管编码译码表:

fpga手册的数码管,fpga开发,学习

 二进制段码右边为高位左边为低位。我们只要点亮相应的段码,就 能显示我们需要显示的内容。

        段式数码管工作方式有两种:静态显示和动态显示。静态显示的特点是每个数码管的 段选必须接一个 8 位数据线来显示字形,显示字形可一直保持,直到送入新字形码为止。 那么如果点亮 6 个码管是不是需要 48 位数据线去分别控制每一个码管的段选?当然这种方 法也可以,但是其占用的 I/O 口较多,因此硬件电路比较复杂,成本较高,很少使用。

        为节省资源我们采用如图所示的数码管的连接方式:

fpga手册的数码管,fpga开发,学习

 由上图可以看到,我们将六个数码管的段选信号连接在一起,而位选(sel)独立控 制,这样六个数码管接在一起就少了 8×5 个 I/O 口。这里对位选信号特别说明一下:由上 图可以看到每一个数码管都有一个位选信号,而这个位选信号就控制着数码管的亮灭。这 样我们就可以通过位选信号去控制数码管亮,而在同一时刻,位选选通的数码管上显示的 字形是一样的,因为我们将 6 个数码管相对应的段选连在了一起,数码管的显示自然就相 同了,数码管的这种显示方式即为静态显示。

为了进一步减少板载I/O口资源我们采用74HC595芯片,

74HC595芯片介绍

        74HC595 是一个 8 位串行输入、并行输出的位移缓存器。其内部具有 8 位移位寄存器 和一个存储器,具有三态输出功能。

通过查找数据手册我们得到74HC595芯片的功能表:

fpga手册的数码管,fpga开发,学习

总结一下74HC595芯片的用法

 1、 首先把要传输的数据通过引脚 DS 输入到 74HC595 中。

2、 产生 SHCP 时钟,将 DS 上的数据串行移入移位寄存器。

3、 产生 STCP 时钟,将移位寄存器里的数据送入存储寄存器

4、 将OE 引脚置为低电平,存储寄存器的数据会在 Q0—Q7 并行输出,同时并行输出 的数据会被锁存起来。

 接下来正式开始实验的设计验证和实现:

我们可以设计一个这样的 6 位数码管静态显示:控制六位 数码管让其以 000000、111111、222222 一直到 FFFFFF 循环显示。每个字符显示 0.5s 后变 化。

程序设计

根据实验要求绘制系统框架:

fpga手册的数码管,fpga开发,学习

根据绘制的系统框架可以将这个程序初步设计为三部分:

第一部分:实现seg_static功能,

第二部分:实现芯片hc595_ctrl控制功能;

第三部分:实现顶层设计模块的综合。

第一部分:seg_static数码管显示模块

fpga手册的数码管,fpga开发,学习

 

首先介绍一下程序中的几个变量所代表的含义:

cnt:根据实验要求需要等待 0.5s 后显示的字符才发生变化。所以我们需要一个 0.5s 的循环计数器。我们输入的时钟频率是 50MHz,一个时钟周期的时间就是 (1/50MHz)s , 也 就 是 20ns 。 所 以 我 们 计 数 器 从 0 计 到 24_999_999 即 为 0.5s (25000000*20ns)的时间。计到 0.5s 后让其归 0 开始下一个 0.5s 的计数。

cnt_flag:当计数器计到 0.5s 时,我们拉高一个标志信号,让这个标志信号去控制数 码管字符的跳转。 num:每个数码管显示的字符,初始显示为 0,六个就是 000000。当检测到跳转的标 志信号为高时,让各个数码管显示的字符加 1。当加到 4’hF 时让其归 0 重新相加以此循 环。

sel:数码管的位选信号。我们是显示六个数码管,直接给其全点亮即可。根据原理图 可知我们需要给其位选信号高电平数码管才会被点亮,所以给对应的位数高电平对应的数 码管就会点亮,一位表示一个数码管。这里我们全部点亮即可。

seg:数码管的段选信号,给其相应段码点亮显示 num 里的值即可。

module 	seg_static
#(
		parameter  CNT_MAX = 25'd24_999_999
)
(
		input 	wire 	sys_clk,
		input 	wire  	sys_rst_n,
		
		output 	reg		[5:0]	sel	,
		output	reg		[7:0]	seg
);
reg 	[24:0]		cnt;
reg 	[3:0]		data;
reg 				cnt_flag;

always@(posedge sys_clk or negedge sys_rst_n)
		if(sys_rst_n == 1'b0)
			cnt  <= 25'd0;
		else if(cnt == CNT_MAX)
			cnt <= 25'd0;
		else
			cnt <= cnt + 1'b1;
			
always@(posedge sys_clk or negedge sys_rst_n)
		if(sys_rst_n == 1'b0)
			cnt_flag <= 1'b0;
		else if(cnt == CNT_MAX-1)
			cnt_flag <= 1'b1;
		else
			cnt_flag <= 1'b0;

always@(posedge sys_clk or negedge sys_rst_n)
		if(sys_rst_n == 1'b0)
			data <= 4'd0;
		
		else if(cnt_flag == 1'b1)
			data <= data + 1'b1;
		else
			data <= data;


always@(posedge sys_clk or negedge sys_rst_n)
		if(sys_rst_n == 1'b0)
			sel <= 6'b000_000;
		else
			sel <= 6'b111_111;
			
always@(posedge sys_clk or negedge sys_rst_n)
		if(sys_rst_n == 1'b0)
			seg <= 8'hff;
		else 	case(data)
		4'd0 : seg  <=	8'hc0;
		4'd1 : seg  <=	8'hf9;
		4'd2 : seg  <=	8'ha4;
		4'd3 : seg  <=	8'hb0;
		4'd4 : seg  <=	8'h99;
		4'd5 : seg  <=	8'h92;
		4'd6 : seg  <=	8'h82;
		4'd7 : seg  <=	8'hf8;
		4'd8 : seg  <=	8'h80;
		4'd9 : seg  <=	8'h90;
		4'd10 : seg  <=	8'h88;
		4'd11 : seg  <=	8'h83;
		4'd12 : seg  <=	8'hc6;
		4'd13 : seg  <=	8'ha1;
		4'd14 : seg  <=	8'h86;
		4'd15 : seg	 <=	8'h8e;
		default seg <= 8'hff;
	endcase
	

endmodule

 第二部分74HC595 控制模块

fpga手册的数码管,fpga开发,学习

程序中的一些变量所表示的含义: 

cnt:分频计数器。这里我们让计数器在 0 和 3 之间循环计数,这样一个循环生成一个 时钟即为四分频时钟。

cnt_bit:传输位数计数器。我们知道我们需要传输 14bit 的数据,故我们需要一个数据 器对传输的位数进行计数,这样我们对传输完成 14 位数据就可以用这个计数器进行判别了。当 cnt 等于 3 时让 cnt_bit 计数器加 1,让其从 0 到 13 循环计数,每个数值 代表传输一位数据。

data:我们将需要传输的数码管信号寄存在 data 中,方便赋值。存储顺序是根据我们 传输的位数顺序由低到高位进行存储的,至于数码管各信号的传输顺序我们在硬件部分已 有所讲解。

ds:串行数据输出(对我们 FPGA 芯片来说其是输出,对 74HC595 来说其是输入, stcp 和 shcp 信号也是如此)。第二片的 Q5 引脚连到 了数码管的 DIG6,也就是最右侧的数码管,而我们最右侧数码管对应的是我们位选信号的 最低位,即 sel[0]。所以我们第一位应传输的数据为 sel[0],当一次数据传完之后再次回到状态 0 开始新一轮 的数码管信号传输。

shcp:移位寄存器时钟,上升沿时将数据写入移位寄存器中。我们在 ds 数据的中间状 态拉高产生上升沿,这样可以使 shcp 采得的 ds 数据更加稳定。

stcp:存储寄存器时钟。当我们 14 位数码管控制信号传输完之后我们需要拉高一个 stcp 时钟来将信号存入存储寄存器之中。最后一个数据是在 cnt_bit=13 且 cnt=2 时传输的, 所以我们就在下一个时钟(cnt_bit=13 且 cnt=3 时)将 stcp 拉高一个时钟产生上升沿即可。

oe:存储寄存器数据输出使能信号,低电平有效,这里我们将复位信号取反的值赋给 该信号即可。

module	hc595_crtl
(
		input 	wire  		sys_clk		,
		input 	wire		sys_rst_n	,
		input	wire [5:0]	sel			,
		input	wire [7:0]	seg			,
		
		output	reg 		stcp		,
		output 	reg			shcp		,
		output	reg			ds			,
		output	wire		oe
);
reg 	[1:0]	cnt_4;
reg		[3:0]	cnt_bit;	
wire	[13:0]	data;

assign 		data = {seg[0],seg[1],seg[2],seg[3],seg[4],seg[5],seg[6],seg[7],sel};

assign 		oe = 1'b0;

always@(posedge sys_clk or negedge sys_rst_n)
		if(sys_rst_n == 1'b0)
			cnt_4 <= 2'd0;
		else if(cnt_4 == 2'd3)
			cnt_4 <= 2'd0;
		else
			cnt_4 <= cnt_4 + 1'b1;
			
always@(posedge sys_clk or negedge sys_rst_n)
		if(sys_rst_n == 1'b0)
			cnt_bit <= 4'd0;
		else if(cnt_4 == 2'd3 && cnt_bit == 4'd13)
			cnt_bit <= 4'd0;
		else if(cnt_4 == 2'd3)
			cnt_bit <= cnt_bit + 1'b1;
		else
			cnt_bit <= cnt_bit;

always@(posedge sys_clk or negedge sys_rst_n)
		if(sys_rst_n == 1'b0)
			stcp <= 1'b0;
		else if(cnt_4 == 2'd3 && cnt_bit == 4'd13)
			stcp <= 1'b1;
		else
			stcp <= 1'b0;

always@(posedge sys_clk or negedge sys_rst_n)
		if(sys_rst_n == 1'b0)
			shcp <= 1'b0;
		else if (cnt_4 >= 4'd2)
			shcp <= 1'b1;
		else
			shcp <= 1'b0;

always@(posedge sys_clk or negedge sys_rst_n)
		if(sys_rst_n == 1'b0)
			ds <= 1'b0;
		else if (cnt_4 == 2'd0)
			ds <= data[cnt_bit];
		else
			ds <= ds;
endmodule

第三部分顶层模块综合:

module   seg_595_static
(
		input	wire 	sys_clk,
		input	wire	sys_rst_n,
		
		output 	wire	ds,
		output	wire 	shcp,
		output	wire 	stcp,
		output	wire    oe
);
wire  [5:0]	sel;
wire  [7:0] seg;



seg_static   seg_static_inst
(
			.sys_clk	(sys_clk),
			.sys_rst_n	(sys_rst_n),
		          
			.sel        (sel ),
			.seg        (seg )
);
hc595_crtl  hc595_crtl_inst
(
			.sys_clk		(sys_clk),
            .sys_rst_n		(sys_rst_n),
            .sel			(sel),
            .seg			(seg),
                         
            .stcp			(stcp),
            .shcp			(shcp),
            .ds				(ds),
            .oe             (oe )

);

endmodule 

编写仿真代码进行仿真验证

`timescale  1ns/1ns
module	tb_seg_595_static();

reg 	 sys_clk;
reg 	 sys_rst_n;

wire 	stcp;
wire	shcp;
wire	ds;
wire	oe;

initial		begin
	sys_clk = 1'b1;
	sys_rst_n <= 1'b0;
	#20
	sys_rst_n <= 1'b1;
end

always	 #10 sys_clk <= ~sys_clk;

defparam  	seg_595_static_inst.seg_static_inst.CNT_MAX =100;

seg_595_static		seg_595_static_inst
(
			.sys_clk	(sys_clk),
			.sys_rst_n	(sys_rst_n),
		          
			.stcp			(stcp),
			.shcp			(shcp),
			.ds				(ds),
			.oe             (oe )
);		
endmodule

     综合方正结果:

fpga手册的数码管,fpga开发,学习

与我们所想的基本一致

上板验证:

fpga手册的数码管,fpga开发,学习

给开发板上电,绑定FPGA管脚,下载成功后,开发板数码管六位会依次从111111到FFFFFF循环。

总结:

经过对这个实验的流程,系统层次化设计有一个深刻的感悟 !

 文章来源地址https://www.toymoban.com/news/detail-769152.html

到了这里,关于FPGA基本实验之数码管的静态显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 二、19【FPGA】数码管动态显示实验

    学习说明此文档为本人的学习笔记,注重实践,关于理论部分会给出相应的学习链接。 学习视频:是根据野火FPGA视频教程——第二十二讲 https://www.bilibili.com/video/BV1nQ4y1Z7zN?p=3 “天下武功唯快不破”    “看到的不一定为真” 眼睛的视觉暂留:光信号传入大脑需要短暂时间,

    2023年04月08日
    浏览(37)
  • FPGA极易入门教程----数码管篇(1)静态显示

            数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数一般分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管(多一个小数点显 示)。当然也还有一些其他类型的数码管如“N”形管、“米”字管以及工业科研领域用 的

    2024年02月05日
    浏览(43)
  • FPGA学习日志——74hc595驱动的数码管静态显示seg_595_static

    数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数一般分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管(多一个小数点显示)。 八段数码管是一个八字型数码管,分为八段:a、b、c、d、e、f、g、dp,其中dp为小数点,每一段即

    2024年02月08日
    浏览(117)
  • 【两周学会FPGA】从0到1学习紫光同创FPGA开发|盘古PGL22G开发板学习之数码管静态显示(四)

      本原创教程由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处 适用于板卡型号: 紫光同创PGL22G开发平台(盘古22K) 一:盘古22K开发板(紫光同创PGL22G开发平台)简介 盘古22K开发板是基于紫光同创Logos系列PGL22G芯片设计的一款FPGA开发板

    2024年02月10日
    浏览(48)
  • 静态数码管——FPGA

    环境: 1、Quartus18.0 2、vscode 3、板子型号:EP4CE6F17C8 要求: 六位数码管全选,每间隔0.5s轮流显示0~F。 静态与动态数码管: 静态数码管 : 在静态显示中,只考虑段选信号。在不同的时刻,各个位选信号保持不变,并根据真值表,选择要显示的数字或者字母。 动态数码管 :

    2024年02月16日
    浏览(44)
  • FPGA——静态数码管

    quartus 18.1 modelsim vscode Cyclone IV开发板 我们使用的数码管是8段数码管,每段是由led组成。通过控制每段led的亮灭,来控制数码管显示不同的数字和字母。 数码管分为共阴极和共阳极,共阳极数码管如图所示,a—dp为输入端,全部在二极管的负极,二极管的正极极共同接+5v(高电

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

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

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

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

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

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

    2024年04月15日
    浏览(37)
  • [FPGA 学习记录] 数码管动态显示

    数码管动态显示 在上一小节当中,我们对数码管的静态显示做了一个详细的讲解;但是如果单单只掌握数码管的静态显示这种显示方式是远远不够的,因为数码管的静态显示当中,被选中的数码位它们显示的内容都是相同的,这种显示方式在我们的实际应用当中显然是不合适

    2024年02月04日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包