可编程逻辑器件实验报告Word文件下载.docx
《可编程逻辑器件实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《可编程逻辑器件实验报告Word文件下载.docx(12页珍藏版)》请在冰豆网上搜索。
outputcout;
output[3:
0]s;
regcout,s;
always@(k)
begin
if(k==1)
{cout,s}〈=aa+bb+cin;
else
{cout,s}<
=aa-bb—cin;
end
endmodule
[2]。
自底向上(Bottom—Up)的分层次电路设计方法的VerilogHDL源文件。
moduleAdderandsubtracter1bit(k,A,B,Cin,Sum,Cout);
inputA,B,Cin,k;
outputSum,Cout;
parameter[3:
0]A=4'
b0100;
parameter[3:
0]B=4'
assignSum=(((A^k)^B)^Cin)^k;
assignCout=((A^k)&B)|((A^k)&Cin)|(B&Cin);
endmodule
moduleAdderorsubtracter4bit(k,First,Second,Carry_In,Sum_out,Carry_out);
input[0:
3]First,Second;
inputCarry_in;
output[0:
3]Sum_out;
outputCarry_out;
wire[0:
2]Car;
always@(k)
if(k==0)
Adderandsubtracter1bit
A1(First[3],Second[3],Carry_in,Sum_out[3],Car[2]);
A2(First[2],Second[2],Car[2],Sum_out[3],Car[1]);
A3(First[3],Second[3],Car[1],Sum_out[3],Car[0]);
A4(First[3],Second[3],Car[0],Sum_out[3],Carry_out);
else
A1(First[3],Second[3],Carry_in,Sum_out[3],Car[2]);
A2(First[2],Second[2],Car[2],Sum_out[3],Car[1]);
A3(First[3],Second[3],Car[1],Sum_out[3],Car[0]);
A4(First[3],Second[3],Car[0],Sum_out[3],Carry_out);
end
(3)编译源文件:
在主界面Process窗口中双击TranslateDesign,对所编辑的代码进行综合,通过后会出现绿色对号。
(4)管脚的分配:
在Diamond主界面中,点击Tools->
Spreadsheetview,打开Spreadsheetview
框.在pin一栏中填入各输入输出映射的管脚.其中定义37、38、39、40.为数据输出显示位。
54为进位位或借位位,控制键,52为加减法切换键。
(5)烧录程序,器件实现:
在Diamond主界面中,进入Tools-〉Programmer,在State栏出现PASS,即说明烧写成功。
4.实验结果及分析:
1)用加减法运算符实现:
在实验板上可以看到,发光二极管在不带进位的情况下,即cin为0时,这时应按下实验板上控制进位位与借位位的按键54时,显示为1001,在不按下按键时,即进位位cin为1时为1010,可知带进位的加法器功能完全实现;
在按下控制加减法器按键52,而且同时按下54时,为不带借位的减法器输出为1111,不按下54时,即为有借位位发光二极管显示为1110,可知带借位的减法器功能完全实现。
2)位运算符实现:
除控制加减法切换相反外,实验结果与上相同。
综上所述,达到了实验所预定的功能。
5.实验体会:
[1].对于硬件描述语言的学习的几点体会:
(1)熟悉了verilogHDL程序的基本结构。
(2)理解了VerilogHDL使用一个或多个模块电路进行建模。
其中,模块代表硬件上的逻辑实体,其范围可以从简单的门到整个大的系统。
(3)在本次实验中用到了行为级描述方式的语句,明白了“always”的重复使用,有别于“initial”只能执行一次,主要用于仿真测试而不能用于逻辑综合。
同时了解到不同的描述方式在程序中的排列先后次序是任意的。
实际上,VerilogHDL语句有三种描述方式,在模块中可以使用下述三种描述方式的任意一种或几种组合
1)数据流描述方式:
在程序中用到的assign即是,其中,逻辑表达式右边的变量受到持续的监控,一旦这些变量中的任何一个发生变化,整个表达式就会被重新计算,并将变化值赋予左边的线网变量,对组合逻辑电路使用该方式特别方便.
2)行为级描述方式:
只有寄存器类型的变量能够在,always,initial语句中被赋值,且在赋新值以前变量保持不变。
所有的initial语句和aways语句都从0时刻并行执行。
3)结构型描述方式:
(4)结构极建模包括门级建模和分层次建模两种情况,门级建模就是将逻辑逻辑电路图用verilogHDL规定的文本语言描述出来.分层次的电路设计通常有自顶向下(Top-Down)和自底向上(Bottom—Up)的设计方法。
本实验中我还采用了自底向上的方法,即先定义子模块然后调用它们组成顶层的减加器模块。
[2].关于latticediamond2。
0使用:
在实验中,在综合这一步中应在主界面Process窗口中双击TranslateDesign,对所编辑的代码进行综合。
但是我所用的机子中找不见,后来在该软件的windows窗口中进行设置后可恢复TranslateDesign选项。
实验2:
乘法器设计
设计一个3位二进制乘法器.
2.实验要求:
要求:
在软件环境下,编写源文件,参考教材《用ISP器件设计现代电路与系统》P266第3题。
3.实验过程:
(1)原理分析:
乘法器有多种实现方法,其中最典型的方法是采用部分项进行相加的方法,通常称为并行法。
其原理是:
通过逐项移位相加的原理实现,从最低位开始,若为1,则乘数左移后遇上一次的和相加;
若为0,左移后以全零相加制止被乘数的最高位。
这种算法采用纯组合逻辑来实现,其特点是:
设计思路简单直观、电路运算速度快,缺点是使用的逻辑思源较多。
(2)VerilogHDL源文件设计:
/////////////////////////////////////////////////////
modulemult(chengshua,out);
parameterbeichengshub=3'
b101;
input[2:
0]chengshua;
output[5:
0]out;
reg[5:
reg[2:
0]beichengshub;
integeri;
always@(chengshua)
inb=3’b101;
out=0;
for(i=0;
i<
3;
i=i+1)
if(beichengshub[i])
out=out+(chengshua<
〈i);
//////////////////////////////////////////////////
(3)编译源文件:
在Diamond主界面中,点击Tools—〉Spreadsheetview,打开Spreadsheetview
框。
在pin一栏中填入各输入输出映射的管脚。
其中定义37、38、39、40、43为数据输出显示位。
54、53、52为乘数输入键。
(5)烧录程序,器件实现:
在Diamond主界面中,进入Tools—〉Programmer,在State栏出现PASS,即说明烧写成功。
4.实验结果及分析:
在实验板上可以看到,在54、53、52为乘数输入键情况下,比如为101时为例,这时应按下实验板上控制进位位与借位位的按键53时,显示为11001.该结果与根据并行原理计算的结果完全相符合.
可知乘法器功能完全实现。
5。
实验体会:
在实验中为了定义乘数,被乘数等变量,即用来定义数据的时,常常用到parameter(参数)语句,它允许使用参数定义的语句定义一个标示符来代表一个常量,定义的格式为:
Parameterparameterparameter1=const_expr1,parameter2=const_expr2,…
用parameter定义的符号常量通常出现在module的内部,常被用于定义状态机的状态、数据位宽、时延大小等.另外,在VerilogHDL中,编译指令’define也可以用来定义常量,通常放在module的外部,但该常量是一个全局变量,其作用范围为从定义点开始到整个程序结束。
经过前次实验,我积累了一些经验但是在这次实验中还是遇到了很多问题,编写Verilog程序的时候,由于使用了中文字符而没有注意到,以致综合时没有通过,费了好大的功夫才找出这个问题。
实验3:
序列检测器的设计与实现
1.实验任务:
设计序列检测器。
检测器有一个输入端X,被检测的信号为二进制序列串行输入,检测器有一个输出端Z,当二进制序列连续有四个1时,输出为1,其余情况均输出为0.如:
X:
1101111110110,
Z:
0000001110000.
序列检测器可以用于检测一组或多组由二进制码组成的脉冲序列信号,这在数字通信领域有广泛的使用,当序列检测器连续收到一串二进制码后,如果这组码与检测器中预设的码相同,则输出“1”,否则输出“0”,由于这种检测的关键在于正确码的收到必须是连续的,这就要求序列检测器必须记住前一次的正确码及正确序列,直到在连续的检测中所收到的每一位码都与预置数的对应码相同,在检测的过程中任何一位不相等都将回到初始状态重新开始检测。
moduleCheck(din,clk,ab);
inputdin,clk;
output[3:
0]ab;
reg[3:
0]ab;
parameterd=4’b1111;
//--预置码
integerQ;
always@(posegeclk)//上升沿触发
begin
if(!
clk)
Q=0;
elsecase(Q)
0:
beginif(din==d[3])Q=1;
elseQ=0;
1:
beginif(din==d[2])Q=1;
elseQ=0;
2:
beginif(din==d[1])Q=1;
3:
beginif(din==d[0])Q=1;
default:
Q=0;
endcase
always@(Q)
if(Q==4)
ab=4’0001;
-—如果序列检测位数为4,则输出0001
ab=4’b0000;
//////////////////////////////////////////////////////////
在主界面Process窗口中双击TranslateDesign,对所编辑的代码进行综合,通过后会出现绿色对号。
图1:
编译源文件截图
(4)管脚的分配:
其中定义37、38、39、40为数据输出显示位.54、53、52、50为信号输入键,鉴于d0信号没有管脚定义了,所以将它与50脚的信号clk复用同一管脚。
(5)烧录程序,器件实现:
在Diamond主界面中,进入Tools—>
Programmer,在State栏出现PASS,即说明烧写成功。
在实验板上可以看到,在54、53、52、50为信号输入键情况下,比如为1111时为例,这时应不按下实验板上控制位54、53、52、50,显示为0001;
其他情况下,比如1010则输出为00000该结果与所需要达到的实验目的完全相同。
可知序列检测器功能完全实现。
综上所述,达到了实验所预定的功能.
本实验编写起来难度也不算太大。
另外,需要注意引脚的分配,在分配din及clk引脚时,不能使用Y1/RESET,Y2/SCLK,因为这是系统自带的,当有自定义的clk时,我们只能使用I/O口来对其进行分配.通过本程序的编写,自己对Verilog语言的编写有了更进一步的了解,程序的具体操作变得更加熟练。
实验4:
变模计数器设计
设计模为9,11,13,15的可变模计数器。
实验要求:
能在键盘的控制下,实现变模计数。
模可变计数器的逻辑是有一端为时钟输入,另一端为模式控制端,最多可以实现8种不同模式的计数方式,例如可以构成7进制、10进制、16进制、256进制等共八种计数模式。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
modulemchang(clk,m,Q)
inputclk;
input[2:
0]m;
output[4:
0]Q;
integercnt;
assignQ=cnt;
always@(posedgeclk)
case(m)
3’b000:
if(cnt〈9)cnt=cnt+1;
elsecnt=0;
3’b001:
if(cnt〈11)cnt=cnt+1;
3’b010:
if(cnt<
13)cnt=cnt+1;
3'
b011:
if(cnt〈15)cnt=cnt+1;
endcase
endmoudule
在主界面Process窗口中双击TranslateDesign,对所编辑的代码进行综合,通过后会出现绿色对号.
54、53、52、50为信号输入键,54为clk键,其余的为输入控制计数模的键。
(5)烧录程序,器件实现:
在Diamond主界面中,进入Tools—>
Programmer,在State栏出现PASS,即说明烧写成功。
图1:
程序烧写成功截图
在实验板上可以看到,在53、52、50为信号输入键情况下,比如为001时为例,这时应不按下实验板上控制位50键而去按下52,53键,此时为模数为9的可变计数器。
当按下54键即clk时进行加数计算,当为10是返回0值。
其余的情况与它类似不在赘述。
同时,也可以用其他仿真工具来进行实验,得到如下的时序图。
1)模为9时的计数器:
(2)模为11时的计数器:
(3)模为13时的计数器:
(4)模为15时的计数器:
可知变模计数器功能完全实现。
综上所述,达到了实验所预定的功能。
实验体会:
计数器实现模15计数。
本程序中多次用到ifelse语句,必须很清楚的理清每个ifelse语句的管辖范围,否则很容易出现错误而又检查不出来。
引脚的分配同上次相同,不能使用系统自带的,只能用I/O口来进行分配。
程序的编写中要注意always模块中被赋值的信号必须是reg型,而输出pout为wire型,是一个变量,还有等号是“==”,很容易误写为“="
等等一些小细节,这些小细节都必须引起足够的重视。
实验5:
简易计算器设计
设计模为9,11,13,15的可变模计数器.
能在键盘的控制下,实现变模计数.
模可变计数器的逻辑是有一端为时钟输入,另一端为模式控制端,最多可以实现8种不同模式的计数方式,例如可以构成7进制、10进制、16进制、256进制等共八种计数模式。