蔡觉平老师西电Verilog HDL上机大作业硬件描述语言微电子学院.docx

上传人:b****3 文档编号:24759828 上传时间:2023-06-01 格式:DOCX 页数:20 大小:72.87KB
下载 相关 举报
蔡觉平老师西电Verilog HDL上机大作业硬件描述语言微电子学院.docx_第1页
第1页 / 共20页
蔡觉平老师西电Verilog HDL上机大作业硬件描述语言微电子学院.docx_第2页
第2页 / 共20页
蔡觉平老师西电Verilog HDL上机大作业硬件描述语言微电子学院.docx_第3页
第3页 / 共20页
蔡觉平老师西电Verilog HDL上机大作业硬件描述语言微电子学院.docx_第4页
第4页 / 共20页
蔡觉平老师西电Verilog HDL上机大作业硬件描述语言微电子学院.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

蔡觉平老师西电Verilog HDL上机大作业硬件描述语言微电子学院.docx

《蔡觉平老师西电Verilog HDL上机大作业硬件描述语言微电子学院.docx》由会员分享,可在线阅读,更多相关《蔡觉平老师西电Verilog HDL上机大作业硬件描述语言微电子学院.docx(20页珍藏版)》请在冰豆网上搜索。

蔡觉平老师西电Verilog HDL上机大作业硬件描述语言微电子学院.docx

蔡觉平老师西电VerilogHDL上机大作业硬件描述语言微电子学院

《VerilogHDL数字集成电路设计原理与应用》上机作业

班级:

*******

学号:

*******

姓名:

*******

 

题目1:

数字集成电路的verilogHDL描述与仿真。

要求:

(1)学习使用Modelsim设计和仿真软件;

(2)练习教材7.2.1中的例子;

(3)掌握设计代码和测试代码的编写;

(4)掌握测试仿真流程;

(5)掌握Modelsim软件的波形验证方式。

解答:

题目2:

简述begin-end语句块和fork-join语句块的区别,并写出下面信号对应的程序代码

解答:

(1)begin-end语句块和fork-join语句块的区别:

1、执行顺序:

begin-end语句块按照语句顺序执行,fork-join语句块所有语句均在同一时刻执行;

2、语句前面延迟时间的意义:

begin-end语句块为相对于前一条语句执行结束的时间,fork-join语句块为相对于并行语句块启动的时间;

3、起始时间:

begin-end语句块为首句开始执行的时间,fork-join语句块为转入并行语句块的时间;

4、结束时间:

begin-end语句块为最后一条语句执行结束的时间,fork-join语句块为执行时间最长的那条语句执行结束的时间;

5、行为描述的意义:

begin-end语句块为电路中的数据在时钟及控制信号的作用下,沿数据通道中各级寄存器之间的传送过程。

fork-join语句块为电路上电后,各电路模块同时开始工作的过程。

(2)程序代码:

Begin-end语句:

moduleinitial_tb1;

regA,B;

initial

begin

A=0;B=1;

#10A=1;B=0;

#10B=1;

#10A=0;

#10B=0;

#10A=1;B=1;

end

endmodule

Frk-join语句:

modulewave_tb2;

regA,B;

parameterT=10;

initial

fork

A=0;B=1;

#TA=1;B=0;

#(2*T)B=1;

#(3*T)A=0;

#(4*T)B=0;

#(5*T)A=1;B=1;

join

endmodule

题目3.分别用阻塞和非阻塞赋值语句描述如下图所示移位寄存器的电路图。

解答:

(1)阻塞赋值语句

moduleblock2(din,clk,out0,out1,out2,out3);

inputdin,clk;

outputout0,out1,out2,out3;

regout0,out1,out2,out3;

always@(posedgeclk)

begin

out0=din;

out1=out0;

out2=out1;

out3=out2;

end

endmodule

(2)非阻塞赋值语句

modulenon_block1(din,clk,out0,out1,out2,out3);

inputdin,clk;

outputout0,out1,out2,out3;

regout0,out1,out2,out3;

always@(posedgeclk)

begin

out0<=din;

out1<=out0;

out2<=out1;

out3<=out2;

end

endmodule

题目4:

设计16位同步计数器

要求:

(1)分析16位同步计数器结构和电路特点;

(2)用硬件描述语言进行设计;

(3)编写测试仿真并进行仿真。

解答:

(1)电路特点:

同步计数器的时间信号是同步的;每当到达最高计数后就会重新计数。

(2)程序代码:

modulecomp_16(count,clk,rst);

output[15:

0]count;

inputclk,rst;

reg[15:

0]count;

always@(posedgeclk)

if(rst)count<=16'b0000000000000000;

else

