版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《可编程ASIC技术》课程作业2015
1.请对下列VerilogHDL模块进行仿真和分析,说明其描述方式,画出对应的
逻辑图或写出逻辑表达式(组),并概括地说明其逻辑功能。
moduleexeln(out,d3,d29dl9dO9sl,sO);
outputout;
inputd3,d29dl9dO9sl,sO;
not(not_sl,sl),(not_sO,sO);
and(outO,dO,not_sl,not_sO),(outl,dl9not_sl,sO);
and(out2,d2,si,not_sO),(out3,d3,si,sO);
or(out,outO,outl,out2,out3);
endmodule
将程序进行功能仿真,功能仿真图如下所示:
(1)当s1=0,s0=0时
(2)当s1=O,sO=1时
MasterTimeBar0ps小|Pointer:4.9n$Interval:4.9nsStart:
Valueat
Name
0ps
•0doA0
•1dlA0
♦2d2A0
•3(13A0
*4sOA1
•5siA0
»6outA0
(3)当s1=1,s0=0时
(4)当s1=1,s0=1时
MasterTimeBar:0ps"Pointer:200psInterval:200psSt<
10.0ns20.0ns30.0ns40.0ns
Name0ps°PS
dOA0__________________________________||____________
21dlA0________________|I1|____________
♦2d2A0________|111111
•3d3A°_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1____________
•4sOA1
•5siA1
outA0__J-l_O______
由仿真图分析知,根据不同的s1和so,输出通道进行变化:
(1)当s1=0,s0=0时,out=dO;
(2)当s1=0,s0=1时,out=d1;
(3)当s1=1,s0=0时,out=d2;
(4)当s1=1,s0=1时,out=d3o
逻辑表达式组:
Out=d(s1s2)
实现的逻辑功能就是典型的4选1数据选择器
2.请对下列VerilogHDL模块进行仿真和分析,用时序波图形或流程框图描述
其行为,并概括地说明其逻辑功能。如果要使输出fd_out的占空比为50%,需
要对该模块做什么修改?
moduleexe2n(fd_out,elk,d,clr);
outputfd_out;
regfd_out;
input[15:0]d;
inputelk,clr;
reg[15:0]cut;
always@(posedgeelk)
begin
if(!clr)ent<=4'h0000;
elsebegin
ent<=ent-1;
if(cnt==O)beginfd_out<=1;ent<=d;end
elsefd_out<=0;
end
end
endmodule
(1)将程序进行功能仿真,仿真波形图如图所示:
MasterTimeBar:Ops<|»|Pointer|2346nsIriteival:23.46n$Start:End:[
由图知,该程序实现的是可变模的减法计数器,输出的是每当到达设定模
值就输出1,相当于对设定模进行检测。
(2)若要使输出fd_out占空比为50%,则可以规定模值d=1,如下图:
3.请对下列VerilogHDL模块进行仿真和分析,写出对应的逻辑表达式(组)
或真值表,并概括地说明其逻辑功能。
moduleexe3n(op_result,func_sel,op_a,op_b);
output[7:0]op_result;
input[2:0]func_sel;
input[3:0]op_a,op_b;
reg[7:0]op_result;
always@(func_selorop_aorop_b)
begin
case(func_sel)
3'b000:op_result<=op_a+op_b;
3'b001:op_result<=op_a-op_b;
3'b010:op_result<=op_a*op_b;
3'b011:op_result<=op_a/op_b;
3fbl00:op_result<=op_a&op_b;
315101:op_result<=op_aIop_b;
315110:op_result<=op_aAop_b;
315111:op_result<=op_a~八op_b;
endcase
end
endmodule
MuxO
DMDCT
将程序进行功能仿真,功能仿真波形如图:
MasterTimeBar:10.0n$<|Pointer:244p$Intervat霸屏nsStart[End:
)ps10.0ns20.0n30.Cns40.0ns50.0n60.0n.70.0n80.0产
Value
Name
10010.Cns
u^o国.一.lAI([0][1]X[2][3]X⑷x15]X[6JX⑺X。
最4田P_aU!5
1^9国P_bU110
金14□suitV21(15251X500X15X240XIE
;;
15--■■7]UI___________-1________________________________._______________________________1L
216-..6]u-------------1__________________________1L
017-.5]u________________________________1L
a18-..4]uL
319-.3]u1_r-1
Q20-...2]UI111
<£>21-••.1]u
L..o]________________।।________r
322uL____________n1
(1)当fun_sel=000时,op_result=op_a+op_b
(2)当fun_sel=001时,op_result=op_a-op_b;
(3)当fun_sel=010时,op_result=op_a*op_b;
(4)当fun_sel=011时,op_result=op_a/op_b;
(5)当fun_sel=100时,op_result=op_a&op_b;
(6)当fun_sel=101时,op_result=op_a|op_b;
(7)当fun_sel=110时op_result=op_aAop_b;
(8)当fun_sel=111时op_result=op_a~Aop_b;
由此可知,该段程序实现的功能是:
根据不同的输入选择信号(000,001,010,011,100,101,110,111),对于两个四
位二进制数进行加、减、乘、除、与、或、异或、同或运算。
4.请用持续赋值语句,设计一个可实现带使能端(E=l使能)的双4选1数据
选择器的VerilogHDL模块。
带使能端的双4选1的数据选择器程序:
moduleexe4n(out,in0,inl,in2,in3,in4,in5,in6,in7,sel,en);
inputinO,in1,in2,in3,in4,in5,in6,in7;
outputout;
input[2:0]sei;
inputen;
regout;
always@(inOoriniorm2orm3orin4orin5orin6orin7orsei)
begin
if(en)out<=0;
elsebegin
case(sel)
3*b000:out=inO;
3,b001:out=inl;
3boi0:out=in2;
3,b011:out=in3;
3'bl00:out=in4;
3'bl01:out=in5;
31bl10:out=in6;
31bl11:out=in7;
default:out=3,bx;
endcase
end
end
endmodule
Tn
n7o
n6o
n5n
n4o
n3o
n2B
n1
nOo
MUX
en^--------------------------------------
当使能端en=l,无效时,out=0;
TimeBar:0pi如。g-|一诉一四「。依E做|5
k
k
互
鼠
鼠
H翳
5.请用VerilogHDL或VHDL,设计一个功能和引脚与74138类似的译码器,
并在Quartus下对其进行仿真验证。
译码器程序:
moduleexe5n(out,in,en);
output[7:0]out;/*定义八位二进制码输出口*/
input[2:0]in;/*定义三位二进制码输入口*/
input[2:0]en;/*三个便能端*/
reg[7:0]out;
always@(inoren)
begin
if(en==3'bl00)
case(in)
3'dO:out=8'blllllllO;
3'dl:out=8'bllllll01;
3'd2:out=8'blllll011;
3'd3:out=8'bllll0111;
3'd4:out=8'blll01111;
3'd5:out=8'bll011111;
3'd6:out=8'bl0111111;
3'd7:out=8'b01111111;
endcase
elseout=8'bllllllll;
end
endmodule
DecoderO
译码器仿真波形
6.请用VerilogHDL或VHDL,设计一个可同步预置、异步清零的8位移位寄
存器,并在Quartus下对其进行仿真验证。
可预置、可清零的移位寄存器程序:
moduleexe6n(out,in,reset,set,elk);
output[7:0]out;/*定义四位输出端*/
inputin,reset,set,elk;/*输入信号、清零端、置数端、时钟信号*/
reg[7:0]out;
reg[7:0]md;/*置数寄存器*/
always@(posedgeelk)
begin
beginmd=4'b0000U01;end/*这里预置数为00001101,可以根据需要更改列
if(reset)
beginout<=0;end
else
begin
if(set)
beginoutv=md;end/*置数信号为1,置数*/
else
beginout<={out,in};end
end
end
endmodule
移位寄存器的仿真波形图
7.请用VerilogHDL或VHDL,设计一个上升沿触发的可预置、可清零的256
进制计数器,并在Quartus下对其进行仿真验证。如果要将其改为60进制计数
器,应对该设计做哪些修改?
(1)可预置、可清零的256进制计数器程序:
moduleexe7n(out,in,reset,set,elk);
output[7:0]out;/*计数器的输出端*/
input[7:0]in;/*预置初始值的输入段*/
inputreset,set,elk;
reg[7:0]out;
always@(posedgeelk)
begin
if(!reset)outv=8'h00000000;/*清零端,低电平有效*/
elseif(se。outv=in;/*预置数*/
elseout<=out+l;
end
endmodule
out(6]-reg0
仿真波形:
(2)可预置、可清零的60进制计数器程序:
moduleexe7n(out,in,reset,set,elk);
output[7:0]out;/*计数器的输出端*/
input[7:0]in;/*预置初始值的输入段*/
inputreset,set,elk;
reg[7:0]out;
always@(posedgeelk)
begin
if((!reset)||(out==8'b00111100))out<=8'h00000000;/*这里遇到60时
就清零,这样实现了10进制*/
elseif(set)out〈=in;/*预置数*/
elseout<=out+1;
end
endmodule
仿真波形:
11.875ns<||Pointer:597.31nsInterval:585.44n$Start:
NAMasterTimeBar:End:
英
E
同
久
一
8.请使用VerilogHDL,分别用结构描述、数据流描述、行为描述三种方式,设
计一个8位可级联加法器(有进位输入、进位输出),并比较上述三种描述方式
各自的优缺点。
8位加法器结构描述程序:
/*主程序*/
moduleexe8n(sum,cout,a,b,cin);
inputcin;input[7:0]a,b;output[7:0]sum;outputcout;
full_addlf0(a[0],b[0],cin,sum[0],cinl);
full_add1fl(a[l],b[l],cin1,sum[l],cin2);
full_addlf2(a[2],b[2],cin2,sum[2],cin3);
full_addlf3(a[3],b[3],cin3,sum[3],cin4);
full_add1f4(a[4],b[4],cin4,sum[4],cin5);
full.addlf5(ar5],b[5],cin5,sum[5],cin6);
full_addlf6(a[6],b[6],cin6,sum[6],cin7);
full.addlf7(a[7],b[7],cin7,sum[7],cin8);
endmodule/*调用程序*/
modulefull_add1(a,b,cin,sum,cout);
inputa,b,cin;outputsum,cout;wiresi,ml,m2,m3;
and(m1,a,b),(m2,b,cin),(m3,a,cin);
xor(sl,a,b),(sum,s1,cin);or(cout,mI,m2,m3);
endmodule
MasterTimeBar:80.0ns州Pointer|79L01nsInterval-990p$Start:End:
8位加法器数据流描述程序:
moduleexe82n(count,sum,a,b,cin);/*进位信号、和、两个加数、低位的进位信号*/
inputcin;/*低位的进位信号,作为低位加法器,该信号为0;作为高位加法器,
该信号根据进位变化*/
input[7:0]a,b;
output[7:0]sum;
outputcount;
assign{count,sum}=a+b+cin;
endmodule
仿真波形
8位加法器行为描述程序:
moduleexe83n(count,sum,a,b,cin);
inputcin;/*低位的进位信号,作为低位加法器,该信号为0;作为高位加法器,
该信号根据进位变化*/
input[7:0]a,b;/*两个两位二进制加数*/
output[7:0]sum;/*和*/
outputcount;/*进位信号*/
reg[7:0]sum;
regcount;
always®(aorborcin)
begin
{count,sum}=a+b+cin;
end
endmodule
仿真波形:
9.请利用状态机设计一个序列检测器,该检测器在输入序列为“1001”时输出为
1,其他情况下输出为0。请画出状态转移图,并用VerilogHDL进行设计和仿真。
状态说明:
S0:表示初始状态;
S1:表示检测到一个“1”信号;
S2:表示检测到一个“10”信号;
S3:表示检测到一个“100”信号;
S4:表示检测到一个“1001”信号;
状态图:
序列检测器程序:
moduleexe9n(out,in,elk,reset);
outputouty*结果输出端*/
inputin;/*串行输入的数据*/
inputreset,elk;/*清零信号、时钟信号*/
regout;
reg[2:0]S,NS;
parameterS0=3'h000,Sl=3'h001,S2=3'h010,S3=3'h01l,S4=3'hl00;/*K夫态编码*/
always®(posedgeelkornegedgereset)/*根据输入信号更新状态*/
begin
if(!reset)S<=S0;
elseS<=NS;
end
always®(Sorin)/*根据输入,锁存记忆输入信号*/
begin
case(S)
SO:if(in)NS=S1;
elseNS=S0;
Sl:if(in)NS=S1;
elseNS=S2;
S2:if(in)NS=S1;
elseNS=S3;
S3:if(in)NS=S0;
elseNS=S4;
S4:if(in)NS=S1;
elseNS=S0;
endcase
end
always@(Sorresetorin)/*输出对应的结果*/
begin
if(!reset)out<=0;
elseif(S==S4)out<=1;
elseout<=0;
end
endmodule
仿真波形:
序列检测器检测“1001”信号仿真波形图
10.请设计一个加法器,实现sum=a0+al+a2+a3,a0、al、a2、a3宽度都是8位。
如用下面两种方法实现,哪种方法更好一些(即速度更快and/or资源更省)。
(1)sum=((a0+al)+a2)+a3
(2)sum=(a0+al)+(a2+a3)
(1)加法器程序:
moduleexe1On(sum,cout,cout1,cout2,aI,a2,a3,a4,cin,clk);
output[7:0]sum;/*和*/
outputcout1,cout2,cout;/*每执行一个加法产生的进位信号*/
input[7:0]al,a2,a3,a4;/*四个八位二进制数*/
inputcin,clk;/*cin为低位进位信号,低位加法时为0,elk为时钟信号*/
reg[7:0]Sl,S2,sum;
regcoutl,cout2,cout;
always@(posedgeelk)
begin
{coutl,Sl}=al+a2+cin;/*第一个时钟来执行第一步加法去
end
always@(posedgeelk)
begin
{cout2,S2}=Sl+a3;/*第二个时钟来执行第二步加法*/
end
always@(posedgeelk)
begin
{cout,sum}=S2+a4;/*第三个时钟来执行第三步加法*/
end
endmodule
经典时序仿真图:
tsutcoCustomDelays
Value
FromS1[0]
To52(61
Clockperiod6.800n$
Freouencv147.06MHz
(2)程序:
moduleexe10_2n(cout1,cout2,cout,sum,a1,a2,a3,a4,cin,clk);
output[7:0]sum;/*和*/
outputcoutl,cout2,cout;/*每执行一个加法产生的进位信号*/
input[7:0]al,a2,a3,a4;/*四个八位二进制数*/
inputcin,clk;/*cin为低位进位信号,低位加法时为0,elk为时钟信号*/
reg[7:0]Sl,S2,sum;
regcoutl,cout2,cout;
always@(posedgeelk)
begin
{coutl,Sl}=al+a2+cin;/*第一个时钟来执行第一步加法*/
end
always@(posedgeelk)
begin
{cout2,S2)=a3+a4;/*第二个时钟来执行第二步加法*/
end
always©(posedgeelk)
begin
{cout,sum}=Sl+S2;/*第三个时钟来执行第三步加法*/
end
endmodule
经典时序仿真图:
RegisteredPerfor»ance|tpd|tsu|tco|th|CustomDelays|
Oock:[ciiT
__________Value
FromS2j6j-
To_______$um(6rreg0
Clockperiod7.500ns
Frequency133.33MHz
由图知,明显第一种方法速度更快点!
11.请用流水线技术对上例中的sum=((a0+a1)+a2)+a3的实现方式进行优化,对
比最高工作频率,并分析说明流水线设计技术为何能提高数字系统的工作频率?
(1)未采用流水线技术程序:
moduleexe11n(sum,cout,cout1,cout2,aI,a2,a3,a4,cin,clk);
output[7:0]sum;/*和*/
outputcout1,cout2,cout;/*每执行一个加法产生的进位信号*/
input[7:0]al,a2,a3,a4;/*四个八位二进制数*/
inputcin,clk;/*cin为低位进位信号,低位加法时为0,dk为时钟信号*/
reg[7:0]Sl,S2,sum;
regcoutl,cout2,cout;
always@(posedgeelk)
begin
{coutl,Sl}=al+a2+cin;/*第一个时钟来执行第一步加法*/
end
always@(posedgeelk)
begin
{cout2,S2}=Sl+a3;/*第二个时钟来执行第二步加法7
end
always@(posedgeelk)
begin
{cout,sum}=S2+a4;/*第三个时钟来执行第三步力口法*/
end
endmodule
未采用流水线技术经典时序仿真图:
ICuitMI
(2)采用流水线技术程序:
moduleaddderlI_2n(coutl,cout2,cout3,sum,al,a2,a3,a4,cin,clk);
output[7:0]sum;/*总和*/
outputcoutl,cout2,cout3;/*每执行两个数相加产生的进位信号*/
input[7:0]al,a2,a3,a4;/*四个加数*/
inputcin,elk;/*低位进位信号,作低位加法器为0、时钟信号*/
reg[7:0]sum,suml,sum2;
regcoutl,cout2,cout3,firstc,secondc,thirdc;
reg[3:0]tempal,tempa2,tempa3,tempbl,tempb2,tempb3,firstsum,secondsum,thirdsum;
/*存储每四位相加的寄存器类型数*/
always@(posedgeelk)
begin
{firstc,firstsum}=al[3:0]+a2[3:0]+cin;/*a1和a2低四位相加*/
tempal=al[7:4];
tempbl=a2[7:4];
end
always@(posedgeelk)
begin
{cout1,sum1[7:4]}=tempa1+tempb14-firstc;/*a2和a2高四位相加*/
suml[3:0]=firstsum;
end
always@(posedgeelk)
begin
{secondc,secondsum)=sum1[3:0]+a3[3:0];/*前两数的和的低四位和a3低四位
相加*/
tempa2=suml[7:4];
tempb2=a3[7:4];
end
always@(posedgeelk)
begin
{cout2,sum2[7:4]}=tempa2+tempb2+secondc;/*前两数的和的高四位和a3高四
位相加*/
sum2[3:0]=secondsum;
end
always@(posedgeelk)
begin
{thirdc,thirdsum}=sum2[3:0]+a4[3:01;/*前三数的和的低四位和a4低四位相加
*/
tempa3=sum2[7:4];
tempb3=a4f7:4];
end
always@(posedgeelk)
begin
{cout3,sum[7:4])=tempa3+tempb3+thirdc;/*前两数的和的高四位和a2高四位
相加*/
sum[3:0]=thirdsum;
end
endmodule
流水线技术经典时序仿真图:
NrArww|ipd|ttu|tc«|U|C«xit4a|
lenob2tol
wm2[5]
aockpwd&500m
Fmouencv153«MHr
采用流水线技术提高工作频率的原因:采用流线技术就是用一级一级的寄存
器组将大的组合逻辑切割成小的组合逻辑,以牺牲电路的面积来换取速度的。这
样就相当于分工,把一个大的工作分成几部分同时进行,这样就提升了速度。
12.请利用VerilogHDL或VHDL,设计一个可利用FPGA实验装置实现的电
子定时器。要求能够:①定时值分为100秒、60秒两档,利用开关Set来选择;
②利用外部输入的10MHz晶振信号,分频得到10Hz时钟信号(周期为0.1S);
③从按键Start按下时开始倒数计时(即减法计数);④利用3位共阴数码管,即
时显示当前计时值XY.Z;⑤当定时时间到(即计数值为0)时,停止计数并发
出报警信号Alarm(高电平有效)。
程序:
moduleexe12n(clk,key,dig,seg);
inputelk;
input[1:0]key;
output[7:0]dig;
outputf7:0]seg;
reg[7:0]seg_r;
reg[7:0]dig_r;
reg[3:0]disp_dat;
reg[24:0]count;
reg[15:0]hour;
regsec,keyen;
reg[1:0]dountl,dount2,dount3;
wire[1:0]key_done;
assigndig=dig_r;
assignseg=seg_r;
always@(posedgeelk)
begin
count=count+rbl;
if(count==25'd600000)
begin
co
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 44864-2024信息技术生物特征识别手部血管识别终端通用规范
- 《劳动教育实践》课后笔记
- 《工程化学》本科笔记
- 无人船生产企业的完整账务处理-做账实操
- wipo-2023年海牙年鉴摘要
- 2025新译林版英语七年级下Unit 5 Animal friends单词表
- 安徽皖南八校2024-2025学年高三年级上册8月摸底考试地理试题
- 2024年双端面磨床项目资金筹措计划书代可行性研究报告
- 2024年农业运输项目资金筹措计划书代可行性研究报告
- 小升初常考易错题-现代文阅读检测卷(二)-2022-2023学年部编版六年级语文下册
- 芥末酱行业报告
- 玉米种子销售计划书
- 刑事受害人授权委托书范本
- 《电动叉车培训教材》课件
- 第3.2课《简单相信傻傻坚持》(课件)-【中职专用】高二语文同步课件(高教版2023·职业模块)
- 家纺面料未来发展趋势报告
- 专业知识的敏捷和迭代
- 学校食堂消防安全知识培训
- 企业职工代表大会条例
- 总监理工程师个人工作总结
- 马铃薯购销合同范本
评论
0/150
提交评论