1 / 13
文档名称:

EDA技术Verilog密码锁.doc

格式:doc   大小:701KB   页数:13页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

EDA技术Verilog密码锁.doc

上传人:小果冻 2024/5/11 文件大小:701 KB

下载得到文件列表

EDA技术Verilog密码锁.doc

相关文档

文档介绍

文档介绍:该【EDA技术Verilog密码锁 】是由【小果冻】上传分享,文档一共【13】页,该文档可以免费在线阅读,需要了解更多关于【EDA技术Verilog密码锁 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。电子科技大学实验报告学生姓名:吴成峰学号:2024070906016指导教师:黄志奇一、实验室名称:主楼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。、实验目的:熟悉利用HDL代码输入方式进行组合逻辑电路的设计和仿真的流程,掌握Verilog语言的根本语法。并通过一个密码锁的设计把握利用EDA软件〔〕进行HDL代码输入方式的电子线路设计与仿真的详细流程,熟悉摩尔状态机。五、实验内容:,可以设定密码并显示,输入密码以解锁;设计密码锁的顶层模块,使用模块实例语句连接前面所设计的密码锁模块;生成比特流文件下载到开发板上进行验证。六、实验器材〔设备、元器件〕:计算机〔〕;BASYS2FPGA开发板一套〔带USB-MIniUSB下载线〕。七、实验步骤:1、,新建一个工程lock。我们选用的BASYS2FPGA开发板采用的是Spartan3EXA3S100E芯片和CPG132封装,设置好器件属性,如图3所示。 2、在工程管理区任意位置单击鼠标右键,在弹出的快捷菜单中选择“NewSource〞命令,弹出新建源代码对话框,这里我们选择“VerilogModule〞类型,输入Verilog文件名“lock〞。ISE会自动创立一个Verilog的模板,并在源代码编辑区翻开,接下来的工作就是将代码编写完整。完整代码如下:modulelock(inputclk,inputclr,input[7:0]sw,input[1:0]bn,outputregpass,outputregfail); reg[3:0]pre_s,nex_s; parameterS0=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; //stateregisters always@(posedgeclkorposedgeclr) begin if(clr==1) pre_s<=S0; else pre_s<=nex_s; end //C1 always@(*) begin case(pre_s) S0:if(bn==sw[7:6]) nex_s<=S1; else nex_s<=E1; S1:if(bn==sw[5:4]) nex_s<=S2; else nex_s<=E2; S2:if(bn==sw[3:2]) nex_s<=S3; else nex_s<=E3; S3:if(bn==sw[1:0]) nex_s<=S4; else nex_s<=E4; S4:if(bn==sw[7:6]) nex_s<=S1; else nex_s<=E1; E1:nex_s<=E2; E2:nex_s<=E3; E3:nex_s<=E4; E4:if(bn==sw[7:6]) nex_s<=S1; else nex_s<=E1; default:nex_s<=S0; endcase end //C2 always@(*) begin if(pre_s==S4) pass=1; else pass=0; if(pre_s==E4) fail=1; else fail=0; end endmodule3、建立分频模块“clkdiv〞,过程如上,代码如下:moduleclkdiv( inputmclk, inputclr, outputclk190); reg[24:0]q; always@(posedgemclkorposedgeclr) begin if(clr==1) q<=0; else q<=q+1; end assignclk190=q[17];//190Hzendmodule4、建立时钟脉冲模块“clock_pulse〞,代码如下:moduleclock_pulse(inputinp,lk,inputclr,outputoutp); regdelay1; regdelay2; regdelay3; always@(lk) begin if(clr==1) begin delay1<=0; delay2<=0; delay3<=0; end else begin delay1<=inp; delay2<=delay1; delay3<=delay2; end end assignoutp=delay1&delay2&~delay3;endmodule5、建立七段数码管复用模块“hex7seg〞,代码如下:modulehex7seg( input[15:0]x, inputclk, inputclr, outputreg[6:0]a_to_g, outputreg[3:0]an, outputdp ); wire[1:0]s; reg[3:0]digit; wire[3:0]aen; reg[19:0]clkdiv; assigndp=1; assigns=clkdiv[19:18]; assignaen[3]=1; assignaen[2]=1; assignaen[1]=1; assignaen[0]=1; //四位四选一always@(*) case(s) 0:digit=x[3:0]; 1:digit=x[7:4]; 2:digit=x[11:8]; 3:digit=x[15:12]; default:digit=x[3:0];endcase//数码管显示always@(*)case(digit) 0:a_to_g=7'b0000001; 1:a_to_g=7'b1001111; 2:a_to_g=7'b0010010; 3:a_to_g=7'b0000110; 4:a_to_g=7'b1001100; 5:a_to_g=7'b0100100; 6:a_to_g=7'b0100000; 7:a_to_g=7'b0001111; 8:a_to_g=7'b0000000; 9:a_to_g=7'b0000100; 'hA:a_to_g=7'b0001000; 'hB:a_to_g=7'b1100000; 'hC:a_to_g=7'b0110001; 'hD:a_to_g=7'b1000010; 'hE:a_to_g=7'b0110000; 'hF:a_to_g=7'b0111000; default:a_to_g=7'b0000001;endcase//digitselectalways@(*)beginan=4'b1111; if(aen[s]==1) an[s]=0;end//时钟分频器always@(posedgeclkorposedgeclr)beginif(clr==1)clkdiv<=0;elseclkdiv<=clkdiv+1;endendmodule6、顶层模块lock_top设计。代码如下:modulelock_top(inputmclk,input[7:0]sw,input[3:0]btn,output[1:0]led, output[6:0]seg, output[3:0]an, outputdp); wireclr,clk190,clkp,btn012; wire[1:0]bn; wire[15:0]x; assignx={2'b00,sw[7:6],2'b00,sw[5:4],2'b00,sw[3:2],2'b00,sw[1:0]}; assignclr=btn[3]; assignbtn012=btn[0]|btn[1]|btn[2]; assignbn[1]=btn[2]; assignbn[0]=btn[1]; clkdivU1(.mclk(mclk), .clr(clr), .clk190(clk190) ); clock_pulseU2(.inp(btn012), .cclk(clk190), .clr(clr), .outp(clkp) ); lockU3(.clk(clkp), .clr(clr), .sw(sw), .bn(bn), .pass(led[1]), .fail(led[0]) ); hex7segU4(.x(x), .clk(mclk), .clr(btn[3]), .a_to_g(seg), .an(an), .dp(dp) );Endmodule7、将工程编译、综合与实现。在工程管理区的“Sourcefor〞中选取“Implementation〞选项,然后在进程管理区双击“Synthesize-XST〞进行综合,如图4所示。 综合完成以后是实现,实现主要分为三个步骤:翻译逻辑网表、映射到器件单元和布局布线,如图4所示。注意的是,在实现前还必须为模块中的输入/输出信号添加引脚约束,即添加UCF文件。开发板BASYS2的UCF文件可以在其网站上,当然也可以自己编辑UCF文件。实验所用的UCF文件如图5所示。、器件配置。首先生成可以下载到硬件中的二进制比特文件。双击图10中的“GenerateProgrammingFile〞的选线,ISE就会为设计生成相应的二进制比特文件。BASYS2开发板提供了非常方便的JTAG配置方案,使用USB-miniUSB线缆结合DigilentAdept软件实现FPGA的配置,配置界面如图6所示。这里我们对FPGA进行配置,配置成功状态栏会显示“essful〞信息,如图6所示。然后可在器件上验证设计。