可编程ASIC设计作业_第1页
可编程ASIC设计作业_第2页
可编程ASIC设计作业_第3页
可编程ASIC设计作业_第4页
可编程ASIC设计作业_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《可编程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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论