FPGA之数码管

module seg7(clk,rst,sel,seg,num);
input clk;
input rst;
output reg[3:0] sel;
output reg[7:0] seg;
output reg[3:0] num;
reg[31:0] counter_5kHz;
reg[31:0] counter_1Hz;
reg[1:0] pos;
always@(posedge clk or negedge rst)
	begin
		if(!rst)
		begin
		seg<=8'b0000_0000;         //复位键按下,初始化
		sel<=4'b1111;
		counter_1Hz<=0;
		counter_5kHz<=0;
		num<=0;
		pos<=0;
	end
	
	else
	begin
		if(counter_1Hz<5000_0000)        //显示数据刷新控制
													//未达到计数值,数据保持且计数器加一
		begin
			counter_1Hz<=counter_1Hz+1;
		end
		else
		begin
			num<=num+1;
			counter_1Hz<=0;
		end
		
		case(num)               //判断数据值,将对应数码管显示编码赋给段选端口
			
			4'b0000:seg<=8'b0011_1111;
			4'b0001:seg<=8'b0000_0110;
			4'b0010:seg<=8'b0101_1011;
			4'b0011:seg<=8'b0100_1111;
			4'b0100:seg<=8'b0110_0110;
			4'b0101:seg<=8'b0110_1101;
			4'b0110:seg<=8'b0111_1101;
			4'b0111:seg<=8'b0000_0111;
			4'b1000:seg<=8'b0111_1111;
			4'b1001:seg<=8'b0110_1111;
			4'b1010:seg<=8'b0111_0111;
			4'b1011:seg<=8'b0111_1100;
			4'b1100:seg<=8'b0011_1001;
			4'b1101:seg<=8'b0101_1110;
			4'b1110:seg<=8'b0111_1001;
			4'b1111:seg<=8'b0111_0001;
			default:seg<=8'b0000_0000;
		endcase
		if(counter_5kHz<1_0000)
		
		begin
			counter_5kHz<=counter_5kHz+1;
		end
		else
		begin
			pos<=pos+1;
			counter_5kHz<=0;
		end
		case(pos)			//判断数码管位选控制信号
			2'b00:sel<=4'b1110;
			2'b01:sel<=4'b1101;
			2'b10:sel<=4'b1011;
			2'b11:sel<=4'b0111;
			default:sel<=8'b1111;
		endcase
	end
end
endmodule
		
		
		
`timescale 1ns/1ps                       //测试代码
module seg7_tb;
	reg clk;										//时钟
	reg rst;										//复位
	wire[3:0] sel;								//位选端口
	wire[7:0] seg;								//段选端口
	wire[3:0] num;                      //数据输出端口
	initial begin
		clk = 0;
		rst = 0;
	#20 rst = 1;
	end
	
	always #10 clk = ~clk;
	seg7 i(
				.clk(clk),
				.rst(rst),
				.sel(sel),
				.seg(seg),
				.num(num)
				);
endmodule

 

仿真结果图:

你可能感兴趣的:(FPGA)