FPGA实战2-数码管实验verilog

该代码实现了一个基于50MHz系统时钟的数码管控制器,利用12位拨码开关控制6位数码管的显示。通过1000Hz的分频器产生刷新信号,并根据拨码开关的两两组合确定数码管的段码和位码。数码管的位码部分采用共阴极显示,通过不同的位码选择不同数码管位置,段码部分则根据拨码开关的值来决定显示数字。设计中还包含了对数码管数值和位数的判断逻辑,确保正确显示拨码开关所设置的数值。
摘要由CSDN通过智能技术生成

1.实验要求

1)系统时钟频率为50MHZ
(2)刷新时钟频率为1000HZ
(3)使用12位的拨码开关sw,两两做为一组,实现对六位数码管的控制显示
(4)数码管的显示有段码(seg)和位码(an)两个部分,段码的部分是显示数码管的数字,位码的部分显示数码管的位置,位码采用共阴极的显示。

在这里插入图片描述

2.代码设计

//实质是输入拨码开关,显示数码管的数值
module smg(
	input clk,
	input [11:0] sw,    //12位的拨码开关
	output [7:0] seg,   //8位的段码
	output [5:0] an		//6位的位码	
);

reg [14:0] cnt = 15'b0;
reg divclk = 0;
reg [1:0] disp_dat; //显示的数值,如何理解呢,虽然数码管能显示0到F但是两个拨码开关也最多拨到11,也就是3.
reg [2:0] disp_bit; //显示的位,最多位6,所以[2:0]
parameter half_cntvalue = 25000; //1000HZ分频

//1000Hz的分频器
always @ (posedge clk )begin
	if(cnt ==half_cntvalue)
	begin
		divclk <= ~divclk;
		cnt <= 0;
	end
	else
		cnt <= cnt + 1'b1;
end

//对于当前的显示的位数进行判断,位数最多6位,当是第一位的时候,位码为多少,数值为那几个开关的值。
always @ (posedge clk )begin
	if(disp_bit > 5)
		disp_bit <= 0;
	else
		disp_bit <= disp_bit + 1;
	case(disp_bit)
		0:begin
			disp_dat = sw[1:0];
			an = 6'b111110;
		end
		1:begin
			disp_dat = sw[3:2];
			an = 6'b111101;
		end
		2:begin
			disp_dat = sw[5:4];
			an = 6'b111011;
		end
		3:begin
			disp_dat = sw[7:6];
			an = 6'b110111;
		end
		4:begin
			disp_dat = sw[9:8];
			an = 6'b101111;
		end		
		5:begin
			disp_dat = sw[11:10];
			an = 6'b011111;
		end
		defalut:begin
			disp_dat = 0;
			an = 6'b111111;
		end
	endcase
end

//对数值进行判断,开关的数值是多少时,段码所代表的值为多少,赋给显示值,让其显示
always @ (disp_dat)
begin
	case(disp_dat)
		0:seg = 8'h3f;
		1:seg = 8'h06;
		2:seg = 8'h3b;
		3:seg = 8'h4f;
	endcase
end

endmodule
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

马志高

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

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

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

打赏作者

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

抵扣说明:

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

余额充值