Verilog实验报告电子.docx

上传人:b****7 文档编号:9133300 上传时间:2023-02-03 格式:DOCX 页数:24 大小:165.44KB
下载 相关 举报
Verilog实验报告电子.docx_第1页
第1页 / 共24页
Verilog实验报告电子.docx_第2页
第2页 / 共24页
Verilog实验报告电子.docx_第3页
第3页 / 共24页
Verilog实验报告电子.docx_第4页
第4页 / 共24页
Verilog实验报告电子.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

Verilog实验报告电子.docx

《Verilog实验报告电子.docx》由会员分享,可在线阅读,更多相关《Verilog实验报告电子.docx(24页珍藏版)》请在冰豆网上搜索。

Verilog实验报告电子.docx

Verilog实验报告电子

西安邮电大学

VerilogHDL大作业报告书

 

学院名称

电子工程学院

学生姓名

专业名称

电子信息工程

班级

 

实验一异或门设计

一、实验目的

(1)熟悉Modelsim软件

(2)掌握Modelsim软件的编译、仿真方法

(3)熟练运用Modelsim软件进行HDL程序设计开发

二、实验内容

my_or,my_and和my_not门构造一个双输入端的xor门,其功能是计算z=x’y+xy’,其中x和y为输入,z为输出;编写激励模块对x和y的四种输入组合进行测试仿真

1、实验要求

用VerilogHDL程序实现一个异或门,Modelism仿真,观察效果。

2、步骤

1、建立工程

2、添加文件到工程

3、编译文件

4、查看编译后的设计单元

5、将信号加入波形窗口

6、运行仿真

实验描述如下:

modulemy_and(a_out,a1,a2);

outputa_out;

inputa1,a2;

wires1;

nand(s1,a1,a2);

