FPGA学习—数码管显示

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

FPGA学习——数码管显示



结构框架

数码管动态显示采用了人眼暂存的原理,即时分复用,在数码管实现动态显示。
整个实验设计流程框架如下图所示:
FPGA学习—数码管显示


一、硬件设计

开发板采用共阳极数码管,即低电平点亮。
FPGA学习—数码管显示

二、verilog编写

1.计数器

本实验准备设计一个定时器,6为数码管显示24小时制的时间,所以编写一个计数模块。

module counter_10
#(
  parameter	COUNT = 4'd9
	)
(
  input             clk,
  input             rst_n,
  input             en,
  input             clr,
  
  output  reg[3:0]  count,
  output  reg       t
  );
  
always@(posedge clk or negedge rst_n)
begin 
 if(rst_n == 1'b0)
  begin
	count <= 4'd0;
	t <= 1'b0;
  end
 else if(clr == 1'b1)
  begin
	count <= 4'd0;
	t <= 1'b0;
  end 
 else if(en== 1'b1)
  if(count == COUNT)
    begin
	  count <= 4'd0;
	  t <= 1'b1;
    end 
  else
	begin
	  count <= count + 4'd1;
	  t <= 1'b0;
    end
 else
	begin
	 count <= count;
	 t <= 1'b0;
  end 
		
end
	
endmodule
	

改变变量COUNT的数值,可实现不同模的计数器。

2.译码模块

module seg_decoder
(
	input		[3:0]	bin_data,
	output	reg	[7:0]	seg_data
);

always@(*)
begin
	case(bin_data)
		4'd0:seg_data <= 8'b1100_0000;
		4'd1:seg_data <= 8'b1111_1001;
		4'd2:seg_data <= 8'b1010_0100;
		4'd3:seg_data <= 8'b1011_0000;
		4'd4:seg_data <= 8'b1001_1001;
		4'd5:seg_data <= 8'b1001_0010;
		4'd6:seg_data <= 8'b1000_0010;
		4'd7:seg_data <= 8'b1111_1000;
		4'd8:seg_data <= 8'b1000_0000;
		4'd9:seg_data <= 8'b1001_0000;
		4'ha:seg_data <= 8'b1000_1000;
		4'hb:seg_data <= 8'b1000_0011;
		4'hc:seg_data <= 8'b1100_0110;
		4'hd:seg_data <= 8'b1010_0001;
		4'he:seg_data <= 8'b1000_0110;
		4'hf:seg_data <= 8'b1000_1110;
		default:seg_data <= 8'b1111_1111;
	endcase
end

endmodule

将计数器的十进制数按照译码准则转换为8位二进制,控制数码管的段选位。

3.数码管扫描模块

module seg_scan
#(
	parameter SCAN = 13'd4999,
	parameter SEG  = 3'd5)
(
	input				clk,
	input				rst_n,
	input		[7:0]	seg_data0,
	input		[7:0]	seg_data1,
	input		[7:0]	seg_data2,
	input		[7:0]	seg_data3,
	input		[7:0]	seg_data4,
	input		[7:0]	seg_data5,
	
	output	reg[5:0]	seg_sel,
	output	reg[7:0]	seg_data
	);
reg [12:0]	timer;
reg [2:0]	seg;
	
always@(posedge clk or negedge rst_n)
if(rst_n == 1'b0)
	timer <= 13'd0;
else if(timer == SCAN)
	timer <= 13'd0;
else
	timer <= timer + 13'd1;
	
always@(posedge clk or negedge rst_n)
if(rst_n == 1'b0)
	seg <= 3'd0;
else if(seg == SEG && timer == SCAN)
	seg <= 3'd0;
else if(timer == SCAN)
	seg <= seg + 3'd1;
	
always@(posedge clk or negedge rst_n)
if(rst_n == 1'b0)
	begin
		seg_sel <= 6'b0000_00;
		seg_data <= 8'b0000_0000;
	end
else 
	case(seg)
		3'd0:
			begin 
				seg_sel <= 6'b0111_11;
				seg_data <= seg_data0;
			end
		3'd1:
			begin 
				seg_sel <= 6'b1011_11;
				seg_data <= seg_data1;
			end
		3'd2:
			begin 
				seg_sel <= 6'b1101_11;
				seg_data <= seg_data2;
			end
		3'd3:
			begin 
				seg_sel <= 6'b1110_11;
				seg_data <= seg_data3;
			end
		3'd4:
			begin 
				seg_sel <= 6'b1111_01;
				seg_data <= seg_data4;
			end
		3'd5:
			begin 
				seg_sel <= 6'b1111_10;
				seg_data <= seg_data5;
			end
		default:
			begin
				seg_sel <= 6'b1111_11;
				seg_data <= 8'b1111_1111;
			end
	endcase
	
endmodule
		

扫描时间间隔设为0.01ms,人眼无法捕捉0.01ms的变化,进而实现6位数码管”同时“显示。

4.顶层模块

module seg_test
#(
	parameter	SCAN = 13'd4999,
	parameter   SEG = 3'd5,
	parameter	BAUD = 32'd49999999
)
(
	input				clk,
	input				rst_n,
	
	output	[5:0]	seg_sel,
	output	[7:0]	seg_data
);

wire 		t0,t1,t2,t3,t4,t5;
wire[3:0]	count0,count1,count2,count3,count4,count5;
wire[7:0]	seg_data0,seg_data1,seg_data2,seg_data3,seg_data4,seg_data5;

reg t;
reg[25:0]	timer;

always@(posedge clk or negedge rst_n)
	if(rst_n == 1'b0)
	begin
		timer <= 26'd0;
		t <= 1'b0;
	end
	else if(timer == BAUD)
	begin
		timer <= 26'd0;
		t <= 1'b1;
	end
	else
	begin
		timer <= timer + 1'd1;
		t <= 1'b0;
	end			

counter_10
#(
  .COUNT(9)
	)counter_10_0
(
  .clk		(clk),
  .rst_n	(rst_n),
  .en		(t),
  .clr		(1'b0),
            
  .count	(count0),
  .t		(t0)
  );
  
counter_10
#(
  .COUNT(5)
	)counter_10_1
(
  .clk		(clk),
  .rst_n	(rst_n),
  .en		(t0),
  .clr		(1'b0),
            
  .count	(count1),
  .t		(t1)
  );
  
counter_10
#(
  .COUNT(9)
	)counter_10_2
(
  .clk		(clk),
  .rst_n	(rst_n),
  .en		(t1),
  .clr		(1'b0),
            
  .count	(count2),
  .t		(t2)
  );
  
 counter_10
#(
  .COUNT(5)
	)counter_10_3
(
  .clk		(clk),
  .rst_n	(rst_n),
  .en		(t2),
  .clr		(1'b0),
            
  .count	(count3),
  .t		(t3)
  );
  
 counter_10
#(
  .COUNT(3)
	)counter_10_4
(
  .clk		(clk),
  .rst_n	(rst_n),
  .en		(t3),
  .clr		(1'b0),
            
  .count	(count4),
  .t		(t4)
  );
  
   counter_10
#(
  .COUNT(2)
	)counter_10_5
(
  .clk		(clk),
  .rst_n	(rst_n),
  .en		(t4),
  .clr		(1'b0),
            
  .count	(count5),
  .t		(t5)
  );
  
seg_decoder	seg_decoder_0
(
	.bin_data(count0),
	.seg_data(seg_data0)
);
seg_decoder	seg_decoder_1
(
	.bin_data(count1),
	.seg_data(seg_data1)
);
seg_decoder	seg_decoder_2
(
	.bin_data(count2),
	.seg_data(seg_data2)
);
seg_decoder	seg_decoder_3
(
	.bin_data(count3),
	.seg_data(seg_data3)
);
seg_decoder	seg_decoder_4
(
	.bin_data(count4),
	.seg_data(seg_data4)
);
seg_decoder	seg_decoder_5
(
	.bin_data(count5),
	.seg_data(seg_data5)
);

seg_scan
#(
	.SCAN(SCAN),
	.SEG (SEG)
)seg_scan
(
	.clk		(clk),
	.rst_n		(rst_n),
	.seg_data0	(seg_data0),
	.seg_data1	(seg_data1),
	.seg_data2	(seg_data2),
	.seg_data3	(seg_data3),
	.seg_data4	(seg_data4),
	.seg_data5	(seg_data5),
	
	.seg_sel	(seg_sel),
	.seg_data	(seg_data)
	);
	
endmodule

实验结果

FPGA学习—数码管显示文章来源地址https://www.toymoban.com/news/detail-494332.html

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

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

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

相关文章

  • FPGA_数码管显示

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

    2024年01月23日
    浏览(46)
  • Intel FPGA:数码管显示

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

    2024年04月15日
    浏览(36)
  • FPGA(5)数码管静态显示与动态显示

    目录 一、数码管静态显示 二、数码管动态显示 1、变量定义 2、定时(60us) 3、动态显示 代码 FPGA的数码管有4位,8段 。( 位和段都是共阳,即低电平有效 )     位选的4位(二进制):分别为第1、2、3、4位数码管。 段选的8位(二进制):分别为第h、g、f、e、d、c、b、a段

    2023年04月12日
    浏览(40)
  • FPGA实战------数码管(1)静态显示

    led的花样点灯差不多了吧,接下来学习另一个基础的东西,数码管。 数码管在FPGA开发板上占得位置不小,在工程开发中也必不可少,比如后边的温度传感器就会用数码管来显示温度。这里先不多介绍温度传感器,过一段时间就会发了。本篇文章先用数码管来做静态显示。也

    2024年02月04日
    浏览(44)
  • FPGA基础设计之数码管显示

    数码管是一种半导体发光器件,其基本单元是发光二极管。一般分为七段数码管和八段数码管,多的一段是小数点。也有其他如N型、米型数码管以及16段、24段管等。本次设计的是八段数码管 公阴极数码管高电平亮,公阳极数码管低电平亮。AC620上搭载的是公阳极数码管。 数

    2023年04月26日
    浏览(46)
  • 二、19【FPGA】数码管动态显示实验

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

    2023年04月08日
    浏览(36)
  • FPGA学习之数码管时间显示模块

    在学习完小梅哥的串口通信以及数码管显示教程后,他留下了一个课后作业,也就是本次的数码管时间显示模块。作为一个FPGA新人,这也算是第一个比较完整的练手小项目了,也推荐和我一样的新人花时间去完成一下。总体功能虽然比较简单,但是我也花了小两天的时间去编

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

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

    2024年02月10日
    浏览(47)
  • FPGA基本实验之数码管的静态显示

    此实验基于FPGA征途pro开发板实现, 数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数一般分为七 段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管(多一个小数点显 示)。当然也还有一些其他类型的数码管如“N”形管、“米”字管

    2024年02月03日
    浏览(48)
  • FPGA基本实验之数码管的动态显示

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

    2024年02月08日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包