HDL实验报告.docx
《HDL实验报告.docx》由会员分享,可在线阅读,更多相关《HDL实验报告.docx(18页珍藏版)》请在冰点文库上搜索。
HDL实验报告
HDL实验报告
专业:
学号:
姓名:
指导老师:
实验一:
modelsim软件使用……………………………………….…………………3
实验二:
简单组合电路设计……………………………………….………………5
实验三:
二进制全加器设计….……………………………………………………..7
实验四:
二进制计数器设计….………………………………………………………………..…12
实验五:
基本IO口硬件实现…..………………………………………………..…16
实验一Modelsim仿真软件的使用
一、实验目的
(1)熟悉Modelsim软件;
(2)掌握Modelsim软件的编译、仿真方法
(3)熟练运用Modelsim软件进行HDL程序设计开发
二、实验步骤
(1)学习,练习使用Modelsim软件
(2)用VerilogHDL程序实现一个异或门,Modelsim仿真,观察效果
三、实验结果
1.程序:
moduleyihuo(a,b,c);
inputa,b;
outputc;
assignc=a^b;
endmodule
测试文件:
modulet_yihuo;
rega,b;
wirec;
initial
begin
a=1’b0;b=1’b0;
#20a=1’b1;b=1’b0;
#20a=1’b0;b=1’b1;
#20a=1’b1;b=1’b1;
end
yihuou1(a,b,c);
endmodule
仿真波形:
四、心得
1、编程时候要注意不能少了句子末尾的分号;
2、initial后面不能有分号;
3、程序第一行后面得加上分号,但是末尾不需要。
实验二简单组合电路设计
一、实验目的
(1)掌握基于Modelsim的数字电路设计方法;
(2)熟练掌握HDL程序的不同实现方法
二、实验内容
设计一个三人表决器(高电平表示通过),实验内容如下:
(1)三个人,一个主裁判,两个副裁判;
(2)规则:
只要主裁判同意,输出结果为通过;否则,按少数服从多数原则决定
是否通过。
使用VerilogHDL程序实现上述实验内容,并使用modelsim仿真(要求:
至少使用两种
方法实现上述实验内容和testbench)。
三、实验结果
程序1
moduleone(ina,inb,inc,outc);
inputina,inb,inc;
outputoutc;
regoutc;
always@(inaorinborinc)
outc=ina|inb&inc;
endmodule
程序2
moduleone(ina,inb,inc,outc);
inputina,inb,inc;
outputoutc;
asignoutc=ina|inb&inc;
endmodule
测试文件:
modulet_biaojue;
rega,b,c;
wirey;
initial
begin
a=1'b0;
forever#10a=~a;
end
initial
begin
b=1'b0;
forever#20b=~b;
end
initial
begin
c=1'b0;
forever#40c=~c;
end
onet(a,b,c,y);
endmodule
仿真波形如下:
实验心得:
第一次独立使用modelsim软件,从一开始的生疏,到做完实验后慢慢地了解如何使用这个软件,并自己做出了基本的仿真,通过仿真验证程序的对与错。
并且在老师的讲解下,我懂得了如何找到错误,发现错误,并如何改正错误。
实验三二进制全加器设计
一、实验目的
(1)熟悉VerilogHDL元件例化语句的作用
(2)熟悉全加器的工作原理
(3)用VerilogHDL语言设计四位二进制全加器,并仿真,下载验证其功能
二、实验原理
(1)一位全加器原理:
Ai,Bi分别是两个二进制位,Ci-1是前级进位,Ci是进位,Si是加法结果。
表达式:
Si=Ai^Bi^Ci-1 ;
Ci-1=Ai&Bi|Ai&Ci-1|Bi&Ci-1 ;
四位全加器:
四个一位全加器串联;
三、实验内容
(1)用VerilogHDL语言描述一位全加器,并使用modelsim仿真验证结果。
(2)用VerilogHDL元件例化语句实现四位全加器,modelsim仿真并下载到实验箱,
用按键模拟输入,led灯模拟输出,验证结果。
(3)设计程序将加法结果分开输出,即十位数和个位数分别用四位数组表示。
四、实验结果
一位全加器程序:
moduleadd_1(a,b,ci,cout,co);
inputa,b,ci;
outputcout,co;
regcout;
regco;
always@(aorborci)
begin
cout=a^b^ci;
co=(a&b)|(a&ci)|(b&ci);
end
endmodule
四位全加器程序:
moduleadd_4(a,b,ci,count,co);
input[3:
0]a;
input[3:
0]b;
inputci;
output[3:
0]count;
outputco;
wirec1,c2,c3;
begin
add_1add1(a[0],b[0],ci,count[0],c1);
add_1add2(a[1],b[1],c1,count[1],c2);
add_1add3(a[2],b[2],c2,count[2],c3);
add_1add4(a[3],b[3],c3,count[3],co);
end
endmodule
四位全加器测试程序;
modulet_add_4;
reg[3:
0]ad1,ad2;
regc;
wiresc;
wire[3:
0]ss;
initial
begin
ad1=4'b0;
forever
#1ad1=ad1+4'b1;
end
initial
begin
ad2=4'b0;
forever
#16ad2=ad2+4'b1;
end
initial
begin
c=0;
forever
#256c=~c;
end
add_4u3(ad1,ad2,c,ss,sc);
endmodule
仿真波形:
思考题:
二进制加法的十进制个十分离:
moduleB_TO_D(clk,a,b,c0,s0,s1,t1,t0);
input[3:
0]a,b;
inputc0,clk;
output[3:
0]s0,s1,t1,t0;
wire[3:
0]s;
reg[3:
0]t0,t1;
wire[4:
0]S;
wirec1,c2,c3,c4;
add_1u1(a[0],b[0],c0,s[0],c1);
add_1u2(a[1],b[1],c1,s[1],c2);
add_1u3(a[2],b[2],c2,s[2],c3);
add_1u4(a[3],b[3],c3,s[3],c4);
assignS={c4,s};
always@(posedgeclkorposedgeS)
if(S<5'b1010)
begin
t1<=4'b0;
t0<=s;
end
elseif(5'b1010<=S<5'b10100)
begin
t1<=4'b1;
t0<=S-5'b1010;
end
elseif(5'b10100<=S<5'b11110)
begin
t1<=4'b10;
t0<=S-5'b10100;
end
else
begin
t1<=4'b11;
t0<=S-5'b11110;
end
DD1(s1,clk,t1);
DD0(s0,clk,t0);
endmodule
moduleD(q,clk,d);
inputclk;
input[3:
0]d;
output[3:
0]q;
reg[3:
0]q;
always@(posedgeclk)
q<=d;
endmodule
仿真程序:
moduleT_B_TO_D;
reg[3:
0]a,b;
regc0,clk;
wire[3:
0]s0,s1,t1,t0;
initial
begin
clk=1'b0;
forever#10clk=~clk;
end
initial
begin
a=4'b0;
forever#10a=a+4'b1;
end
initial
begin
b=4'b0;
forever#160b=b+4'b1;
end
initial
begin
c0=1'b0;
forever#2560c0=~c0;
end
B_TO_Du1(clk,a,b,c0,s0,s1,t1,t0);
endmodule
5、心得体会
1、可以把复杂的问题分解为数个小问题,逐个解决,最终达到目的,就像数全加器,整体复杂,其实单个全加器就简单得多。
2、要熟悉掌握数电知识并且灵活运用。
六、思考题
在仿真时,输出结果会有毛刺,采用什么方法可以消除毛刺?
答:
利用D触发器可以消除毛刺
实验四二进制计数器设计
一、实验目的
(1)熟悉VerilogHDL时序电路的设计方法;
(2)了解清零和使能的概念,以及同步清零和异步清零的区别
(3)用VerilogHDL语言设计二进制计数器,并仿真;
二、实验原理
一般计数器可以分为两类:
加法计数器和减法计数器。
加法计数器每来一个脉冲计数
值加1;减法计数器每来一个脉冲计数器值减1;有时将两者做在一起称可逆计数器。
三、实验内容及步骤
(1)编程实现二进制计数器并仿真。
按实验原理要求编写一个二进制计数器,并仿真。
实验步骤:
(1)编程实现十进制计数器,含同异步清零端和进位输出端,编程实现,并modelsim
仿真。
(2)增加预置功能(增加五位输入引脚),实现任意的五位二进制数的计数器。
四、实验结果
计数器程序:
modulecounter(count,cout,clk,rst);
inputclk,rst;
output[3:
0]count;
outputcout;
reg[3:
0]count;
regcout;
always@(posedgeclkorposedgereset)
begin
if(!
reset)
begin
count<=4'b0000;
cout<=1'b0;
end
elseif(count==4'b1111)
begin
count<=4'b0000;
cout<=1'b1;
end
else
begin
count<=count+4'b0001;
cout<=1'b0;
end
end
endmodule
测试程序
modulet_count;
regclk,rst;
wire[3:
0]count;
wirestate;
parametertime_=320;
initial
begin
clk=0;
forever#(time_/32)clk=~clk;
end
initial
begin
rst=0;
forever#(time_)rst=~rst;
end
counteru1(count,state,clk,rst);
endmodule
四、仿真效果图
带有预置功能的任意五位二进制计数器程序:
moduleyuzhi_jishu(clk,rst,ina,count,co);
inputclk,rst;
input[4:
0]ina;
output[4:
0]count;
outputco;
reg[4:
0]count;
regco;
always@(posedgeclkornegedgerst)
if(!
rst)
begin
count<=ina;
co<=1'b0;
end
else
if(count==5'b11111)
begin
count<=ina;
co<=1'b1;
end
else
begin
count<=count+1'b1;
co<=1'b0;
end
endmodule
测试程序:
moduletest_yuzhijishu;
reg[4:
0]ina;
regclk;
regrst;
wire[4:
0]count;
wireco;
initial
begin
clk=1'b0;
forever#1clk=~clk;
end
initial
begin
rst=1'b1;
#9rst=1'b0;
#11rst=1'b1;
end
initial
begin
ina=5'b0;
#10ina=5'b1;
#40ina=5'b10;
end
yuzhi_jishuu1(clk,rst,ina,count,co);
endmodule
仿真波形:
五、心得体会
(1)、本次试验,我了解了用HDL描述时钟电路的一般思想,学会了基本时钟的设计及初始化;
(2)、计数器的预置功能,归结于计数器复位以及计数器满时,计数起点应该是预置数,而不总是零。
实验五、基本IO实验
一、实验目的
(1)学习QuartusⅡ5.0的基本操作。
(2)熟悉教学实验板的使用。
(3)初步掌握Verilog语言的设计输入,编译,仿真和调试过程。
二、实验原理
利用一个常开按钮(实验板上的KEY1)作为输入(常开时输入1,闭合时输入0),经过一个反相器后输出到核心板的一个LED。
KEY1常开时,LED灭,按下(闭合)实验板上的KEY1,该LED点亮。
三、实验步骤
1、建立工程
运行QuatrusII软件,建立工程,File→NewProjectWizad
点击NewProjectWizard后弹出指定工程名的对话框,在Diectory,Name,Top-LevelEntity
2、建立文本文件
输入下述程序:
moduletestio(key1,led1);
inputkey1;
outputled1;
assignled1=~key1;
endmodule
将程序保存为testio.v。
建立文本文件。
File→New,选择VerilogHDLFile
3、分配管脚
为芯片分配管脚可以用QuartusII软件里的“Assignments→Pins”菜单,也可以用tcl脚本文件
对应于EP1C6核心板:
set_global_assignment-nameRESERVE_ALL_UNUSED_PINS"ASINPUTTRI-STATED"
set_global_assignment-nameENABLE_INIT_DONE_OUTPUTOFF
set_location_assignmentPIN_181-toled1
set_location_assignmentPIN_64-tokey1
保存到工程目录下,并注意在保存对话框选上“Addfiletocurrentproject”选项。
然后打开Tools->TclScripts,选中刚才编辑的Script文件:
Setup,并点击Run
4、编译
按主工具栏上的编译按钮即开始编译
5、下载
(1)下载设置:
如果第一次使用下载线下载配置文件到FPGA,则需要在Q2软件设置下载线的型号等信息。
先将ByteBlasterII下载线的一头接到PC的并口,执行菜单Tools→Programmer
在Hardwaretype下拉列表选择“ByteBlasterMVorByteBlasterII”,点OK返回“HardwareSetup”对话框,从“Currentlyselectedhardware:
”下拉列表选择ByteBlasterII[LPT1],点击“Close”返回下载界面,可看到下载线已经被添加
(2)将ByteBlasterII下载线一头与PC连接,另一头插入到JTAG口或EPCS4的下载口。
(3)FPGA核心板接上5V电源。
(4)如果只是调试一下设计是否成功,可通过JTAG口把芯片的配置信息下载到FPGA芯片内,掉电后配置信息丢失。
此时,下载界面的“Mode:
”下拉列表应选择“JTAG”,并选择工程中.sof后缀的文件进行下载
四、实验结果
在本例的设计中,我们利用一个常开按钮(实验板上的KEY1)作为输入(常开时输入1,闭合时输入0),经过一个反向器后输出到核心板的第一个LED;因此按下(闭合)实验板上的KEY1,该LED灭。
五、实验心得
通过本次实验,加深了对FPGA设计流程的理解及QuartusII软件的基本用法,对FPGA实验开发板有了一定的认识,为以后的课程设计打下了一定的基础。