nand(a_out,s1,1'b1);

endmodule

modulemy_not(n_out,b);

outputn_out;

inputb;

nand(n_out,b,1'b1);

endmodule

modulemy_or(o_out,c1,c2);

outputo_out;

inputc1,c2;

wires1,s2;

nand(s1,c1,1'b1);

nand(s2,c2,1'b1);

nand(o_out,s1,s2);

endmodule

moduleMY_XOR(z,x,y);

outputz;

inputx,y;

wirea1,a2,n1,n2;

my_notSTEP01(n1,x);

my_notSTEP02(n2,y);

my_andSTEP03(a1,n1,y);

my_andSTEP04(a2,n2,x);

my_orSTEP05(z,a1,a2);

Endmodule

modulestimulus;

regX,Y;

wireOUTPUT;

MY_XORxor01(OUTPUT,X,Y);

initial

begin

$monitor($time,"X=%b,Y=%b---OUTPUT=%b\n",X,Y,OUTPUT);

end

initial

begin

X=1'b0;Y=1'b0;

#5X=1'b1;Y=1'b0;

#5X=1'b1;Y=1'b1;

#5X=1'b0;Y=1'b1;

end

endmodule

2、实验结果

波形图:

3、分析和心得

通过这次的实验,我基本熟悉Modelsim软件,掌握了Modelsim软件的编译、仿真方法。

同时在编写程序的过程中,加深了我对课上所讲的HDL的语法的认识。

实验二二进制全加器设计

一、实验目的

(1)熟悉VerilogHDL元件实例化语句的作用

(2)熟悉全加器的工作原理

(3)用VerilogHDL语言设计一位二进制全加器,并仿真,验证其功能

二、实验内容

一位全加器使用乘积项之和的形式可以表示为:

sum=a·b·c_in+a’·b·c_in’+a’·b’·c_in+a·b’·c_in’

c_out=a·b+b·c_in+a·c_in

其中a,b和c_in为输入,sum和c_out为输出,只使用与门,或门,非门实现一个一位全加器,写出Verilog描述,限制是每个门最多只能有四个输入端。

编写激励模块对其功能进行检查,并对全部的输入组合输入组合进行测试。

实验要求

用VerilogHDL语言描述一位全加器,并使用modelsim仿真验证结果。

modulefulladd(sum,c_out,a,b,c_in);

outputsum,c_out;

inputa,b,c_in;

wires1,s2,s3,s4,a1,b1,c_in1,c1,c2,c3;

and(s1,a,b,c_in);

not(a1,a);

not(b1,b);

not(c_in1,c_in);

and(s2,a1,b,c_in1);

and(s3,a1,b1,c_in);

and(s4,a,b1,c_in1);

and(c1,a,b);

and(c2,b,c_in);

and(c3,a,c_in);

or(sum,s1,s2,s3,s4);

or(c_out,c1,c2,c3);

endmodule

modulestimulus;

regA,B,C_IN;

wireSUM,C_OUT;

fulladdFA1(SUM,C_OUT,A,B,C_IN);

initial

begin

$monitor($time,"A=%b,B=%b,C_IN=%b,---C_OUT=%b,SUM=%b\n",A,B,C_IN,C_OUT,SUM);

end

//?

?

?

?

?

?

?

initial

begin

A=1'd0;B=1'd0;C_IN=1'b0;

#5A=1'd0;B=1'd0;C_IN=1'b1;

#5A=1'd0;B=1'd1;C_IN=1'b0;

#5A=1'd0;B=1'd1;C_IN=1'b1;

#5A=1'd1;B=1'd0;C_IN=1'b0;

#5A=1'd1;B=1'd0;C_IN=1'b1;

#5A=1'd1;B=1'd1;C_IN=1'b0;

#5A=1'd1;B=1'd1;C_IN=1'b1;

End

实验结果波形:

三.分析和心得

通过这次试验我熟悉了VerilogHDL元件例化语句的作用,并且熟悉全加器的工作原理。

在一位全加器的过程中,也了解了如何调用模块。

 

实验三使用JK触发器设计一个计数器

一、实验目的

(1)熟悉Modelsim软件

(2)掌握Modelsim软件的编译、仿真方法

(3)熟练运用Modelsim软件进行HDL程序设计开发

二、实验内容

一个同步计数器可以使用主从JK触发器来设计。

设计一个同步计数器,其逻辑图和JK触发器的逻辑图如书中图所示。

清零信号clear低电平有效,输入数据在时钟信号clock的上升沿被锁存,触发器在clock的下降沿输出;当count_enable信号为低电平时停止计数。

写出同步计数器的Verilog描述和激励模块,在激励模块中使用clear和count_enable对计数器进行测试,并显示输出计数Q[3:

0]。

技术规范:

本次试验中共有三个模块,分别是JK主从触发器设计模块,计数器设计模块及激励模块。

对于JK触发器,共有四个输入端(j,k,clear,clock),两个输出端(q,qbar),根据其实际电路结构做出相应的设计;对于计数器模块,有三个输入端(clear,clock,counter_clock),四个输出(Q[3:

0]),使用的是四个JK触发器和门电路组合,采用同步清零和同步脉冲构成四位同步计数器;激励模块中根据技术模块输入端口进行相关赋值以便进行仿真观察;

三.实验步骤:

1.在modulesim软件中使用数据流建模进行四位计数器设计及输入;

2.进行编译及仿真。

四.源代码:

JK触发器模块:

modulem_c_jkff(q,qbar,J,K,clear,clock);

outputq,qbar;

inputJ,K,clear,clock;

wirea,b,c,d,y,ybar,cbar;

assigncbar=~clock;

assign#1a=~(J&qbar&clock&clear),

b=~(K&q&clock),

y=~(a&ybar),

ybar=~(y&b&clear),

c=~(y&cbar),

d=~(ybar&cbar);

assign#1q=~(c&qbar);

assign#1qbar=~(d&clear&q);

endmodule

计数器模块:

modulefour_count_ff(Q,clear,clock,count_enable);

output[3:

0]Q;

inputclear,clock,count_enable;

wirea1,a2,a3;

assigna1=count_enable&Q[0],

a2=a1&Q[1],a3=a2&Q[2];

m_c_jkffm1(Q[0],,count_enable,count_enable,clear,clock);

m_c_jkffm2(Q[1],,a1,a1,clear,clock);

m_c_jkffm3(Q[2],,a2,a2,clear,clock);

m_c_jkffm4(Q[3],,a3,a3,clear,clock);

endmodule

激励模块:

modulestimulus;

regclock,clear,count_enable;

wire[3:

0]Q;

initial

$monitor($time,"CountQ=%bClear=%b",Q[3:

0],clear);

four_count_fff1(Q,clear,clock,count_enable);

initial

begin

clear=1'b0;

count_enable=1'b1;

#10clear=1'b1;

//#1count_enable=1'b1;

//#50clear=1'b0;

//#100count_enable=1'b0;

//#100clear=1'b0;

//#50clear=1'b1;

//#50count_enable=1'b1;

end

initial

begin

clock=1'b0;

forever#20clock=~clock;

end

initial

#1000$finish;

Endmodule

波形图:

 

实验四八功能算术运算单元

一、实验目的

(1)熟悉Modelsim软件

(2)掌握Modelsim软件的编译、仿真方法

(3)熟练运用Modelsim软件进行HDL程序设计开发

二、实验内容

使用case语句设计八门功能的算术运算单元(ALU),输入信号a,b为4位,功能选择信号select为3位,输出信号out为5位。

忽略输出结果中的上溢和下溢。

3.实验步骤:

1.在modulesim软件中使用case语句设计八门功能的算术运算单元(ALU)

2.进行编译及仿真。

modulealu(out,a,b,select);

output[4:

0]out;

input[3:

0]a,b;

input[2:

0]select;

reg[4:

0]out;

always@(aorborselect)

begin

case(select)

3'b000:

out=a;

3'b001:

out=a+b;

3'b010:

out=a-b;

3'b011:

out=a/b;

3'b100:

out=a%b;

3'b101:

out=a<<1;

3'b110:

out=a>>1;

3'b111:

out=a>b;

default:

$display("InvalidALUcontrolsignal");

endcase

end

endmodule

modulestimulus;

reg[3:

0]A,B;

reg[2:

0]SELECT;

wire[4:

0]OUT;

initial

$monitor($time,"A=%bB=%bSELECT=%bOUT=%b",A[3:

0],B[3:

0],SELECT[2:

0],OUT[4:

0]);

alualu1(OUT,A,B,SELECT);

initial

begin

A=4'b0011;B=4'b1011;SELECT=3'b000;

repeat(7)

begin

SELECT=#103'b001+SELECT;

end

#10A=4'b1111;B=4'b1001;SELECT=3'b000;

repeat(7)

begin

SELECT=#103'b001+SELECT;

end

#10A=4'b0000;B=4'b0000;SELECT=3'b000;

repeat(7)

begin

SELECT=#103'b001+SELECT;

end

#10A=4'b1111;B=4'b1111;SELECT=3'b000;

repeat(7)

begin

SELECT=#103'b001+SELECT;

end

end

endmodule

波形图:

四.实验中遇到的问题及解决方法:

“清零信号clear低电平有效,输入数据在时钟信号clock上升沿被锁存,触发器在clock下降沿输出;当count-enable为低电平时停止计数。

”一开始不能理解,后来经过同学的指导明白了过程。

总之,至此实验特别有意义。

 

实验五八位ALU功能的函数

一、实验目的

(1)熟悉Modelsim软件

(2)掌握Modelsim软件的编译、仿真方法

(3)熟练运用Modelsim软件进行HDL程序设计开发

二、实验内容

设计一个实现八位ALU功能的函数,输入信号a,b为4位,功能选择信号select为3位,输出信号out为5位。

忽略输出结果中的上溢和下溢。

3.实验步骤:

1.在modulesim软件中设计一个实现八位ALU功能的函数。

2.进行编译及仿真。

modulebit8_ALU(out,a,b,select);

output[4:

0]out;

input[3:

0]a,b;

input[2:

0]select;

reg[4:

0]out;

//reg[3:

0]a,b;

//reg[2:

0]select;

always@(aorborselect)

begin

out=bit8_function(a,b,select);

end

//?

?

8?

ALU?

?

?

?

function[4:

0]bit8_function;

input[3:

0]a,b;

input[2:

0]sel;

parameterS0=3'b000,

S1=3'b001,

S2=3'b010,

S3=3'b011,

S4=3'b100,

S5=3'b101,

S6=3'b110,

S7=3'b111;

begin

case(sel)

S0:

bit8_function=a;

S1:

bit8_function=a+b;

S2:

bit8_function=a-b;

S3:

bit8_function=a/b;

S4:

bit8_function=a%b;

S5:

bit8_function=a<<1;

S6:

bit8_function=a>>1;

S7:

bit8_function=(a>b);

default:

$display("InvalidALUcontrolsignal");

endcase

end

endfunction

endmodule

 

modulestimulus;

reg[3:

0]A,B;

reg[2:

0]SELECT;

wire[4:

0]OUT;

bit8_ALUalu(OUT,A,B,SELECT);

initial

begin

$monitor($time,"A=%b,B=%b,SELECT=%b,---OUT=%b\n",A,B,SELECT,OUT);

end

initial

begin

A=4'b0000;B=4'b0000;SELECT=3'b000;

repeat(7)

begin

SELECT=#10SELECT+3'b001;

end

#100A=4'b1111;B=4'b0000;SELECT=3'b000;

repeat(7)

begin

SELECT=#10SELECT+3'b001;

end

#100A=4'b0000;B=4'b1111;SELECT=3'b000;

repeat(7)

begin

SELECT=#10SELECT+3'b001;

end

#100A=4'b0011;B=4'b0011;SELECT=3'b000;

repeat(7)

begin

SELECT=#10SELECT+3'b001;

end

#100A=4'b1111;B=4'b1111;SELECT=3'b000;

repeat(7)

begin

SELECT=#10SELECT+3'b001;

end

end

Endmodule

波形图:

四.实验中遇到的问题及解决方法:

这个题目比较简单,因为与之前的实验内容基本相同,只是变化成为函数的形式而已,因此做实验时没有遇到什么大问题。

 

实验六状态自动机

一、实验目的

(1)熟悉Modelsim软件

(2)掌握Modelsim软件的编译、仿真方法

(3)熟练运用Modelsim软件进行HDL程序设计开发

二、实验内容

使用同步有限状态自动机方法设计一个电路,它的引脚in接受一位的输入流。

每当检测到模式10101时,输出引脚reset被赋值为高电平引脚。

reset引脚以同步方式初始化电路。

输入引脚clk用于给电路提供时针信号。

使用身边现有的任何工艺库综合该电路,优化电路,使其达到最快速度。

把同样的激励应用到RTL和们级网表上,比较它们的输出

三.实验步骤:

1.在modulesim软件中使用同步有限状态自动机方法设计一个电路。

2.进行编译及仿真。

moduleselect(in,clk,reset,match);

inputin;

inputclk;

inputreset;

outputmatch;

wirematch;

wire[4:

0]NEXT_STATE;

reg[4:

0]PRES_STATE;

parameters1=5'b00000;

parameters2=5'b00001;

parameters3=5'b00010;

parameters4=5'b00101;

parameters5=5'b01010;

parameters6=5'b10101;

 

function[5:

0]fsm;

inputfsm_in;

input[4:

0]fsm_PRES_STATE;

regfsm_match;

reg[4:

0]fsm_NEXT_STATE;

begin

case(fsm_PRES_STATE)

s1:

begin

if(fsm_in==1'b1)

begin

fsm_match=1'b0;

fsm_NEXT_STATE=s2;

end

elseif(fsm_in==1'b0)

begin

fsm_match=1'b0;

fsm_NEXT_STATE=s1;

end

end

s2:

begin

if(fsm_in==1'b1)

begin

fsm_match=1'b0;

fsm_NEXT_STATE=s2;

end

elseif(fsm_in==1'b0)

begin

fsm_match=1'b0;

fsm_NEXT_STATE=s3;

end

end

s3:

begin

if(fsm_in==1'b1)

begin

fsm_match=1'b0;

fsm_NEXT_STATE=s4;

end

elseif(fsm_in==1'b0)

begin

fsm_match=1'b0;

fsm_NEXT_STATE=s1;

end

end

s4:

begin

if(fsm_in==1'b1)

begin

fsm_match=1'b0;

fsm_NEXT_STATE=s2;

end

elseif(fsm_in==1'b0)

begin

fsm_match=1'b0;

fsm_NEXT_STATE=s5;

end

end

s5:

begin

if(fsm_in==1'b1)

begin

fsm_match=1'b0;

fsm_NEXT_STATE=s6;

end

elseif(fsm_in==1'b0)

begin

fsm_match=1'b0;

fsm_NEXT_STATE=s1;

end

end

s6:

begin

if(fsm_in==1'b1)

begin

fsm_match=1'b0;

fsm_NEXT_STATE=s2;

end

elseif(fsm_in==1'b0)

begin

fsm_match=1'b0;

fsm_NEXT_STATE=s5;

end

end

endcase

fsm={fsm_match,fsm_NEXT_STATE};

end

endfunction

 

assign{match,NEXT_STATE}=fsm(in,PRES_STATE);

 

always@(posedgeclk)

begin

if(reset==1'b1)

PRES_STATE<=s1;

else

PRES_STATE<=NEXT_STATE;

end

 

endmodule

modulestimulus;

regclk;

regin;

regreset;

wirematch;

select

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

当前位置:首页 > 高等教育 > 文学

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

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