if(count==16'b1111111111111111)

count<=16'b0000000000000000;

else

count<=count+1;

endmodule

(3)仿真代码:

modulecomp_16_tb;

wire[15:

0]count;

regclk,rst;

comp_16U1(count,clk,rst);

always#1clk=~clk;

initial

begin

clk=0;rst=0;

#1rst=1;

#10rst=0;

#10rst=1;

#10rst=0;

#99999$finish;

end

endmodule

题目5.试用VerilogHDL门级描述方式描述如下图所示的电路。

解答:

modulezy(D0,D1,D2,D3,S1,S2,T0,T1,T2,T3,Z);

outputZ;

inputD0,D1,D2,D3,S1,S2;

wireT0,T1,T2,T3,wire1,wire2;

notU1(wire1,S1),

U2(wire2,S2);

andU3(T0,D0,wire2,wire1),

U4(T1,D1,S1,wire1),

U5(T2,D2,S1,wire2),

U6(T3,D3,S1,S2);

orU7(Z,T0,T1,T2,T3,);

endmodule

题目6.试用查找真值表的方式实现真值表中的加法器,写出VerilogHDL代码:

Cin

ain

bin

sum

Cout

0

0

0

0

0

0

0

1

1

0

0

1

0

1

0

0

1

1

0

1

1

0

0

1

0

1

0

1

0

1

1

1

0

0

1

1

1

1

1

1

解答:

modulehomework6(SUM,COUT,A,B,CIN);

outputSUM,COUT;

inputA,B,CIN;

regSUM,COUT;

always@(AorBorCIN)

case({A,B,CIN})

3'b000:

SUM<=0;

3'b000:

COUT<=0;

3'b001:

SUM<=1;

3'b001:

COUT<=0;

3'b010:

SUM<=1;

3'b010:

COUT<=0;

3'b011:

SUM<=0;

3'b011:

COUT<=1;

3'b100:

SUM<=1;

3'b100:

COUT<=0;

3'b101:

SUM<=0;

3'b101:

COUT<=1;

3'b110:

SUM<=0;

3'b110:

COUT<=1;

3'b111:

SUM<=1;

3'b111:

COUT<=1;

endcase

endmodule

题目7:

设计16位同步加法器和乘法器

要求:

(1)分析16位同步加法器和乘法器结构和电路特点;

(2)用硬件描述语言进行设计;

(3)编写测试仿真并进行仿真。

解答:

(1)16位同步加法器和乘法器结构和电路特点:

加法器的进位只用考虑一位,但是乘法器的进位要考虑到32位才行。

(2)程序代码:

16位同步加法器:

moduleadder(a,b,c,sum,cout);

output[15:

0]sum;

outputcout;

input[15:

0]a,b;

inputc;

assign{cout,sum}=a+b+c;

endmodule

16位同步乘法器:

modulemultiplier(a,b,mul);

input[15:

0]a,b;

output[31:

0]mul;

assignmul=a*b;

endmodule

(3)仿真代码:

16位同步加法器:

moduleadder_tb;

reg[15:

0]a,b;

regc;

wire[15:

0]sum;

wirecout;

initial

begin

a=8;b=8;c=1;

end

initial

begin

#10a=16'b1111111111111111;#10b=1;

end

adderU2(.a(a),.b(b),.c(c),.cout(cout),.sum(sum));

endmodule

16位同步乘法器:

modulemultiplier_tb;

reg[15:

0]a,b;

wire[31:

0]mul;

initial

begin

a=3;b=8;

end

initial

begin

#10a=100;

#15b=100;

end

multiplierU1(.a(a),.b(b),.mul(mul));

endmodule

仿真截图:

加法器:

乘法器:

题目8.将下面的状态转移图用VerilogHDL描述。

在图中,状态机的输入只与状态的跳转有关,与状态机的输出无关,因此该状态机为摩尔型状态机。

下面为三段式描述方式。

解答:

程序代码:

modulehomework8(clk,out,step,clr);

output[2:

0]out;

inputstep,clk,clr;

reg[2:

0]out;

reg[1:

0]state,next_state;

always@(posedgeclk)

state<=next_state;

always@(stateorclr)

if(clr)

next_state<=0;

else

case(state)

2'b00:

case(step)

1'b0:

beginnext_state<=2'b00;out<=3'b001;end

1'b1:

beginnext_state<=2'b01;out<=3'b001;end

endcase

2'b01:

begin

out<=3'b010;

next_state<=2'b10;

end

2'b10:

case(step)

1'b0:

beginnext_state<=2'b00;out<=3'b100;end

1'b1:

beginnext_state<=2'b11;out<=3'b100;end

endcase

2'b11:

case(step)

1'b0:

beginnext_state<=2'b11;out<=3'b111;end

1'b1:

beginnext_state<=2'b00;out<=3'b111;end

endcase

endcase

endmodule

仿真代码:

modulehomework8_tb;

regclk,step,clr;

wire[3:

0]out;

always

#5clk=~clk;

initial

beginclk=0;

clr=1;

step=1;

end

initial

begin

#5clr=0;

#10step=0;

#10step=1;

end

homework8U1(clk,out,step,clr);

endmodule

仿真截图:

题目9.如下图所示电路,若其延迟时间设定如表所示,试写VerilogHDL程序设计该电路。

路径

最小值(min)

典型值(type)

最大值(max)

a_sa_y

10

12

14

s_s0_sa_y

15

17

19

s_sb_y

11

13

15

b_sb_y

10

12

14

解答:

程序代码:

modulea(a,s,b,y,s0);

inputa,b,s,s0;

outputy;

assigny=(s&&b)||(s0&&a);

specify

(a=>y)=(10,12,14);

(b=>y)=(10,12,14);

(s=>y)=(11,13,15);

(s0=>y)=(11,13,15);

endspecify

endmodule

moduleb(a,s,b,y);

inputs,a,s,b;

outputy;

wires0;

not#(4)U1(s0,s);

delay_doorU2(a,s,b,y,s0);

endmodule

题目10.设计一个8位数字显示的简易频率计。

要求:

①能够测试10Hz~10MHz方波信号;

②电路输入的基准时钟为1Hz,要求测量值以8421BCD码形式输出;

③系统有复位键;

④采用分层次分模块的方法,用VerilogHDL进行设计。

解答:

程序代码:

modulex;

regstandard_clk;

regtest_clk;

wire[7:

0]out;

regreset;

initialbeginreset=0;test_clk=0;standard_clk=0;end

initial#15reset=1;

always#1test_clk=~test_clk;

always#10standard_clk=~standard_clk;

aU1(.reset(reset),.test_clk(test_clk),.standard_clk(standard_clk),.ratio_final(out));

endmodule

modulea(reset,test_clk,standard_clk,ratio_final);

inputreset,test_clk,standard_clk;

output[7:

0]ratio_final;

wiremul_clk;

wirereset_comp;

wire[7:

0]ratio_start;

andU0(reset_comp,reset,standard_clk);

tU1(.ain(test_clk),.din(standard_clk),.mul(mul_clk));

wU2(.clk(mul_clk),.count(ratio_start),.reset(reset_comp));

cU3(.ratio_start(ratio_start),.ratio_final(ratio_final));

endmodule

modulew(clk,count,reset);

inputclk,reset;

outputcount;

parameterbit=8;

reg[bit-1:

0]count;

always@(posedgeclkornegedgereset)

if(!

reset)

count<=8'b00000000;

else

count<=count+1;

endmodule

modulet(ain,din,mul);

parameterwidth=1;

input[width-1:

0]ain,din;

output[width*2-1:

0]mul;

assignmul=ain*din;

endmodule

modulec(ratio_start,ratio_final);

input[7:

0]ratio_start;

output[7:

0]ratio_final;

assignratio_final=2*ratio_start;

endmodule

题目11.用VerilogHDL设计一个4位LED显示器的动态扫描译码电路。

要求:

①4个七段显示器共用一个译码驱动电路;

②显示的数码管清晰明亮,无闪烁现象发生。

解答:

modulea(out,in);

outputout;

inputin;

reg[6:

0]out;

wire[3:

0]in;

always@(in)

begin

case(in)

4'd0:

out=7'b1111110;

4'd1:

out=7'b0110000;

4'd2:

out=7'b1101101;

4'd3:

out=7'b1111001;

4'd4:

out=7'b0110011;

4'd5:

out=7'b1011011;

4'd6:

out=7'b1011111;

4'd7:

out=7'b1110000;

4'd8:

out=7'b1111111;

4'd9:

out=7'b1111011;

endcase

end

endmodule

modulew(in1,in2,in3,in4,out1,out2,out3,out4);

outputout1,out2,out3,out4;

inputin1,in2,in3,in4;

wire[3:

0]in1,in2,in3,in4;

wire[6:

0]out1,out2,out3,out4;

aU1(.in(in1),.out(out1));

aU2(.in(in2),.out(out2));

aU3(.in(in3),.out(out3));

aU4(.in(in4),.out(out4));

endmodule

modulec;

reg[3:

0]in1,in2,in3,in4;

wire[6:

0]out1,out2,out3,out4;

initial

begin

in1=4'b0010;

in2=4'b0100;

in3=4'b1000;

in4=4'b0000;

end

initial

begin

#5in4=4'b0111;

in3=4'b0110;

in2=4'b0100;

in1=4'b0000;

end

wU1(in1,in2,in3,in4,out1,out2,out3,out4);

endmodule

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 其它考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1