EDA技术Verilog密码锁.docx
《EDA技术Verilog密码锁.docx》由会员分享,可在线阅读,更多相关《EDA技术Verilog密码锁.docx(14页珍藏版)》请在冰豆网上搜索。
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”、
btn[0]btn[l]btn[2:
“01”和“10”。
输入的密码与拨位开关上设置的密码相比较,产生图2所示的状态转移图。
注意:
即使密码输入错误,也必须完成完整的4位密码输入,才能进入“fail”状态E4。
图1•门锁电路的顶层模块
图2•门锁电路的状态转移图
四、实验目的:
熟悉利用HDL代码输入方式进行组合逻辑电路的设计和仿
真的流程,掌握Verilog语言的基本语法。
并通过一个密码锁的设计把握利用EDA软件(XilinxISE10.1)进行HDL代码输入方式的电子线路设计与仿真的详细流程,熟悉摩尔状态机。
五、实验内容:
1)利用HDL代码输入方式在XilinxISE10.1平台上实现一个密码锁设计,可以设定密码并显示,输入密码以解锁;
2)设计密码锁的顶层模块,使用模块实例语句连接前面所设计的密码锁模块;
3)生成比特流文件下载到开发板上进行验证。
六、实验器材(设备、元器件):
1)计算机(安装XilinxISE10.1软件平台);
2)BASYS2FPGA开发板一套(带USB-MlniUSB下载线)。
七、实验步骤:
1、在XilinxISE10.1平台中,新建一个工程lock。
我们选用的BASYS2FPGA开发板采用的是Spartan3EXA3S100E芯片和CPG132封装,设置好器件属性,如图3所示。
\M目:
',ProjectWizard”Os’,cehoa凸诧百
Selectthedevianddgsiflowfortheproject
Propertylaae
V^Lue
ProductCategory
All
Family
Autoffl&tiV*Sparlan3E
Device
XA3S100ET
Facka.ge
CFG132〒
Speed
7s
Top-LevelSourceType
HDL
SynthesisTod
XJT(V]U)L/y«rilo£)〒
Simulator
ISESim^Litor(YHDUVerily)寸
PreferredLanguage
Verilog寸
EnablsEnhancedDe-signSummtry疋
EnableFilt曹arixi哲
□
DisplayIncremental
2'
MoreInfo
Cuicel
图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;
//stateregistersalways@(posedgeclkorposedgeclr)begin
if(clr==1)pre_s<=S0;
elsepre_s<=nex_s;
end
//C1always@(*)begincase(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
//C2always@(*)beginif(pre_s==S4)pass=1;
elsepass=0;
if(pre_s==E4)fail=1;
else
fail=0;
end
endmodule
3、建立分频模块“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];//190Hz
endmodule
4、建立时钟脉冲模块“clock_pulse”,代码如下:
moduleclock_pulse(
inputinp,
inputcclk,
inputclr,outputoutp);
regdelay1;
regdelay2;
regdelay3;always@(posedgeclrorposedgecclk)begin
if(clr==1)
begin
delay1<=0;
delay2<=0;
delay3<=0;
endelse
begindelay1<=inp;delay2<=delay1;delay3<=delay2;
end
end
assignoutp=delay1&delay2&~delay3;
endmodule
5、建立七段数码管复用模块“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)begin
if(clr==1)clkdiv<=0;
else
clkdiv<=clkdiv+1;
endendmodule
6、顶层模块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));
Endmodule
Sourcefor”中
7、将工程编译、综合与实现。
在工程管理区的
选取“Implementation”选项,然后在进程管理区双击“Synthesize-XST'进行综合,如图4所示。
Sources
Frfor:
lock_tap
AddExistingSource
CreaiteNewSource
ViewDesignSummary
D电signUtilities
|>UserCoiistraints
【t^Synthesire~XST
-&丄环1ementD«sign
-Jj\GentrateProgra/Mriin^File
fiConfigureTargetDevice
图4.综合进程与源程序结构
综合完成以后是实现,实现主要分为三个步骤:
翻译逻辑网表、映射到器件单元和布局布线,如图4所示。
注意的是,在实现前还必须为模块中的输入/输出信号添加引脚约束,即添加UCF文件。
开发板BASYS2的UCF文件可以在其网站上上下载,当然也可以自己编辑UCF文件。
实验所用的UCF文件如图5所示。
图5.BASYS2开发板所需的UCF文件
6、器件配置。
首先生成可以下载到硬件中的二进制比特文件。
双击图10中的“GenerateProgrammingFile”的选线,ISE就会为设计生成相应的二进制比特文件。
BASYS2开发板提供了非常方便的JTAG配置方案,使用USB-miniUSB线缆结合DigilentAdept软件实现FPGA的配置,配置界面如图6所示。
这里我们对FPGA进行配置,配置成功状态栏会显示“ProgrammingSuccessful信息,如图6所示。
然后可在器件上验证设计。
图6.DigilentAdept界面与配置
八、实验数据及结果分析:
CT
图7.设定密码为2012
BASYSa
beyondtheory
E抵Lfe>齟
[■S谡1严"
IGiLENTicjooco
&>>:
侬
图8.输入密码0000,led[0]亮,输入错误
j&
T
iOOrtHl
c>®:
UCLK[QQQG
rtXfiSSrJra,
Iu-m-bvW^s"1—■
DIGILENTicdoooJ2
THEOIgp>■
艰雜1脸怎Jte鼬口I!
图8.输入密码2012,led[1]亮,输入正确
九、实验结论:
由上面实验结果可得,实验仿真结果证明了设计的正确性,该
设计是合理的,能够满足实验所需的,完成了题设要求。
十、总结及心得体会:
此次实验结合了前几次的学习的成果,将七段数码管复用的部分结合进来,并通过分频电路和时钟脉冲电路来实现通过按键对时序系统的输入,而密码锁本身即是时序电路摩尔机的利用。
至此,我们完整的梳理了一遍这个学期的所学,组合电路设计,时序电路设计合为一体,更能深刻的理解Verilog语言和EDA,收获良多。
报告评分:
指导教师签字: