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

本文介绍了一种基于Verilog的数码管静态显示设计方案,通过定时器模块实现每0.5秒数码管显示数字递增(0~F),适用于共阳极数码管。文章详细解析了定时器模块和数码管显示模块的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.原理图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过第一张数码管的原理图可知,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	

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

### EP4CE6F17C8 芯片原理图与技术资料概述 EP4CE6F17C8 是一款属于 Altera Cyclone IV 系列的 FPGA 芯片。为了深入了解其设计和使用方法,开发者通常需要参考芯片的原理图、用户手册以及数据手册等技术文档。 #### 原理图 EP4CE6F17C8 的原理图详细展示了芯片的电路连接和设计[^1]。通过这份原理图,开发者可以清晰地了解以下关键信息: - **引脚功能**:每个引脚的具体用途及其对应的信号类型。 - **电源连接**:芯片所需的供电电压及连接方式。 - **信号传输路径**:输入输出信号的流向及其与其他外围设备的接口设计。 #### 用户手册 用户手册提供了 EP4CE6F17C8 芯片的详细使用说明和操作指南[^2]。手册中通常包含以下内容: - **配置流程**:如何对 FPGA 进行初始化和编程。 - **时序参数**:芯片运行时的关键时序要求,例如时钟频率、信号延迟等。 - **接口规范**:支持的外设接口及其具体实现方法。 #### 数据手册 数据手册是芯片技术规格的核心文档,涵盖了所有必要的技术细节。对于 EP4CE6F17C8,数据手册通常包括以下内容: - **电气特性**:芯片的工作电压范围、功耗、电流限制等。 - **逻辑资源**:内部逻辑单元的数量、可用 RAM 块、DSP 模块等。 - **封装信息**:芯片的物理尺寸及引脚排列。 - **温度范围**:芯片在不同环境下的工作温度区间。 #### 获取资源 上述文档可以通过以下途径获取: - **官方资源**:访问 Altera(现为 Intel FPGA)官网,搜索 EP4CE6F17C8 的相关文档。 - **第三方仓库**:如引用中提到的资源文件 `EP4CE6F17C8原理图+用户手册.zip`[^1],包含原理图和用户手册。 - **学习笔记**:一些开发者分享的学习笔记也提供了部分技术细节,例如数码管静态显示实验[^4] 和 IIC 驱动 EEPROM 实现[^5]。 ```python # 示例代码:读取 EP4CE6F17C8 数据手册中的时钟分频系数计算 CLK_FREQ = 50_000_000 # 系统时钟频率 (Hz) I2C_FREQ = 250_000 # I2C 时钟频率 (Hz) def calculate_clk_divide(clk_freq, i2c_freq): return (clk_freq // i2c_freq) >> 3 clk_divide = calculate_clk_divide(CLK_FREQ, I2C_FREQ) print(f"分频系数: {clk_divide}") ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

默默无闻小菜鸡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值