FPGA学习笔记(四)------静态数码管

//***********Copyright (c)************//
//-------------------------------------
// File name:           my_seg_led_static
// Last modified Date:  2020/6/18 18:30
// Last Version:        V1.1
// Descriptions:        静态数码管
//-------------------------------------
// 引脚分配,6位8段数码管
// sys_clk    	input	 E1
// sys_rst_n   input	 M1
//	sel[0] 		output N16 数码管位选0
//	sel[1] 		output N15 数码管位选1
//	sel[2] 		output P16 数码管位选2
//	sel[3] 		output P15 数码管位选3
//	sel[4] 		output R16 数码管位选4
//	sel[5] 		output T15 数码管位选5
//	seg_led[0] output  M11 数码管段选a
//-------------------------------------
//*************************************//

//顶层代码如下
module my_seg_led_static_top
(
	input sys_clk,
	input sys_rst_n,
	
	output [5:0] sel,   //定义位选
	output [7:0] seg_led  //定义段选
);

//parameter define
parameter TIME_SHOW = 25'd25000_000;

//wire define 
wire add_flag;

//**************************************
//**				 main code
//**************************************

//程序例化
seg_led_static u_seg_led_static (
//modele clock
	.sys_clk 			(sys_clk ), // 模块时钟信号
	.sys_rst_n 		(sys_rst_n), // 复位信号(低有效)
//seg_led interface
	.sel 			(sel ), //数码管显示控制
	.seg_led 	(seg_led ), //数码管显示的数据
	.add_flag	(add_flag ) // 数值增1标志信号
);

time_counter #(.MAX_NUM(TIME_SHOW)
	) u_time_counter(
	//system clock
	.sys_clk 			(sys_clk ), // 时钟信号
	.sys_rst_n 		(sys_rst_n), // 复位信号
	//user interface
	.flag 		(add_flag ) // 数值增1标志信号
	);
	
endmodule
//计时模块代码如下
module	time_counter
(
input	sys_clk,
input	sys_rst_n,

output	reg	flag  //计数器标志
);

//parmeter define
parameter	MAX_NUM=25000_000; //参数型常量
										//计数器最大值,定时0.5s
//reg	define
reg	[24:0]	counter	;			//时钟分频计数器 25位

//**************************************
//**				 main code
//**************************************
					
always @(posedge sys_clk or negedge sys_rst_n)
begin 
	if(!sys_rst_n)begin  //如果复位
		flag<=1'b0;  		//复位标志归0 
		counter<=25'b0;  //计数器重赋0
	end
	else if(counter=MAX_NUM-1'b1
		flag<=1'b1;
		counter<=25'b0;
	end
end

endmodule
//数码管静态显示代码
module seg_led_static
(
	input sys_clk,
	input sys_rst_n,
	input add_flag,
	
	output reg [5:0]	sel,      //6位数码管位选
	output reg [7:0]	seg_led	 //8位数码管段选
);

//reg define
reg [3:0] num;		//数码管显示的数字 0-F 4位表示16个数字

//**************************************
//**				 main code
//**************************************

//控制数码管位选(低电平有效)
always @ (posedge sys_clk or negedge sys_rst_n)begin
	if(!sys_rst_n)      //如果复位
		sel<=6'b111111;       //全灭
	else
		sel<=6'b000000;		 //全亮  
end

//每间隔0.5s(flag<=1),累加1
always @ (posedge sys_clk or negedge sys_rst_n)begin
	if(!sys_rst_n)					//如果复位
	num <=4'h0;       			//复位则显示0
	else if(add_flag) begin		//计数标志为1
		if(num<=4'hf)
			num<=num+1'b1;
		else
			num<=4'h0;
	end
	else
	num<=num;				//计数时间未到则保持
end

//段选信号代码 共阳数码管(低电平有效)
always @ (posedge sys_clk or negedge sys_rst_n)begin
	if(!sys_rst_n)
		seg_led<=8'b0;
	else begin
		case (num)       //定义数码管段码值
			 4'h0 : seg_led <= 8'b1100_0000;
			 4'h1 : seg_led <= 8'b1111_1001;
			 4'h2 : seg_led <= 8'b1010_0100;
			 4'h3 : seg_led <= 8'b1011_0000;
			 4'h4 : seg_led <= 8'b1001_1001;
			 4'h5 : seg_led <= 8'b1001_0010;
			 4'h6 : seg_led <= 8'b1000_0010;
			 4'h7 : seg_led <= 8'b1111_1000;
			 4'h8 : seg_led <= 8'b1000_0000;
			 4'h9 : seg_led <= 8'b1001_0000;
			 4'ha : seg_led <= 8'b1000_1000;
			 4'hb : seg_led <= 8'b1000_0011;
			 4'hc : seg_led <= 8'b1100_0110;
			 4'hd : seg_led <= 8'b1010_0001;
			 4'he : seg_led <= 8'b1000_0110;
			 4'hf : seg_led <= 8'b1000_1110;
			 default : seg_led <= 8'b1100_0000;
		endcase			
	end
end
endmodule

你可能感兴趣的:(FPGA)