基于VerilogHDL的学号显示

基于VerilogHDL的学号显示

一、准备工作:
环境软件:quartus II 9.0
编写语言:VerilogHDL
开发板:Cyclone II FPGA 2C70

二、功能要求:
1)用八个数码管显示;
2)学号按照10hz 的时钟的节拍从右而左进入,从学号的高位开始进入;
3)8位学号全部进入后停顿5秒,然后全部熄灭,再重新开始;

三、要求:
1)设计要用状态机
2)信号源模块输出10hz的基准时钟,用于同步学号显示。
3)设计应有学号的BCD码和7段码输出,仿真波形要有BCD 码学号
学号构成: 2000 + 学号后4 位

四、顶层设计
原理图的顶层设计
五、底层基于VerligHDL的编写
①状态机__学号编码__数码管控制程序

//程序功能:数码管显示学号
module display_shumaguan
(
	clk,
	q1, q2, q3, q4, q5, q6, q7, q8,
	state
);

input clk;
output reg [3:0] q1, q2, q3, q4, q5, q6, q7, q8;	//输出给译码器进行译码,用于学号输出的输出端

integer 	i =  1'd 0;			//用于延时,给脉冲计数的临时变量
output integer state = 4'b 0000;	//状态变化

//学号:20000131的二进制码
parameter 	temp_1 = 4'b 0010, temp_2 = 4'b 0000,temp_3 = 4'b 0000,temp_4 = 4'b 0000,
			temp_5 = 4'b 0000, temp_6 = 4'b 0001,temp_7 = 4'b 0011,temp_8 = 4'b 0001;


//给9种状态进行编码,S0--S8
parameter 	S0 = 4'b 0000, S1 = 4'b 0001, S2 = 4'b 0010, S3 = 4'b 0011, 
			S4 = 4'b 0100, S5 = 4'b 0101, S6 = 4'b 0110, S7 = 4'b 0111, 
			S8 = 4'b 1000;


always @(posedge clk)
begin
		case(state)
			S0: 	//初始状态,输出全为1,使数码管熄灭
			begin
				state <= S1;
				q1 = 4'b 1111; q2 = 4'b 1111; q3 = 4'b 1111; q4 = 4'b 1111; 
				q5 = 4'b 1111; q6 = 4'b 1111; q7 = 4'b 1111; q8 = 4'b 1111;
			end

			//分别把学号的二进制数,随着状态的转移,依次输出
			S1: 
			begin
				q1 = temp_1; 
				state <= S2;
			end

			S2: 
			begin
				q2 = temp_1;q1 = temp_2; 
				state <= S3;
			end

			S3: 
			begin
				q3 = temp_1; q2 = temp_2;q1 = temp_3; 
				state <= S4;
			end

			S4: 
			begin
				q4 = temp_1; q3 = temp_2; q2 = temp_3; q1 = temp_4;
				state <= S5;
			end

			S5: 
			begin
				q5 = temp_1; q4 = temp_2; q3 = temp_3; q2 = temp_4;
				q1 = temp_5; 
				state <= S6;
			end

			S6: 
			begin
				q6 = temp_1; q5 = temp_2; q4 = temp_3; q3 = temp_4;
				q2 = temp_5;q1 = temp_6; 
				state <= S7;
			end

			S7: 
			begin
				q7 = temp_1; q6 = temp_2; q5 = temp_3; q4 = temp_4;
				q3 = temp_5; q2 = temp_6; q1 = temp_7;
				state <= S8;
			end

			S8: 
			begin
			end
				if(i >= 50)		//计数50个上升沿后,再转移到S0状态,即延时5s
				begin
					state <= S0;
					i = 0;
				end
				else
				begin
					i= i + 1;
					q8 = temp_1; q7 = temp_2; q6 = temp_3; q5 = temp_4;
					q4 = temp_5; q3 = temp_6; q2 = temp_7; q1 = temp_8;
				end
				 
			end

			default: 
			begin
				q1 = 4'b 1111; q2 = 4'b 1111; q3 = 4'b 1111; q4 = 4'b 1111; 
				q5 = 4'b 1111; q6 = 4'b 1111; q7 = 4'b 1111; q8 = 4'b 1111;
			end
		endcase
