FPGA - 231227 - 课程设计 - 5CSEMA5F31C6 - 电子万年历

基于FPGA的电子万年历课程设计
  • TAG - F P G A 、 V e r i l o g 、课程设计、 5 C S E M A 5 F 31 C 6 、电子万年历 FPGA、Verilog、课程设计、5CSEMA5F31C6、电子万年历 FPGAVerilog、课程设计、5CSEMA5F31C6、电子万年历

  • 顶层模块
module TOP(
	input CLK,RST,inA,inB,inC,switch_alarm,
	output led,beep_led,
	output [41:0] dp
);

// 按键消抖模块
wire 			keyA_turn, keyB_turn, keyC_turn;             

// 按键处理模块
wire     	select_sign;
wire [1:0]	flag_turn;
wire [1:0] 	flag_switch;

wire     	year_add, month_add, day_add;
wire			hour_add, minute_add, second_add;
wire      	alarm_hour_add, alarm_minute_add, alarm_second_add;

// 时钟模块
wire [6:0] 	year;
wire [4:0] 	day;
wire [3:0] 	month;

wire [4:0] 	hour;
wire [5:0] 	minute;
wire [5:0] 	second;

// 数码管显示模块
wire [32:0]	digital_clock;

// 闹钟模块
wire [4:0]	alarm_hour; 
wire [5:0]	alarm_minute; 
wire [5:0]	alarm_second;
							
//按键消抖模块
right_key rk_A(
	.clk			(CLK),
	.rst_n		(RST),
	.key_in		(inA),
	.key_flag	(keyA_turn)
);
right_key rk_B(
.clk        	(CLK),
.rst_n      	(RST),
.key_in      	(inB),
.key_flag   	(keyB_turn)
);
right_key rk_C(
.clk        	(CLK),
.rst_n      	(RST),
.key_in     	(inC),
.key_flag  		(keyC_turn)
);

//按键处理模块
sel_add eg_sel_add(
.clk           	(CLK),
.rst_n          	(RST),

.key_turn      	(keyA_turn),
.key_switch     	(keyB_turn),
.key_add       	(keyC_turn),

.select_sign    	(select_sign),
.flag_turn     	(flag_turn),
.flag_switch  		(flag_switch),

.second_add     	(second_add), 
.minute_add    	(minute_add), 
.hour_add      	(hour_add),    
.day_add        	(day_add),    
.month_add     	(month_add),  
.year_add      	(year_add),   
.alarm_second_add	(alarm_second_add), 
.alarm_minute_add	(alarm_minute_add), 
.alarm_hour_add 	(alarm_hour_add)    
);

// 时钟模块
clock eg_clock(
.clk              	(CLK),
.rst_n            	(RST),

.select_sign     		(select_sign),

.second_add      		(second_add),
.minute_add        	(minute_add),
.hour_add          	(hour_add),
.day_add           	(day_add),
.month_add          	(month_add),
.year_add          	(year_add),

.hour               	(hour),
.minute             	(minute),
.second            	(second),
.day              	(day),
.month              	(month),
.year              	(year)
);

// 数码管显示模块
display eg_display(
.CLK	             	(CLK),
.RST  	           	(RST),

.flag_turn        	(flag_turn),
.flag_switch       	(flag_switch),

.alarm_h		        	(alarm_hour),
.alarm_m		      	(alarm_minute),
.alarm_s		      	(alarm_second),

.year              	(year),
.month             	(month),
.day               	(day),
.h		              	(hour),
.m		            	(minute),
.s		            	(second),

.dp		           	(dp)
);

// 闹钟模块
alarm eg_alarm(
.clk              	(CLK),
.rst_n           		(RST),

.switch_alarm     	(switch_alarm),
.second           	(second),
.minute            	(minute),
.hour              	(hour),
.alarm_second_add  	(alarm_second_add), 
.alarm_minute_add 	(alarm_minute_add), 
.alarm_hour_add   	(alarm_hour_add),
			
.led              	(led),	
.beep_led          	(beep_led),	

.alarm_second     	(alarm_second),
.alarm_minute      	(alarm_minute),
.alarm_hour       	(alarm_hour)             
);
endmodule 
  • 按键消抖模块
