verilog实验之密码箱实验报告
Verilog实验报告(电子)参考模板
西安邮电大学Verilog HDL大作业报告书学院名称:电子工程学院学生姓名:专业名称:电子信息工程班级:实验一异或门设计一、实验目的(1)熟悉Modelsim 软件(2)掌握Modelsim 软件的编译、仿真方法(3)熟练运用Modelsim 软件进行HDL 程序设计开发二、实验内容my_or,my_and和my_not门构造一个双输入端的xor门,其功能是计算z=x’y+xy’,其中x和y为输入,z为输出;编写激励模块对x和y的四种输入组合进行测试仿真1、实验要求用Verilog HDL 程序实现一个异或门,Modelism仿真,观察效果。
2、步骤1、建立工程2、添加文件到工程3、编译文件4、查看编译后的设计单元5、将信号加入波形窗口6、运行仿真实验描述如下:module my_and(a_out,a1,a2);output a_out;input a1,a2;wire s1;nand(s1,a1,a2);nand(a_out,s1,1'b1);endmodulemodule my_not(n_out,b);output n_out;input b;nand(n_out,b,1'b1); endmodulemodule my_or(o_out,c1,c2);output o_out;input c1,c2;wire s1,s2;nand(s1,c1,1'b1);nand(s2,c2,1'b1);nand(o_out,s1,s2); endmodulemodule MY_XOR(z,x,y);output z;input x,y;wire a1,a2,n1,n2;my_not STEP01(n1,x);my_not STEP02(n2,y);my_and STEP03(a1,n1,y);my_and STEP04(a2,n2,x);my_or STEP05(z,a1,a2); Endmodulemodule stimulus;reg X,Y;wire OUTPUT;MY_XOR xor01(OUTPUT,X,Y);initialbegin$monitor($time,"X=%b,Y=%b --- OUTPUT=%b\n",X,Y,OUTPUT);endinitialbeginX = 1'b0; Y = 1'b0;#5 X = 1'b1; Y = 1'b0;#5 X = 1'b1; Y = 1'b1;#5 X = 1'b0; Y = 1'b1;endendmodule二、实验结果波形图:三、分析和心得通过这次的实验,我基本熟悉Modelsim 软件,掌握了Modelsim 软件的编译、仿真方法。
(完整版)verilog实验之密码箱实验报告
Verilog实现密码箱1.功能概述小脚丫开发板的有4位拨码开关,可以表示数字0-9,有两个七段数码管,所以密码设为两位(00—99),初始密码00,利用四位拨码开关(sw)输入密码,,按下个位确认按键(low),在数码管上显示个位数字;再次输入密码,按下十位确认按键(high),在数码管上显示十位数字。
按下确认按键(enter),比较密码正误,若正确,实现开锁功能,用led8灯亮表示;错误,实现报错功能,用led1灯亮表示;连续错三次,实现警报功能,用8个灯全亮表示,此时只有重置(rst)才能重新输入密码。
初始密码为21。
为保证安全性,只有在开锁状态下,才可修改密码,修改拨码开关数值,按下个位确认按键(low),设置新密码个位,再次修改拨码开关数值,按下个位确认按键(high),设置新密码十位(实际上两个位密码修改与输入顺序不影响)。
再按下重置键(rst),即可重新输入密码。
同时在使用按键时,注意到了消抖。
2.效果展示密码错误密码正确修改后密码正确视频展示(双击播放)3.代码分析一、密码显示在数码管上always@(*)//数码管显示控制模块begincase(code_low)4'd0:seg_led1=9'b000111111;//数码管1显示0 4'd1:seg_led1=9'b000000110;//14'd2:seg_led1=9'b001011011;//24'd3:seg_led1=9'b001001111;//34'd4:seg_led1=9'b001100110;//44'd5:seg_led1=9'b001101101;//54'd6:seg_led1=9'b001111101;//64'd7:seg_led1=9'b000000111;//74'd8:seg_led1=9'b001111111;//84'd9:seg_led1=9'b001101111;//9default:seg_led1=9'b100111111;//0endcasecase(code_high)4'd0:seg_led2=9'b000111111;//数码管2显示0 4'd1:seg_led2=9'b000000110;//14'd2:seg_led2=9'b001011011;//24'd3:seg_led2=9'b001001111;//34'd4:seg_led2=9'b001100110;//44'd5:seg_led2=9'b001101101;//54'd6:seg_led2=9'b001111101;//64'd7:seg_led2=9'b000000111;//74'd8:seg_led2=9'b001111111;//84'd9:seg_led2=9'b001101111;//9default:seg_led2=9'b100111111;//0endcaseend二、密码比对判断always @(posedge clk) //密码判断beginif(!rst)beginwrong_cnt<=2'b00; //初始错误次数为0code_low<=4'b0000;code_high<=4'b0000;led<=8'b11111111;endelse if(low_d)begincode_low<=sw;endelse if(high_d)begincode_high<=sw;endelse if(enter_d)beginif(wrong_cnt!=2'd2)beginif((code_low==Y&&code_high==X)||(code_low==newcode_low& &code_high==newcode_high))beginled<=8'b01111111; //密码正确,led8亮wrong_cnt<=2'd0;endelsebeginled<=8'b11111110; //密码错误,led1亮错误次数加一wrong_cnt<=wrong_cnt+1;endendelseled<=8'b00000000; //密码输错三次,报警endend三、密码修改实现//修改控制模块always @(posedge clk)beginif(!rst)change<=0;else if(led<=8'b01111111)change<=1;if(change==1&&high_d)beginnewcode_high<=sw;endelse if(change==1&&low_d)beginnewcode_low<=sw;endendendmodule四、按键消抖实现//按键消抖模块module debounce (clk,rst,key,key_pulse);parameter N = 2; //要消除的按键的数量input clk;input rst;input [N-1:0] key; //输入的按键output [N-1:0] key_pulse; //按键动作产生的脉冲reg [N-1:0] key_rst_pre; //定义一个寄存器型变量存储上一个触发时的按键值reg [N-1:0] key_rst; //定义一个寄存器变量储存储当前时刻触发的按键值wire [N-1:0] key_edge; //检测到按键由高到低变化是产生一个高脉冲//利用非阻塞赋值特点,将两个时钟触发时按键状态存储在两个寄存器变量中always @(posedge clk or negedge rst)beginif (!rst)beginkey_rst <= {N{1'b1}}; //初始化时给key_rst赋值全为1,{}中表示N个1key_rst_pre <= {N{1'b1}};endelsebeginkey_rst <= key; //第一个时钟上升沿触发之后key的值赋给key_rst,同时key_rst的值赋给key_rst_prekey_rst_pre <= key_rst; //非阻塞赋值。
verilog实验报告
verilog实验报告Verilog实验报告引言:Verilog是一种硬件描述语言(HDL),用于设计和模拟数字电路。
它是一种高级语言,能够描述电路的行为和结构,方便工程师进行数字电路设计和验证。
本实验报告将介绍我在学习Verilog过程中进行的实验内容和所获得的结果。
实验一:基本门电路设计在这个实验中,我使用Verilog设计了基本的逻辑门电路,包括与门、或门和非门。
通过使用Verilog的模块化设计,我能够轻松地创建和组合这些门电路,以实现更复杂的功能。
我首先创建了一个与门电路的模块,定义了输入和输出端口,并使用逻辑运算符和条件语句实现了与门的功能。
然后,我创建了一个测试模块,用于验证与门的正确性。
通过输入不同的组合,我能够验证与门的输出是否符合预期。
接下来,我按照同样的方法设计了或门和非门电路,并进行了相应的测试。
通过这个实验,我不仅学会了使用Verilog进行基本门电路的设计,还加深了对逻辑电路的理解。
实验二:时序电路设计在这个实验中,我学习了如何使用Verilog设计时序电路,例如寄存器和计数器。
时序电路是一种具有状态和时钟输入的电路,能够根据时钟信号的变化来改变其输出。
我首先设计了一个简单的寄存器模块,使用触发器和组合逻辑电路实现了数据的存储和传输功能。
然后,我创建了一个测试模块,用于验证寄存器的正确性。
通过输入不同的数据和时钟信号,我能够观察到寄存器的输出是否正确。
接下来,我设计了一个计数器模块,使用寄存器和加法电路实现了计数功能。
我还添加了一个复位输入,用于将计数器的值重置为初始状态。
通过测试模块,我能够验证计数器在不同的时钟周期内是否正确地进行计数。
通过这个实验,我不仅学会了使用Verilog设计时序电路,还加深了对触发器、寄存器和计数器的理解。
实验三:组合电路设计在这个实验中,我学习了如何使用Verilog设计组合电路,例如多路选择器和加法器。
组合电路是一种没有状态和时钟输入的电路,其输出只取决于当前的输入。
Verilog HDL实验报告
HDL实验报告专业电子科学与技术姓名学号指导老师1 实验一Modelsim仿真软件的使用1.1 实验目的(1)熟悉Modelsim 软件;(2)掌握Modelsim 软件的编译、仿真方法;(3)熟练运用Modelsim 软件进行HDL 程序设计开发。
1.2 实验步骤(1)学习使用Modelsim软件;(2)分析原理及功能;(3)用Verilog HDL编写程序;(4)编写测试程序进行仿真;(4)观察波形,分析仿真结果是否正确。
1.3 实验内容用Verilog HDL 程序实现一个异或门,Modelsim 仿真,观察效果。
1.4.1 程序module my_xor(ina,inb,out);input ina,inb;output out;assign out=ina^inb;endmodulemodule t_xor;reg ina,inb;wire out;initialbeginina=1'b0;forever #20 ina=~ina;endinitialbegininb=1'b0;forever #10 inb=~inb;endmy_xor tt(.ina(ina),.inb(inb),.out(out));endmodule2 实验二简单组合电路设计2.1 实验目的(1)掌握基于Modelsim 的数字电路设计方法;(2)熟练掌握HDL 程序的不同实现方法2.2 实验步骤(1)分析原理及功能;(2)根据原理用Verilog HDL编写程序;(3)编写测试程序进行仿真;(4)观察波形,分析仿真结果是否正确。
2.3 实验内容设计一个三人表决器(高电平表示通过) ,实验内容如下:(1)三个人,一个主裁判,两个副裁判;(2)规则:只要主裁判同意,输出结果为通过;否则,按少数服从多数原则决定是否通过。
使用Verilog HDL 程序实现上述实验内容,并使用modelsim 仿真(要求:至少使用两种方法实现上述实验内容和testbench)。
verilog的密码锁课程设计
verilog的密码锁课程设计一、课程目标知识目标:1. 学生理解Verilog硬件描述语言的基本语法和结构;2. 学生掌握用Verilog设计简单的数字电路,特别是组合逻辑和时序逻辑;3. 学生能够描述密码锁的工作原理及其在数字系统中的应用;4. 学生了解基本的硬件仿真概念,并能运用到密码锁的设计中。
技能目标:1. 学生能够运用Verilog编写代码实现一个简单的密码锁电路;2. 学生能够通过仿真软件验证密码锁设计的正确性和功能;3. 学生能够对密码锁进行测试,并分析结果,进行故障诊断和修正;4. 学生具备团队协作能力,能在小组内有效沟通,共同完成密码锁的设计。
情感态度价值观目标:1. 学生培养对数字电路设计和硬件描述语言的兴趣,激发创新意识和探索精神;2. 学生通过实践活动,培养耐心、细致和严谨的科学态度;3. 学生在学习过程中,强化安全意识,了解密码学在实际生活中的重要意义;4. 学生通过小组合作,培养团队精神,学会尊重他人意见,共同进步。
课程性质:本课程属于实践性较强的课程,结合理论知识与实际操作,使学生在实践中掌握Verilog语言及数字电路设计。
学生特点:学生具备一定的数字电路基础,对编程和设计有一定的兴趣,喜欢动手实践。
教学要求:注重理论与实践相结合,强调学生动手能力,通过项目驱动教学,使学生能将所学知识运用到实际中。
同时,注重培养学生的团队协作能力和解决问题的能力。
二、教学内容1. Verilog基础知识回顾:包括数据类型、运算符、控制语句等,确保学生具备基本的编程能力。
(对应教材第2章)2. 数字电路设计基础:复习组合逻辑和时序逻辑设计原理,理解触发器、计数器等基本电路的工作原理。
(对应教材第3章)3. 密码锁原理讲解:介绍密码锁的构成、工作原理及其在现实生活中的应用。
(对应教材第5章)4. Verilog设计密码锁:教授如何运用Verilog语言编写密码锁代码,包括密码比对、锁的控制逻辑等。
数字逻辑电路实验--基于有限状态机的密码锁
数电实验三报告姓名:xxx班级:xxx 学号:xxxx实验:基于有限状态机的密码锁一、实验目的学习如何通过Verilog HDL 编程,利用Basys3板上的开关控制七段数码管实现四位密码锁。
二、实验要求使用有限状态机设计一个 4 位密码锁。
利用 Basys3 板上的滑动开关 sw[0]到sw[9]分别代表 0‐9 十个数字,依次输入 4 位不重复的密码。
如果密码输入顺序与设计设置的一致,则显示大写字母P,否则显示大写字母F。
注意,即使密码输入错误,也必须在输入完整的 4 位密码输入,才能显示大写字母 F。
三、实验设计及内容1.基础版实验代码module doorlock(input CLK,input clr,input [9:0] sw,output reg [10:0] display_out);reg[3:0] present_state,next_state;parameter S0=4'b0000,S1=4'b0001,S2=4'b0010,S3=4'b0011,S4=4'b0100,E1=4'b0101,E2=4'b0110,E3=4'b0111,E4=4'b1000;reg [29:0] count;reg [9:0] keys=0;always @(posedge CLK or posedge clr)beginif (clr) count<=0;else count<=count+1;endassign clk_3=count[24];// ~3Hzalways @(posedge clk_3 or posedge clr) // STATE TRANSITIONbeginif (keys!=sw) keys <= sw;if (clr) present_state <= S0;else present_state <= next_state;end// Demo for Finite State Machine// the correct password is 0->1->2->3 (Switch sw[0]->sw[1]->sw[2]->sw[3] in order. always @(*)begincase (present_state)S0: beginif (~|keys[9:0]) next_state <=S0; // no key pressedelse if (keys[2]) next_state <=S1; // first valid key pressedelse next_state <=E1; // first invalid key pressedendS1: beginif (~|keys[9:3]&&~|keys[1:0]) next_state <=S1; // no key pressedelse if (keys[1]) next_state <=S2;// second valid key pressedelse next_state <=E2;// second invalid key pressedendS2: beginif (~|keys[9:3]&&~|keys[0]) next_state <=S2; // no key pressedelse if (keys[7]) next_state <=S3; // third valid key pressedelse next_state <=E3;// third invalid key pressedendS3: beginif (~|keys[9:8]&&~|keys[6:3]&&~|keys[0]) next_state <=S3; // no key pressedelse if (keys[3]) next_state <=S4;// fourth vaild key pressedelse next_state <=E4;// fourth invalid key pressedendS4: beginif (~|keys[9:8]&&~|keys[6:4]&&~|keys[0]) next_state <=S4; // no keypressedelse next_state <=E1; // fifth key pressed, but ignored *** endE1:beginif (keys!=sw) next_state <=E2; // second invalid key pressedelse next_state <=E1; // no key pressedendE2:beginif (keys!=sw) next_state <=E3; // third invalid key pressedelse next_state <=E2; // no key pressedendE3:beginif (keys!=sw) next_state <=E4; // fourth invalid key pressedelse next_state <=E3; // no key pressedendE4: next_state <=E4; // the additional keys are ALL ignored ***default: next_state <=S0;endcaseendalways @(*) // indicate the number of inputs and display the tag begincase(present_state)S4: display_out<=11'b0111_0011000;// P in left-most segmentE4: display_out<=11'b1110_0111000;// F in right-most segmentS0: display_out<=11'b1001_0011100;// oo in the middle segmentsS1,E1: display_out<=11'b1001_0111111;// confirm first inputS2,E2: display_out<=11'b1001_0011111;// confirm second inputS3,E3: display_out<=11'b1001_0011110;// confirm third inputdefault:display_out<=11'b1111_1111111; // no displayendcaseendendmodule2.进阶版实验代码module doorlock2(input CLK,input clr,input [9:0] sw,output reg [10:0] display_out);reg[3:0] present_state,next_state;reg [19:0]count1=0;reg [2:0] sel=0;parameter S0= 4'b0000,S1=4'b0001,S2=4'b0010,S3=4'b0011,S4=4'b0100, S01=4'b1001,S02=4'b1010,S03=4'b1011,E1=4'b0101,E2=4'b0110,E3=4'b0111,E4=4'b1000;parameter T1MS=50000,T2MS=20000_0000;reg [29:0] count;reg [32:0] count2=0;reg [9:0] keys=0;reg flag;always @(posedge CLK or posedge clr)beginif (clr)begincount<=0;endelse count<=count+1;endwire clk_3;assign clk_3=count[24];// ~3Hzalways @(posedge clk_3 or posedge clr) // STATE TRANSITIONbeginif (keys!=sw) keys <= sw;if (clr) present_state <= S0;else present_state <= next_state;endalways@(posedge CLK or posedge clr)beginif(present_state == S4)beginif(count2<T2MS)begincount2<=count2+1;flag<=1'b0;endelsebeginflag<=1'b1;endendif(clr) count2<=0;end// Demo for Finite State Machine// the correct password is 0->1->2->3 (Switch sw[0]->sw[1]->sw[2]->sw[3] in order. always @(*)begincase (present_state)S0: beginif (~|keys[9:0]) next_state <=S0; // no key pressedelse if (keys[2]) next_state <=S1; // first valid key pressedelse next_state <=E1; // first invalid key pressedendS1: beginif (~|keys[9:3]&&~|keys[1:0]) next_state <=S1; // no key pressed//else if (!sw) next_state <=S01;// second valid key pressedelse if(keys[1]&&keys[2]) next_state<=S2;else next_state <=E2;// second invalid key pressedendS01:beginif(!sw) next_state<=S01;else if(sw[2]) next_state<=S2;else next_state<=E2;endS2: beginif (~|keys[9:3]&&~|keys[0]) next_state <=S2; // no key pressed//else if (!sw) next_state <=S02; // third valid key pressedelse if (keys[2]&&keys[1]&&keys[3]) next_state <=S3;else next_state<=E3;// third invalid key pressedendS02: beginif(!sw) next_state<=S02;else if(sw[1]) next_state<=S3;else next_state<=E3;endS3: beginif (keys[1]&&keys[2]&&keys[3]) next_state <=S3; // no key pressed else if (!sw[3]) next_state <=S03;// fourth vaild key pressedelse next_state <=E4;// fourth invalid key pressedendS03:beginif(~|keys[9:3]&&~|keys[0]) next_state<=S03;else if(keys[3]) next_state<=S4;else next_state<=E4;endS4: beginif (~|keys[9:4]&&~|keys[0]) next_state <=S4; // no key pressedelse next_state <=E1; // fifth key pressed, but ignored *** endE1:beginif (keys!=sw) next_state <=E2; // second invalid key pressedelse next_state <=E1; // no key pressedendE2:beginif (keys!=sw) next_state <=E3; // third invalid key pressedelse next_state <=E2; // no key pressedendE3:beginif (keys!=sw) next_state <=E4; // fourth invalid key pressedelse next_state <=E3; // no key pressedendE4: next_state <=E4; // the additional keys are ALL ignored ***default: next_state <=S0;endcaseendalways@(posedge CLK)begincount1<=count1+1;if(count1==T1MS)begincount1<=0;sel<=sel+1;if(sel==4)sel<=0;endendalways @(posedge CLK) // indicate the number of inputs and display the tagbegincase(present_state)S0: begincase(sel)0:display_out<=11'b0111_0101000;1:display_out<=11'b1011_0110000;2:display_out<=11'b1101_1000100;3:display_out<=11'b1110_0110110;default:display_out<=11'b1111_1111111;endcaseendS1: begincase(sel)0:display_out<=11'b0111_0010010;1:display_out<=11'b1011_1110111;2:display_out<=11'b1101_1110111;3:display_out<=11'b1110_1110111;default:display_out<=11'b1111_1111111;endcaseend // confirm first inputS2: begincase(sel)0:display_out<=11'b0111_0010010;1:display_out<=11'b1011_1001111;2:display_out<=11'b1101_1110111;3:display_out<=11'b1110_1110111;default:display_out<=11'b1111_1111111;endcaseend // confirm second inputS3: begincase(sel)0:display_out<=11'b0111_0010010;1:display_out<=11'b1011_1001111;2:display_out<=11'b1101_0000110;3:display_out<=11'b1110_1110111;default:display_out<=11'b1111_1111111;endcaseend // confirm third inputS4: beginif(!flag)begincase(sel)0:display_out<=11'b0111_0010010;1:display_out<=11'b1011_1001111;2:display_out<=11'b1101_0000110;3:display_out<=11'b1110_0000110;default:display_out<=11'b1111_1111111;endcaseendelse display_out<= 11'b0111_0011000 ;end // P in left-most segmentS01:begincase(sel)0:display_out<=11'b0111_0010010;1:display_out<=11'b1011_1110111;2:display_out<=11'b1101_1110111;3:display_out<=11'b1110_1110111;default:display_out<=11'b1111_1111111;endcaseendS02:begincase(sel)0:display_out<=11'b0111_0010010;1:display_out<=11'b1011_1001111;2:display_out<=11'b1101_1110111;3:display_out<=11'b1110_1110111; default:display_out<=11'b1111_1111111;endcaseendS03: begincase(sel)0:display_out<=11'b0111_0010010;1:display_out<=11'b1011_1001111;2:display_out<=11'b1101_0000110;3:display_out<=11'b1110_1110111;default:display_out<=11'b1111_1111111;endcaseendE1: display_out<=11'b0111_0111000;E2: display_out<=11'b1011_0111000;E3: display_out<=11'b1101_0111000;E4: display_out<=11'b1110_0111000;// F in right-most segment default:display_out<=11'b1111_1111111; // no displayendcaseendendmodule约束文件代码:## Clock signalset_property PACKAGE_PIN W5 [get_ports CLK]set_property IOSTANDARD LVCMOS33 [get_ports CLK]## Switchesset_property PACKAGE_PIN V17 [get_ports {sw[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {sw[0]}]set_property PACKAGE_PIN V16 [get_ports {sw[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {sw[1]}]set_property PACKAGE_PIN W16 [get_ports {sw[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {sw[2]}]set_property PACKAGE_PIN W17 [get_ports {sw[3]}] set_property IOSTANDARD LVCMOS33 [get_ports {sw[3]}]set_property PACKAGE_PIN W15 [get_ports {sw[4]}] set_property IOSTANDARD LVCMOS33 [get_ports {sw[4]}]set_property PACKAGE_PIN V15 [get_ports {sw[5]}] set_property IOSTANDARD LVCMOS33 [get_ports {sw[5]}]set_property PACKAGE_PIN W14 [get_ports {sw[6]}] set_property IOSTANDARD LVCMOS33 [get_ports {sw[6]}]set_property PACKAGE_PIN W13 [get_ports {sw[7]}] set_property IOSTANDARD LVCMOS33 [get_ports {sw[7]}]set_property PACKAGE_PIN V2 [get_ports {sw[8]}] set_property IOSTANDARD LVCMOS33 [get_ports {sw[8]}]set_property PACKAGE_PIN T3 [get_ports {sw[9]}] set_property IOSTANDARD LVCMOS33 [get_ports {sw[9]}]## sw[15]set_property PACKAGE_PIN R2 [get_ports {clr}]set_property IOSTANDARD LVCMOS33 [get_ports {clr}]## 7-seg displayset_property PACKAGE_PIN W4 [get_ports {display_out[10]}]set_property PACKAGE_PIN V4 [get_ports {display_out[9]}]set_property PACKAGE_PIN U4 [get_ports {display_out[8]}]set_property PACKAGE_PIN U2 [get_ports {display_out[7]}]set_property PACKAGE_PIN W7 [get_ports {display_out[6]}]set_property PACKAGE_PIN W6 [get_ports {display_out[5]}]set_property PACKAGE_PIN U8 [get_ports {display_out[4]}]set_property PACKAGE_PIN V8 [get_ports {display_out[3]}]set_property PACKAGE_PIN U5 [get_ports {display_out[2]}]set_property PACKAGE_PIN V5 [get_ports {display_out[1]}]set_property PACKAGE_PIN U7 [get_ports {display_out[0]}]set_property IOSTANDARD LVCMOS33 [get_ports {display_out[9]}]set_property IOSTANDARD LVCMOS33 [get_ports {display_out[8]}]set_property IOSTANDARD LVCMOS33 [get_ports {display_out[7]}]set_property IOSTANDARD LVCMOS33 [get_ports {display_out[6]}]set_property IOSTANDARD LVCMOS33 [get_ports {display_out[5]}]set_property IOSTANDARD LVCMOS33 [get_ports {display_out[4]}]set_property IOSTANDARD LVCMOS33 [get_ports {display_out[3]}]set_property IOSTANDARD LVCMOS33 [get_ports {display_out[1]}]set_property IOSTANDARD LVCMOS33 [get_ports {display_out[2]}]set_property IOSTANDARD LVCMOS33 [get_ports {display_out[0]}]set_property IOSTANDARD LVCMOS33 [get_ports {display_out[10]}]四、实验结果1基础结果图2.进阶结果图进阶实验成品效果说明:进阶视频演示:正确示范:密码输入错误示范:五、实验总结1.通过本次实验了解了时钟信号的作用原理以及对时序电路的控制机理。
verilog hdl实验报告
verilog hdl实验报告《Verilog HDL实验报告》Verilog HDL(硬件描述语言)是一种用于描述电子系统的硬件的语言,它被广泛应用于数字电路设计和硬件描述。
本实验报告将介绍Verilog HDL的基本概念和使用方法,并通过实验展示其在数字电路设计中的应用。
实验目的:1. 了解Verilog HDL的基本语法和结构2. 掌握Verilog HDL的模块化设计方法3. 熟悉Verilog HDL的仿真和综合工具的使用实验内容:1. Verilog HDL的基本语法和结构Verilog HDL是一种硬件描述语言,其语法和结构类似于C语言。
它包括模块定义、端口声明、信号赋值等基本元素。
在本实验中,我们将学习如何定义Verilog模块,并使用端口声明和信号赋值描述数字电路的行为。
2. Verilog HDL的模块化设计方法Verilog HDL支持模块化设计,可以将复杂的电路分解为多个模块,每个模块描述一个子电路的行为。
在本实验中,我们将学习如何设计和实现Verilog模块,并将多个模块组合成一个完整的数字电路。
3. Verilog HDL的仿真和综合工具的使用Verilog HDL可以通过仿真工具进行功能验证,也可以通过综合工具生成实际的硬件电路。
在本实验中,我们将使用Verilog仿真工具对设计的数字电路进行功能验证,并使用综合工具生成对应的硬件电路。
实验步骤:1. 学习Verilog HDL的基本语法和结构2. 设计一个简单的数字电路,并实现Verilog模块描述其行为3. 使用仿真工具对设计的数字电路进行功能验证4. 使用综合工具生成对应的硬件电路实验结果:通过本实验,我们学习了Verilog HDL的基本概念和使用方法,并成功设计和实现了一个简单的数字电路。
我们使用仿真工具对设计的数字电路进行了功能验证,并使用综合工具生成了对应的硬件电路。
实验结果表明,Verilog HDL在数字电路设计中具有重要的应用价值。
基于Verilog语言的8位数字密码锁设计
基于Verilog语言的8位数字密码锁设计本科学生学年论文题目:8位数字密码锁设计学院:电子工程学院年级:2011级专业:电子科学与技术(光电子)姓名: 李思远学号:20112508指导教师:林连东2011年5月28日8位数字密码锁设计摘要本文简述了VHDL语言的功能及其特点,并以8位串行数字锁设计为例,介绍了在QUARTUS II 6. 0开发软件下,利用VHDL硬件描述语言设计数字逻辑电路的过程和方法。
关键词:VHDL语言数字锁QUARTUS II 6.0 硬件描述语言数字逻辑电路AbstractThis paper describes the function and characteristics of VHDL language, and eight serial number lock design as an example, this paper introduces QUARTUS II 6・ 0 software development in of VHDL hardware design of digital logic circuit process and method.Keywords: VHDL language QUARTUS II 6・ 0 hardware description language, digitallogic circuit8位数字密码锁设计第一章前言Abstract第二章密码锁系统的设计2.1设计要求2.2设计分析 (5)第三章软件设计 (6)第四章软件仿真及验证 (10)12参考文献 (13)致谢 (14)第一章前言电子密码锁系统主要由电子锁体、电子密匙等部分组成,一把电子密匙里能存放多组开锁密码,用户在使用过程中能够随时修改开锁密码,更新或配制钥匙里开锁密码。
一把电子锁可配制多把钥匙。
语音方面的广泛应用,使得具有语音播放的电子密码锁使用起来更加方便。
Verilog 实验报告
Verilog 实验报告一、实验目的本次 Verilog 实验的主要目的是通过实际编写代码和进行仿真,深入理解 Verilog 语言的基本语法、逻辑结构和时序特性,掌握数字电路的设计方法和实现过程,并能够运用Verilog 实现简单的数字逻辑功能。
二、实验环境本次实验使用的软件工具是 Xilinx Vivado 20192,硬件平台是Xilinx Artix-7 开发板。
三、实验内容(一)基本逻辑门的实现1、与门(AND Gate)使用 Verilog 语言实现一个两输入的与门。
代码如下:```verilogmodule and_gate(input a, input b, output out);assign out = a & b;endmodule```通过编写测试激励文件对该模块进行仿真,验证其逻辑功能的正确性。
2、或门(OR Gate)同样实现一个两输入的或门,代码如下:```verilogmodule or_gate(input a, input b, output out);assign out = a | b;endmodule```3、非门(NOT Gate)实现一个单输入的非门:```verilogmodule not_gate(input a, output out);assign out =~a;endmodule```(二)组合逻辑电路的实现1、加法器(Adder)设计一个 4 位的加法器,代码如下:```verilogmodule adder_4bit(input 3:0 a, input 3:0 b, output 4:0 sum);assign sum = a + b;endmodule```2、减法器(Subtractor)实现一个 4 位的减法器:```verilogmodule subtractor_4bit(input 3:0 a, input 3:0 b, output 4:0 diff);assign diff = a b;endmodule```(三)时序逻辑电路的实现1、计数器(Counter)设计一个 4 位的计数器,能够在时钟上升沿进行计数,代码如下:```verilogmodule counter_4bit(input clk, output 3:0 count);reg 3:0 count_reg;always @(posedge clk) begincount_reg <= count_reg + 1;endassign count = count_reg;endmodule```2、移位寄存器(Shift Register)实现一个 4 位的移位寄存器,能够在时钟上升沿进行左移操作:```verilogmodule shift_register_4bit(input clk, input rst, output 3:0 data_out);reg 3:0 data_reg;always @(posedge clk or posedge rst) beginif (rst)data_reg <= 4'b0000;elsedata_reg <={data_reg2:0, 1'b0};endassign data_out = data_reg;endmodule```四、实验结果与分析(一)基本逻辑门的结果通过仿真,与门、或门和非门的输出结果与预期的逻辑功能完全一致,验证了代码的正确性。
基于VerilogHDL密码锁设计
基于Verilog HDL密码锁设计摘要随着科技的开展数字电路的各种产品广泛应用,传统的机械锁由于其构造的简单,平安性不高,电子密码锁其性高,使用灵活性好,平安系数高,使用方便,将会是未来使用的趋势。
本设计使用EDA设计使设计过程廷到高度自动化,其具有强大的设计功能、测试、仿真分析、管理等功能。
使用EDA环境完成电路的系统综合设计和仿真。
用VHDL可以更加快速、灵活地设计出符合各种要求的密码锁。
本设计基于Verilog HDL语言来设计密码锁,先介绍设计要求和整体设计思想,随后对所使用各模块分别为蜂鸣器模块、显示模块、控制模块、顶层模块进展了介绍,给出各个模块的主要代码,在对各个模块的功能进展仿真。
关键字密码锁Verilog HDL Quartus II总体设计密码锁分为四个模块:①顶层模块、②显示模块、③蜂鸣器模块、④控制模块。
其中由顶层模块调其他分模块来实现密码锁功能。
密码锁功能:1.由12个拨码开关设置三位密码〔0-9〕2.再输入密码开锁,密码正确,指示灯亮开锁成功。
3.密码输入错误,蜂鸣器响五秒,表示开锁失败。
设计思路:本设计以007为万能密码在忘记密码时开锁使用。
开场时密码锁处于关闭的状态,输入万能密码将锁翻开。
在锁处于翻开的状态时设计密码,此时指示灯处于亮的状态,说明锁处于开的状态。
设置好密码后按关闭拨码使锁关闭,指示灯处于灭的状态。
再输入三位数字进展开琐,如果输入的密码正确则指示灯亮,表示开琐成功,否则蜂鸣器发出响声,并持续五秒钟,表示开锁失败。
总体框图灯亮,在密码错误时蜂鸣器发出五秒钟的响声。
程序如下:moduledingceng(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,set,close,clk1,clk2,clk3,lock, alarm,Q,ss1,ss0);input n0,n1,n2,n3,n4,n5,n6,n7,n8,n9;input set,close;input clk1,clk2,clk3;output lock,alarm,ss1,ss0;output[6:0] Q;reg lock,alarm;reg ss0,ss1;reg[6:0] Q;wire[3:0] *1,*2,*3;wire *4,*5;codeu1(.lock(lock),.warning(*4),.num1(*1),.num2(*2),.num3(*3),.clk(clk1),.n 0(n0),.n1(n1),.n2(n2),.n3(n3),.n4(n4),.n5(n5),.n6(n6),.n7(n7),.n8(n8),.n 9(n9),.set(set),.close(close));show u2(.A(*1),.B(*2),.C(*3),.clk(clk2),.Q(Q[6:0]),.ss1(ss1),.ss0(ss0)); speaker u3(.ENA(*4),.CLK2(clk3),.COUT(alarm));endmodule2.蜂鸣器模块蜂鸣器是一种一体化构造的电子讯响器,采用直流电压供电,广泛应用各类电子产品中作发声器件。
verilog课程设计实验报告
verilog课程设计实验报告一、教学目标本课程旨在通过Verilog硬件描述语言的学习,让学生掌握数字电路设计的自动化工具,理解并实践硬件描述语言在数字系统设计中的应用。
通过本课程的学习,学生应达到以下目标:1.知识目标:–理解Verilog的基本语法和结构。
–掌握Verilog中的模块化设计方法。
–学习常用的Verilog描述技巧,包括逻辑门级建模、行为级建模和结构级建模。
2.技能目标:–能够运用Verilog语言进行简单的数字电路设计。
–学会使用至少一种Verilog仿真工具进行电路功能验证。
–能够阅读和理解Verilog代码,进行简单的代码优化。
3.情感态度价值观目标:–培养学生的团队合作意识,在实验报告中能够体现分工合作的精神。
–培养学生的问题解决能力,鼓励学生在遇到问题时积极寻找解决方案。
–培养学生对新技术的好奇心和学习兴趣,激发他们对电子工程领域的热爱。
二、教学内容依据教学目标,本课程的教学内容将围绕Verilog语言的基础知识、实践应用和项目设计展开。
教学大纲安排如下:1.第一部分:Verilog基础知识(2周)–介绍Verilog的背景和基本概念。
–详细讲解Verilog的数据类型、运算符和语句。
2.第二部分:模块化设计(2周)–讲解模块的定义和封装。
–实践模块的端口声明和模块实例化。
3.第三部分:数字电路的Verilog描述(2周)–通过实例教学,掌握逻辑门、触发器等基本组件的Verilog建模。
–学习组合逻辑和时序逻辑的设计方法。
4.第四部分:仿真与测试(1周)–学习使用仿真工具进行电路功能验证。
–理解并实践测试台(testbench)的编写。
5.第五部分:项目设计(3周)–小组合作完成一个较为复杂的数字系统设计项目。
–包括系统模块的划分、编码、仿真和测试。
三、教学方法为了提高学生的学习效果,将采用多种教学方法相结合的方式进行授课:1.讲授法:用于讲解Verilog的基本概念和语法。
基于Verilog的FPGA的电子密码锁的设计
基于 FPGA 设计的电子密码锁是一个小型的数字系统,与普通机械锁相比,具有许多独特的优点:保密性好,防盗性强,可以不用钥匙,记住密码即可开锁等。
目前使用的电子密码锁大部份是基于单片机技术,以单片机为主要器件。
在实际应用中,程序容易跑飞,系统的可靠性较差。
本文介绍的一种基于现场可编辑门阵列 FPGA 器件的电子密码锁的设计方法,采用 VHDL 语言对系统进行描述,并在EP3C10E144C8 上实现。
通过仿真调试,利用可编程逻辑器件 FPGA 的电子密码锁的设计基本达到了预期目的。
固然,该系统在一些细节的设计上还需要不断地完善和改进,特殊是对系统的扩展有很好的使用系统和设计的价值。
现场可编程门阵列; VHDL 语言;电子密码锁FPGA—based design of the electronic code lock is a small digitalsystem. It has many unique advantages:good privacy and security , it do not need the key but remember password to unlock, and so on while it compare to ordinary mechanical locks. At present, the electronic code lock is most used of SCM technology 。
In practice, however, the process easy run to fly。
So the reliability of this system is poor。
The paper introduced a field programmable gate arrays FPGA devices to design electronic password lock 。
EDA技术Verilog密码锁
电子科技大学实验报告学生姓名:吴成峰学号:2014070906016 指导教师:黄志奇一、实验室名称:主楼C2-514二、实验项目名称:密码锁三、实验原理:利用FPGA 开发班上的 3 个按钮开关btn[2:0] 来输入 4 位数字的密码。
例如,输入“ 2-0-1-2”打开门锁。
将用拨位开关sw[7:0] 来设置密码,通过按钮开关btn[2:0] 来输入密码。
其中,btn[0] 、btn[1]和btn[2]分别对应的有效输入为“00”(十进制0)、“01 ”(十进制1)和“ 10”(十进制2), sw[7:6]、sw[5:4]、sw[3:2]和sw[1:0] 分别对应密码的1 、2、3、4 位。
用sw[7:0]设置密码的同时,通过7段数码管复用电路,将其显示到7段数码管上。
注意:需将8位输入扩展成16位,即,x[15:0]={2 'b00,sw[7:6], 2'b00,sw[5:4], 2'b00,sw[3:2], 2'b00,sw[1:0]}输入 4 位数字后,才能知道所输入的密码是否正确。
如果密码是正确的,led[1]亮起;如果密码错误,led[0]将亮起。
图 1 给出了设计的顶层模块。
当按下btn[0]、btn[1]、btn[2]中任何一个按钮时,将会产生一个时钟脉冲。
当分别按下按钮btn[0]、btn[1]、btn[2]时,锁模块对应的2 位输入bn[1:0]为“00”、“ 01”和“ 10”。
输入的密码与拨位开关上设置的密码相比较,产生图2所示的状态转移图。
注意:即使密码输入错误,也必须完成完整的4位密码输入,才能进入“ fail”状态E4。
mclk50Hz图1•门锁电路的顶层模块btn[0] btn[l] btn[2:图2•门锁电路的状态转移图四、实验目的:熟悉利用HDL代码输入方式进行组合逻辑电路的设计和仿真的流程,掌握Verilog语言的基本语法。
verlog实验报告
Verilog实验报告1. 引言本实验旨在通过使用Verilog硬件描述语言来实现一个简单的电路设计。
Verilog是一种用于描述电路行为和结构的编程语言,可以用于设计和仿真数字电路。
本实验将通过逐步的思考过程,详细说明实验的设计和实现。
2. 设计思路首先,我们需要确定电路的功能和需要实现的功能。
在这个例子中,我们将设计一个简单的4位加法器电路。
接下来,我们需要创建一个顶层模块,该模块将包含所需的输入和输出端口,并将其他模块连接在一起。
我们可以使用以下代码创建一个顶层模块:module top_module(input [3:0] a, input [3:0] b, output [3:0] sum);// 端口声明// 内部逻辑实现endmodule然后,我们可以创建一个子模块,该模块将执行实际的加法操作。
我们可以使用以下代码创建一个加法器模块:module adder(input [3:0] a, input [3:0] b, output [3:0] sum);// 加法操作实现endmodule在加法器模块中,我们可以使用位级操作符+来执行实际的加法运算。
我们可以使用以下代码实现加法操作:assign sum = a + b;最后,我们将在顶层模块中实例化加法器模块,并将输入和输出端口连接在一起。
我们可以使用以下代码实现实例化和连接:adder adder_instance(.a(a), .b(b), .sum(sum));3. 实验结果在完成上述步骤后,我们可以编译和仿真我们的Verilog代码。
可以使用常见的Verilog仿真器(如ModelSim)来进行仿真。
在仿真期间,我们可以为输入端口输入不同的二进制数,并观察输出端口是否正确计算了输入数的和。
通过逐步调试和测试,我们可以确保电路的正确性。
4. 总结通过本实验,我们学习了使用Verilog硬件描述语言设计和实现数字电路。
我们了解了Verilog的基本语法和结构,并通过实例演示了设计一个简单的4位加法器电路的过程。
verilog实验之密码箱实验报告
Verilog实现密码箱1.功能概述小脚丫开发板的有4位拨码开关,可以表示数字0-9,有两个七段数码管,所以密码设为两位(00—99),初始密码00,利用四位拨码开关(sw)输入密码,,按下个位确认按键(low),在数码管上显示个位数字;再次输入密码,按下十位确认按键(high),在数码管上显示十位数字。
按下确认按键(enter),比较密码正误,若正确,实现开锁功能,用led8灯亮表示;错误,实现报错功能,用led1灯亮表示;连续错三次,实现警报功能,用8个灯全亮表示,此时只有重置(rst)才能重新输入密码。
初始密码为21。
为保证安全性,只有在开锁状态下,才可修改密码,修改拨码开关数值,按下个位确认按键(low),设置新密码个位,再次修改拨码开关数值,按下个位确认按键(high),设置新密码十位(实际上两个位密码修改与输入顺序不影响)。
再按下重置键(rst),即可重新输入密码。
同时在使用按键时,注意到了消抖。
2.效果展示密码错误密码正确,修改后密码正确视频展示(双击播放)3.代码分析一、密码显示在数码管上always@(*)录,源码图以及源码|(3))u1(.clk (clk),.rst (rst),.key ({enter,low,high}),.key_pulse ({enter_d,low_d,high_d}) );】always@(*)//数码管显示控制模块begincase(code_low)4'd0:seg_led1=9'b000111111;//数码管1显示0 4'd1:seg_led1=9'b000000110;//14'd2:seg_led1=9'b001011011;//24'd3:seg_led1=9'b001001111;//34'd4:seg_led1=9'b001100110;//44'd5:seg_led1=9'b001101101;//54'd6:seg_led1=9'b001111101;//6>4'd7:seg_led1=9'b000000111;//74'd8:seg_led1=9'b001111111;//84'd9:seg_led1=9'b001101111;//9default:seg_led1=9'b1;//0endcasecase(code_high)4'd0:seg_led2=9'b000111111;//数码管2显示0 4'd1:seg_led2=9'b000000110;//14'd2:seg_led2=9'b001011011;//24'd3:seg_led2=9'b001001111;//34'd4:seg_led2=9'b001100110;//4&4'd5:seg_led2=9'b001101101;//54'd6:seg_led2=9'b001111101;//64'd7:seg_led2=9'b000000111;//74'd8:seg_led2=9'b001111111;//84'd9:seg_led2=9'b001101111;//9default:seg_led2=9'b1;//0endcaseendalways @(posedge clk) //密码判断beginif(!rst)?beginwrong_cnt<=2'b00; //初始错误次数为0code_low<=4'b0000;code_high<=4'b0000;led<=8'b;endelse if(low_d)begincode_low<=sw;endelse if(high_d){begincode_high<=sw;endelse if(enter_d)beginif(wrong_cnt!=2'd2)beginif((code_low==Y&&code_high==X)||(code_low==newcode_low&& code_high==newcode_high))beginled<=8'b01111111;wrong_cnt<=2'd0;】endelsebeginled<=8'b;wrong_cnt<=wrong_cnt+1;endendelseled<=8'b00000000;endend'//修改控制模块always @(posedge clk)beginif(!rst)change<=0;else if(led<=8'b01111111)change<=1;if(change==1&&high_d)beginnewcode_high<=sw;end¥else if(change==1&&low_d)beginnewcode_low<=sw;endendendmodule//按键消抖模块module debounce (clk,rst,key,key_pulse);parameter N = 2; //要消除的按键的数量—input clk;input rst;input [N-1:0] key; //输入的按键output [N-1:0] key_pulse; //按键动作产生的脉冲reg [N-1:0] key_rst_pre; //定义一个寄存器型变量存储上一个触发时的按键值reg [N-1:0] key_rst; //定义一个寄存器变量储存储当前时刻触发的按键值wire [N-1:0] key_edge; //检测到按键由高到低变化是产生一个高脉冲//利用非阻塞赋值特点,将两个时钟触发时按键状态存储在两个寄存器变量中%always @(posedge clk or negedge rst)beginif (!rst)beginkey_rst <= {N{1'b1}}; //初始化时给key_rst赋值全为1,{}中表示N个1key_rst_pre <= {N{1'b1}};endelsebeginkey_rst <= key; //第一个时钟上升沿触发之后key的值赋给key_rst,同时key_rst的值赋给key_rst_prekey_rst_pre <= key_rst; //非阻塞赋值。
基于Verilog HDL的数字密码锁的设计
成绩课程设计报告题目:基于Verilog HDL的数字密码锁的设计学生姓名:江留胜学生学号:**********系别:电气信息工程学院专业:电子信息工程届别:2013届指导教师:马立宪基于Verilog HDL的数字密码锁的设计学生:江留胜指导教师:马立宪电气信息工程学院电子信息工程1课程设计的任务与要求1.1 课程设计的任务设计一个6位的数字密码锁,利用Verilog HDL语言来实现,并使用QuartusⅡ进行仿真与调试。
1.2 课程设计的要求设计一个简单的数字密码锁,密码为6位,其功能:1、在内部设置密码,其密码用6位十进制数表示。
2、输入密码时,每次输入一位数,输入后按#进行确认。
3、当输入的密码顺序与设置的密码一致时,密码锁打开,否则,则报警。
4、具有重置密码的功能。
输入密码正确后按*号键输入要重的密码,按#号键确认密码的重置,连续输入两次,则密码重置成功。
使用Verilog HDL语言编写密码锁的开锁过程的程序,并借助QuartusⅡ软件对其进行仿真,观察实验波形。
1.3 课程设计的研究基础(设计所用的基础理论)密码锁就是要有一定的自我保护功能,并且能够定时更新防止破译的危险。
密码锁控制器是硬件与软件的结合。
Verilog HDL是一种优秀的硬件描述语言,它与C语言有许多相似之处,并继承和借鉴了C语言的多种操作符和语法结构,有C语言基础的人很快就能够学习并使用该语言。
在本次计中,系统开发平台为QuartusⅡ。
QuartusⅡ界面友好,使用便捷,被誉为业界最易用易学的EDA软件。
在QuartusⅡ上可以完成设计输入、元件适配、时序仿真和功能仿真、编程下载整个流程,它提供了一种与结构无关的设计环境,是设计者能方便地进行设计输入、快速处理和器件编程。
在本次设计中,采用的硬件描述语言是Verilog HDL。
Verilog HDL也是目前应用最为广泛的硬件描述语言,并被IEEE采纳为IEEE#1064-1995标准。
基于verilog的密码开关,含testbench——实验报告
Confirm,
Delete,
Close,
//output
Num0,Num1,Num2,Num3,Num4,
Red_light,Green_light);
input Clk,Rst_n;
input key_0,key_1,key_2,key_3,key_4,
key_5,key_6,key_7,key_8,key_9,
parameter open_st = 2'b10 ;
parameter code_re_st = 2'b11 ;
-----------------------------------------------------------
slack (MET) 2.35
五.遇到的问题及难点
1.按键的输入描述之前用时序描述没有组合描述的好。
2.之前用一段式的状态机描述不好,现改为两段式的,代码更清晰,覆盖率更高,易于综合。
(7)密码输入完成后按确认,若密码正确,绿灯亮,开关打开,若密码错误,红灯亮,开关保持闭合;
(8)可进行密码重置:提供重置密码使能按键,按下该键可进行新密码的设置,新密码设置完成后再按一次确认键,新密码设置成功。只有在原始密码输入正确且开关打开后,才可以进行新密码的设置,否则,按重置密码使能按键后也不能进行新密码的设置;
(四)测试验证
图A:密码输入错误
图B密码输入正确
图C密码重置
图D密码输入少于三位
图E密码输入少于五位
图F密码回删
三.逻辑模拟结果和分析
(一)代码覆盖率结果
图G覆盖率
四.综合结果和分析
图H综合结果
****************************************
实验一(保险箱)
实验一:保险箱2012019090013 李旭冬一、设计分析:十进制含有0~9,9数字,由于密码是任意的,故在确认输入位是否与密码对应位相同时,需要选择对应的位比较,可用多路复用器74X151完成,由于一位输入有10种情况,故需要用两片74X151级联组成16输入选择器,且密码是可调整的。
所以四位密码则需要8片74X151。
当箱子正常打开时,LED1亮,否则LED2(alam)亮。
二、原理图:一位数字密码原理图:(s1为输入,S2为密码位)四位数字密码电路为(密码可调):三、真值表密码是:0000经过电路验证,当密码为0000时,符合以上真值表所示。
四、Verilog 仿真1、代码:`timescale 1ns / 1psmodule safebox(A,B,C,D,E,ALAM,LED);parameter [3:0] k0=4'b0000,k1=4'b0000,k2=4'b0000,k3=4'b0000;input [3:0] A,B,C,D;input E;output LED,ALAM;reg LED,ALAM;always @(A or B or C or D or E)beginif(E)if(A==k0&&B==k1&&C==k2&&D==k3) {LED,ALAM}=2'b10;else{LED,ALAM}=2'b01;else {LED,ALAM}=2'b00;endendmodule2、测试代码:`timescale 1ns / 1psmodule TEST;reg [3:0] A;reg [3:0] B;reg [3:0] C;reg [3:0] D;reg E;wire ALAM;wire LED;safebox uut (.A(A),.B(B),.C(C),.D(D),.E(E),.ALAM(ALAM),.LED(LED));initial begin#5{A,B,C,D,E}=5'b00000;#5{A,B,C,D,E}=5'b00001;#5{A,B,C,D,E}=5'b00010;#5{A,B,C,D,E}=5'b00100;#5{A,B,C,D,E}=5'b00101;#5{A,B,C,D,E}=5'b00110;#5{A,B,C,D,E}=5'b00111;#5{A,B,C,D,E}=5'b01000;#5{A,B,C,D,E}=5'b01001;#5{A,B,C,D,E}=5'b01010;#5{A,B,C,D,E}=5'b01011;#5{A,B,C,D,E}=5'b01100;#5{A,B,C,D,E}=5'b01101;#5{A,B,C,D,E}=5'b01110;#5{A,B,C,D,E}=5'b01111;#5{A,B,C,D,E}=5'b10000;#5{A,B,C,D,E}=5'b10001;#5{A,B,C,D,E}=5'b10010;#5{A,B,C,D,E}=5'b10100;#5{A,B,C,D,E}=5'b10101;#5{A,B,C,D,E}=5'b10110;#5{A,B,C,D,E}=5'b10111;#5{A,B,C,D,E}=5'b11000;#5{A,B,C,D,E}=5'b11001;#5{A,B,C,D,E}=5'b11010;#5{A,B,C,D,E}=5'b11011;#5{A,B,C,D,E}=5'b11100;#5{A,B,C,D,E}=5'b11101;#5{A,B,C,D,E}=5'b11110;#5{A,B,C,D,E}=5'b11111;#1000;endendmodule3、测试波形:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Verilog实现密码箱1.功能概述小脚丫开发板的有4位拨码开关,可以表示数字0-9,有两个七段数码管,所以密码设为两位(00—99),初始密码00,利用四位拨码开关(sw)输入密码,,按下个位确认按键(low),在数码管上显示个位数字;再次输入密码,按下十位确认按键(high),在数码管上显示十位数字。
按下确认按键(enter),比较密码正误,若正确,实现开锁功能,用led8灯亮表示;错误,实现报错功能,用led1灯亮表示;连续错三次,实现警报功能,用8个灯全亮表示,此时只有重置(rst)才能重新输入密码。
初始密码为21。
为保证安全性,只有在开锁状态下,才可修改密码,修改拨码开关数值,按下个位确认按键(low),设置新密码个位,再次修改拨码开关数值,按下个位确认按键(high),设置新密码十位(实际上两个位密码修改与输入顺序不影响)。
再按下重置键(rst),即可重新输入密码。
同时在使用按键时,注意到了消抖。
2.效果展示密码错误密码正确修改后密码正确视频展示(双击播放)3.代码分析一、密码显示在数码管上always@(*)//数码管显示控制模块begincase(code_low)4'd0:seg_led1=9'b000111111;//数码管1显示0 4'd1:seg_led1=9'b000000110;//14'd2:seg_led1=9'b001011011;//24'd3:seg_led1=9'b001001111;//34'd4:seg_led1=9'b001100110;//44'd5:seg_led1=9'b001101101;//54'd6:seg_led1=9'b001111101;//64'd7:seg_led1=9'b000000111;//74'd8:seg_led1=9'b001111111;//84'd9:seg_led1=9'b001101111;//9default:seg_led1=9'b100111111;//0endcasecase(code_high)4'd0:seg_led2=9'b000111111;//数码管2显示0 4'd1:seg_led2=9'b000000110;//14'd2:seg_led2=9'b001011011;//24'd3:seg_led2=9'b001001111;//34'd4:seg_led2=9'b001100110;//44'd5:seg_led2=9'b001101101;//54'd6:seg_led2=9'b001111101;//64'd7:seg_led2=9'b000000111;//74'd8:seg_led2=9'b001111111;//84'd9:seg_led2=9'b001101111;//9default:seg_led2=9'b100111111;//0endcaseend二、密码比对判断always @(posedge clk) //密码判断beginif(!rst)beginwrong_cnt<=2'b00; //初始错误次数为0code_low<=4'b0000;code_high<=4'b0000;led<=8'b11111111;endelse if(low_d)begincode_low<=sw;endelse if(high_d)begincode_high<=sw;endelse if(enter_d)beginif(wrong_cnt!=2'd2)beginif((code_low==Y&&code_high==X)||(code_low==newcode_low& &code_high==newcode_high))beginled<=8'b01111111; //密码正确,led8亮wrong_cnt<=2'd0;endelsebeginled<=8'b11111110; //密码错误,led1亮错误次数加一wrong_cnt<=wrong_cnt+1;endendelseled<=8'b00000000; //密码输错三次,报警endend三、密码修改实现//修改控制模块always @(posedge clk)beginif(!rst)change<=0;else if(led<=8'b01111111)change<=1;if(change==1&&high_d)beginnewcode_high<=sw;endelse if(change==1&&low_d)beginnewcode_low<=sw;endendendmodule四、按键消抖实现//按键消抖模块module debounce (clk,rst,key,key_pulse);parameter N = 2; //要消除的按键的数量input clk;input rst;input [N-1:0] key; //输入的按键output [N-1:0] key_pulse; //按键动作产生的脉冲reg [N-1:0] key_rst_pre; //定义一个寄存器型变量存储上一个触发时的按键值reg [N-1:0] key_rst; //定义一个寄存器变量储存储当前时刻触发的按键值wire [N-1:0] key_edge; //检测到按键由高到低变化是产生一个高脉冲//利用非阻塞赋值特点,将两个时钟触发时按键状态存储在两个寄存器变量中always @(posedge clk or negedge rst)beginif (!rst)beginkey_rst <= {N{1'b1}}; //初始化时给key_rst赋值全为1,{}中表示N个1key_rst_pre <= {N{1'b1}};endelsebeginkey_rst <= key; //第一个时钟上升沿触发之后key的值赋给key_rst,同时key_rst的值赋给key_rst_prekey_rst_pre <= key_rst; //非阻塞赋值。
相当于经过两个时钟触发,key_rst存储的是当前时刻key的值,key_rst_pre存储的是前一个时钟的key的值endendassign key_edge = key_rst_pre & (~key_rst);//脉冲边沿检测。
当key检测到下降沿时,key_edge产生一个时钟周期的高电平reg [17:0] cnt; //产生延时所用的计数器,系统时钟12MHz,要延时20ms左右时间,至少需要18位计数器//产生20ms延时,当检测到key_edge有效是计数器清零开始计数always @(posedge clk or negedge rst)beginif(!rst)cnt <= 18'h0;else if(key_edge)cnt <= 18'h0;elsecnt <= cnt + 1'h1;endreg [N-1:0] key_sec_pre; //延时后检测电平寄存器变量reg [N-1:0] key_sec;//延时后检测key,如果按键状态变低产生一个时钟的高脉冲。
如果按键状态是高的话说明按键无效always @(posedge clk or negedge rst)beginif (!rst)key_sec <= {N{1'b1}};else if (cnt==18'h3ffff)key_sec <= key;endalways @(posedge clk or negedge rst)beginif (!rst)key_sec_pre <= {N{1'b1}};elsekey_sec_pre <= key_sec;endassign key_pulse = key_sec_pre & (~key_sec);endmodule4.附录,源码图以及源码//顶层模块module safebox_plus(input clk,input [3:0] sw, //四位拨码开关,用作十进制密码input rst, //复位键input enter, //密码确认键input high, //十位输入键input low, //个位输入键output reg [7:0] led, //八位报警灯,led8为正确提示灯,led1为错误提示灯output reg [8:0] seg_led1, //数码管1显示个位密码output reg [8:0] seg_led2 //数码管2显示十位密码);parameter X=4'd0; //用作初始密码parameter Y=4'd0;wire enter_d; //key[3]确认密码输入wire low_d; //key[1]个位确认wire high_d; //key[2]十位确认reg [1:0] wrong_cnt; //统计错误次数reg [3:0] code_low; //个位密码reg [3:0] code_high; //十位密码reg change; //可修改密码状态reg [3:0] newcode_low; //更新密码个位reg [3:0] newcode_high; //更新密码十位//例化调用消抖模块debounce #(.N(3))u1(.clk (clk),.rst (rst),.key ({enter,low,high}),.key_pulse ({enter_d,low_d,high_d}));always@(*)//数码管显示控制模块begincase(code_low)4'd0:seg_led1=9'b000111111;//数码管1显示0 4'd1:seg_led1=9'b000000110;//14'd2:seg_led1=9'b001011011;//24'd3:seg_led1=9'b001001111;//34'd4:seg_led1=9'b001100110;//44'd5:seg_led1=9'b001101101;//54'd6:seg_led1=9'b001111101;//64'd7:seg_led1=9'b000000111;//74'd8:seg_led1=9'b001111111;//84'd9:seg_led1=9'b001101111;//9default:seg_led1=9'b100111111;//0endcasecase(code_high)4'd0:seg_led2=9'b000111111;//数码管2显示0 4'd1:seg_led2=9'b000000110;//14'd2:seg_led2=9'b001011011;//24'd3:seg_led2=9'b001001111;//34'd4:seg_led2=9'b001100110;//44'd5:seg_led2=9'b001101101;//54'd6:seg_led2=9'b001111101;//64'd7:seg_led2=9'b000000111;//74'd8:seg_led2=9'b001111111;//84'd9:seg_led2=9'b001101111;//9default:seg_led2=9'b100111111;//0endcaseendalways @(posedge clk) //密码判断beginif(!rst)beginwrong_cnt<=2'b00; //初始错误次数为0code_low<=4'b0000;code_high<=4'b0000;led<=8'b11111111;endelse if(low_d)begincode_low<=sw;endelse if(high_d)begincode_high<=sw;endelse if(enter_d)beginif(wrong_cnt!=2'd2)beginif((code_low==Y&&code_high==X)||(code_low==newcode_low& &code_high==newcode_high))beginled<=8'b01111111;wrong_cnt<=2'd0;endelsebeginled<=8'b11111110;wrong_cnt<=wrong_cnt+1;endendelseled<=8'b00000000;endend//修改控制模块always @(posedge clk)beginif(!rst)change<=0;else if(led<=8'b01111111)change<=1;if(change==1&&high_d)beginnewcode_high<=sw;endelse if(change==1&&low_d)beginnewcode_low<=sw;endendendmodule//按键消抖模块module debounce (clk,rst,key,key_pulse);parameter N = 2; //要消除的按键的数量input clk;input rst;input [N-1:0] key; //输入的按键output [N-1:0] key_pulse; //按键动作产生的脉冲reg [N-1:0] key_rst_pre; //定义一个寄存器型变量存储上一个触发时的按键值reg [N-1:0] key_rst; //定义一个寄存器变量储存储当前时刻触发的按键值wire [N-1:0] key_edge; //检测到按键由高到低变化是产生一个高脉冲//利用非阻塞赋值特点,将两个时钟触发时按键状态存储在两个寄存器变量中always @(posedge clk or negedge rst)beginif (!rst)beginkey_rst <= {N{1'b1}}; //初始化时给key_rst赋值全为1,{}中表示N个1key_rst_pre <= {N{1'b1}};endelsebeginkey_rst <= key; //第一个时钟上升沿触发之后key的值赋给key_rst,同时key_rst的值赋给key_rst_prekey_rst_pre <= key_rst; //非阻塞赋值。