end
endmodule

②50MHz频率转换为10Hz时钟输出程序

//分模块功能:50M_10Hz分频
module fenpin_50M_10
(
	clk_in, 	//时钟输入端
	rst,		//时钟复位端
	clk_out		//时钟输出端
);

input clk_in, rst;
output reg clk_out;

reg [25:0] cnt;		//时钟计数

always @(posedge clk_in or negedge rst) 
begin
	if (!rst)
		cnt <= 26'b 0;
	else
	begin
		cnt = cnt + 1'b 1;

		if(cnt == 5000000)
			cnt <= 1'b 0;
		else if(cnt < 2500000)
			clk_out = 1'b 0;
		else if(cnt >= 2500000)
			clk_out = 1'b 1;
	end
end
endmodule

③7447译码器程序

//分模块功能:7447译码器
module decoder_7447
(
	in,
	out,
	en
);

input [3:0]in, en;
output reg [6:0] out;

always @(*) 
begin
	if(!en)
		out = 7'b 111_1111;
	else 
	begin
		case(in)
			4'b 0000: out = 7'b 000_0001;
			4'b 0001: out = 7'b 100_1111;
			4'b 0010: out = 7'b 001_0010;
			4'b 0011: out = 7'b 000_0110;
			4'b 0100: out = 7'b 100_1100;
			4'b 0101: out = 7'b 010_0100;
			4'b 0110: out = 7'b 110_0000;
			4'b 0111: out = 7'b 000_1111;
			4'b 1000: out = 7'b 000_0000;
			4'b 1001: out = 7'b 000_1100;
			4'b 1010: out = 7'b 111_0010;
			4'b 1011: out = 7'b 110_0110;
			4'b 1100: out = 7'b 101_1100;
			4'b 1101: out = 7'b 011_0100;
			4'b 1110: out = 7'b 111_0000;
			4'b 1111: out = 7'b 111_1111;
			default:  out = 7'b 111_1111;
		endcase

	end
end
endmodule

六、功能仿真
①学号输出波形图
在这里插入图片描述
七、结语
本程序由于软件的问题,无法仿真出50MHz的频率分频成10Hz

  • 17
    点赞
  • 127
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
基于Verilog HDL的密码锁设计需要实现以下功能:输入密码、验证密码、开锁成功或失败的反馈。 首先,我们需要定义密码和输入方式。可以将密码设置为一个固定的数字序列,比如"1234"。输入方式可以设定为使用4个开关来输入数字。 接下来,我们需要设计密码验证的模块。我们可以将输入的4个开关的信号传递给该模块,并和预设的密码进行比对。比对的方式可以是逐位对比,即逐个比较每一位输入是否与预设的密码相符。如果全部比对通过,则密码验证成功。 在验证成功的情况下,我们需要设计开锁反馈的模块。可以使用一个LED灯来表示开锁成功,同时可以通过蜂鸣器发出声音提醒用户。如果密码验证失败,可以设计一个LED灯来表示开锁失败。 整个设计可以通过状态机来实现。初始状态为等待用户输入,当用户按下一个开关时,系统进入密码验证状态。在密码验证状态下,系统逐个比对用户输入和预设密码的每一位,根据比对结果切换至相应的状态。如果全部比对通过,切换至开锁成功状态,点亮LED灯和发出声音。如果比对不通过,切换至开锁失败状态,点亮另一个LED灯。在开锁成功或失败状态停留一段时间后,返回初始状态。 最后,需要将设计好的Verilog HDL代码下载到数字电路开发板上进行实际验证。通过按下开关输入密码来测试密码验证和开锁反馈的功能。 通过这样的基于Verilog HDL的密码锁设计,我们可以实现一种简单而有效的密码锁功能,保护我们的财物和隐私安全。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值