【FPGA——Cyclone Ⅳ学习笔记】五.数码管静态显示(EP4CE6F17C8)

一.原理图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过第一张数码管的原理图可知,6根位选的信号线与PNP三极管相连然后再控制数码管的位选。当位选的I/O口为低电平时,三极管导通,数码管对应的位被点亮。如果了解数码管的结构原理便可通过位选的电路结构知道,此数码管为共阳极,因此段选的I/O口为低电平时,数码管对应的段会被点亮
注:此开发板连接方式是位选的低位在左,高位在右

二.代码和注释

此代码用于实现数码管的静态显示,即六个位显示的数字相同。每经过0.5s数码管显示加1(0~F)。
顶层结构图
在这里插入图片描述

1.time_count.

定时器模块。

module time_count
(
	input      sys_clk,
	input	   sys_rst_n,
	
	output reg change_flag	//数码管改变信号,每0.5秒给出一个信号
);

parameter max_count = 25'd25_000_000;	//定时0.5s

reg[24:0] count;	//计数器

always @(posedge sys_clk or negedge sys_rst_n)
begin
	if(sys_rst_n==0)
	begin
		change_flag <= 1'b0;
		count <= 24'b0;
	end	
	else if(count<max_count-1'b1)
	begin
		count <= count + 1'b1;
		change_flag <= 1'b0;	
	end	
	else
	begin
		count <= 24'b0;
		change_flag <= 1'b1;	//0.5s给出高电平的数码管改变信号
	end
end
endmodule 

2.smg_display.v

数码管显示模块:默认情况下6个位全部打开,并显示相同的数字

module smg_display
(
	input 			 sys_clk,
	input 			 sys_rst_n,
	
	input		     change_flag,	//由定时器模块输出的数码管改变信号
	output reg [5:0] smg_wei,	//数码管位选输出 
	output reg [7:0] smg_duan	//数码管段选输出
);

reg [4:0] num;	//数码管显示的数(0~F)

always @(posedge sys_clk or negedge sys_rst_n)
begin
	if(sys_rst_n==0)
		smg_wei <= 6'b111111;
	else
		smg_wei <= 6'b000000;	//数码管6个位全部打开
end

always @(posedge sys_clk or negedge sys_rst_n)
begin
	if(sys_rst_n==0)
		num <= 4'h0;
	else if(change_flag)
	begin
		if(num < 4'hf)
			num <= num + 1'b1;	//每个数码管改变信号到来显示数值加1
		else
			num <= 4'h0;	//大于F后从0重新开始
	end
	else
		num <= num;
end

always @(posedge sys_clk or negedge sys_rst_n)
begin
	if(sys_rst_n==0)
		smg_duan <= 8'b0;
	else 
	begin
		case(num)	//数字所对应的段码
			4'h0 :    smg_duan <= 8'b1100_0000;
			4'h1 :    smg_duan <= 8'b1111_1001;
			4'h2 :    smg_duan <= 8'b1010_0100;
			4'h3 :    smg_duan <= 8'b1011_0000;
			4'h4 :    smg_duan <= 8'b1001_1001;
			4'h5 :    smg_duan <= 8'b1001_0010;
			4'h6 :    smg_duan <= 8'b1000_0010;
			4'h7 :    smg_duan <= 8'b1111_1000;
			4'h8 :    smg_duan <= 8'b1000_0000;
			4'h9 :    smg_duan <= 8'b1001_0000;
			4'ha :    smg_duan <= 8'b1000_1000;
			4'hb :    smg_duan <= 8'b1000_0011;
			4'hc :    smg_duan <= 8'b1100_0110;
			4'hd :    smg_duan <= 8'b1010_0001;
			4'he :    smg_duan <= 8'b1000_0110;
			4'hf :    smg_duan <= 8'b1000_1110;
			default : smg_duan <= 8'b1100_0000;
		endcase
	end
end
endmodule			

3.smg_test.v

主模块

module smg_test
(
	input		 sys_clk,
	input		 sys_rst_n,
	
	output [5:0] smg_wei,	//位选输出
	output [7:0] smg_duan	//段选输出
);

parameter MAX_TIME = 25'd25_000_000;	//定时器定时时间:25_000_000*0.02us=0.5s
wire change_flag;	//数码管显示改变标记

//实例化
time_count
#(
	.max_count  	(MAX_TIME)
) 
u_time_count
(
	.sys_clk	   	(sys_clk),
	.sys_rst_n  	(sys_rst_n),
	.change_flag	(change_flag)
);

smg_display u_smg_display
(
	.sys_clk	    (sys_clk),
	.sys_rst_n   	(sys_rst_n),
	
	.change_flag 	(change_flag),
	.smg_wei		(smg_wei),
	.smg_duan	 	(smg_duan)
);

endmodule	

引脚配置:
在这里插入图片描述

  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

默默无闻小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值