// 按键消抖模块
module right_key
#(parameter WIDTH = 20'd999_999)		
(
input				clk,rst_n,key_in,
output	reg 	key_flag
);
reg[19:0]	CNT_20MS;
always @(posedge clk or negedge rst_n) begin
	if(!rst_n) 						CNT_20MS<=20'd0;
	else if(key_in==1'b1) 		CNT_20MS<=20'd0;
	else if(CNT_20MS==WIDTH) 	CNT_20MS<=WIDTH;
	else 								CNT_20MS<=CNT_20MS+1;
end
 
always @(posedge clk or negedge rst_n) begin
	if(!rst_n) 						key_flag<=1'b0;
	else if(CNT_20MS==WIDTH-1) key_flag<=1'b1;
	else 								key_flag<=1'b0;
end

endmodule
  • 按键处理模块
// 按键处理模块
module sel_add(
input clk, rst_n,

input key_turn,
input key_switch,
input key_add,

output select_sign,
output reg [1:0] flag_switch,
output reg [1:0] flag_turn,

output reg second_add, minute_add, hour_add, day_add, month_add, year_add,
output reg alarm_second_add, alarm_minute_add, alarm_hour_add
);
 
reg [3:0] flag_add=0;	
reg [1:0] turn_state=0,turn_next_state=0;  //翻页状态机(分别是输出、现态、次态)
reg [1:0] switch_state=0,switch_next_state=0;//当前选择数码管状态机
 
assign select_sign=(flag_add==4'b0000);

// 1
//页面切换的状态机
	//次态电路
	always@(negedge key_turn or negedge rst_n) 
	
	begin
		if(!rst_n) turn_next_state=2'b00;
		else
			case(turn_state)
			2'b00:turn_next_state=2'b01;
			2'b01:turn_next_state=2'b10;
			2'b10:turn_next_state=2'b00;
			default:turn_next_state=2'b00;
			endcase
	end
	//次态到现态转换
	always@(posedge clk or negedge rst_n)
	begin
		if(!rst_n)  turn_state<=2'b00;
		else        turn_state<=turn_next_state;
	end
	//输出电路
	always@(rst_n or turn_state)
	begin
		if(!rst_n)  flag_turn= 2'b00;
		else
			case(turn_state)
			2'b00:flag_turn=2'b00;
			2'b01:flag_turn=2'b01;
			2'b10:flag_turn=2'b10;
			default:flag_turn=2'b00;
			endcase
	end

// 2
//数码管闪烁选择的状态机
	//次态电路
	always@(negedge key_switch or negedge rst_n) 
	
	begin
		if(!rst_n) switch_next_state=2'b00;
		else
			case(switch_state)
			2'b00:switch_next_state=2'b01;
			2'b01:switch_next_state=2'b10;
			2'b10:switch_next_state=2'b11;
			2'b11:switch_next_state=2'b00;
			default:switch_next_state=2'b00;
			endcase
	end
	//次态-->现态转换
	always@(posedge clk or negedge rst_n)
	begin
		if(!rst_n)  switch_state<=2'b00;
		else        switch_state<=switch_next_state;
	end
	//输出电路
	always@(rst_n or switch_state)
	begin
		if(!rst_n)  flag_switch= 2'b00;
		else
			case(switch_state)
			2'b00:flag_switch=2'b00;
			2'b01:flag_switch=2'b01;
			2'b10:flag_switch=2'b10;
			2'b11:flag_switch=2'b11;
			default:switch_next_state=2'b00;
			endcase
	end

// 3
	//增一选择项目
	always@(turn_state or switch_state or rst_n) 
	begin
		if(!rst_n)
### 获取5CSEMA5F31C6 FPGA的引脚分布图及数据手册 要获取**Altera(现Intel)5CSEMA5F31C6**型号FPGA的**引脚分布图(Pinout Diagram)**和完整的技术规格文档(datasheet),建议通过以下官方渠道进行查找: 该型号属于**Cyclone V SoC FPGA**系列,封装为**FBGA-484**[^1]。用户可以通过访问Intel FPGA官方网站或使用其设计工具**Quartus Prime**来查看详细的引脚定义、电气特性以及功能描述。 --- ### 从Intel FPGA官网获取资料 前往Intel FPGA产品页面: [https://www.intel.cn/content/www/cn/en/products/programmable/fpga/cyclone-v.html](https://www.intel.cn/content/www/cn/en/products/programmable/fpga/cyclone-v.html) 在该页面中可以找到如下资源: - **5CSEMA5F31C6 Datasheet**:包含完整的电气参数、封装尺寸、I/O标准支持等信息。 - **Pinout Guide**:提供详细的引脚分配表,包括电源、地、时钟、复位、HPS接口、通用I/O等功能引脚的具体编号与用途说明[^2]。 - **User Guide for Cyclone V SoC**:涵盖硬件开发流程、配置方式、调试接口等内容。 --- ### 使用Quartus Prime软件查看引脚图 Intel Quartus Prime是官方提供的FPGA开发套件,它不仅支持综合与布局布线,还集成了引脚规划工具(Pin Planner),可用于查看和编辑器件的引脚分配。 #### 查看步骤如下: 1. 安装并启动**Intel Quartus Prime**(推荐使用Pro Edition以获得完整功能支持)。 2. 创建一个新项目,并选择目标器件为`5CSEMA5F31C6`. 3. 打开菜单栏中的`Assignments > Pin Planner`,即可看到该器件的完整引脚分布图及其当前配置状态。 4. 在“Location”列可查看每个引脚的物理编号,例如`A1`, `B2`等;在“I/O Standard”列可设置电压标准,如`LVCMOS 1.8V`、`SSTL-15`等[^3]。 --- ### 常见引脚类型与功能说明 - **Power and Ground Pins (VCC, GND)**:用于供电与接地,确保芯片正常工作。 - **Clock Inputs (CLK)**:支持外部晶振输入,通常连接至内部PLL进行频率合成。 - **Configuration Pins**:用于控制配置模式,如JTAG、主动串行(AS)、被动串行(PS)等。 - **HPS Interface Pins**:包括DDR控制器、SD卡接口、USB OTG、SPI、UART等专用信号线。 - **General Purpose I/O (GPIO)**:支持多种I/O标准,适用于用户自定义功能扩展[^4]。 --- ### 示例:在Quartus中导出引脚分配文件 ```tcl # 导出引脚分配到CSV文件 export_assignments -output_file output_files/pin_assignment.csv ``` 此命令可在Tcl Console中执行,将当前项目的引脚配置导出为CSV格式,便于后续查阅或导入其他项目中使用。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值