北航电子电路设计verilog实验报告.docx

上传人:b****2 文档编号:1054881 上传时间:2022-10-16 格式:DOCX 页数:19 大小:206.10KB
下载 相关 举报
北航电子电路设计verilog实验报告.docx_第1页
第1页 / 共19页
北航电子电路设计verilog实验报告.docx_第2页
第2页 / 共19页
北航电子电路设计verilog实验报告.docx_第3页
第3页 / 共19页
北航电子电路设计verilog实验报告.docx_第4页
第4页 / 共19页
北航电子电路设计verilog实验报告.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

北航电子电路设计verilog实验报告.docx

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

北航电子电路设计verilog实验报告.docx

北航电子电路设计verilog实验报告

 

北京航空航天大学

Verilog实验报告

 

学院:

班级:

姓名:

 

2017年5月

练习一:

简单组合逻辑设计

一、实验目的

1、掌握基本组合逻辑电路的实现方法。

2、初步了解两种基本组合逻辑电路的生成方法。

3、学习测试模块的编写。

4、通过综合和布局布线了解不同层次仿真的物理意义。

二、实验设备

安装Modelsim-6.5c的PC机。

三、实验内容

描述一个可综合的数据比较器,比较数据a、b的大小,若相同,则给出结果1,否则给出结果0。

四、实验代码

①模块源代码

modulecompare(equal,a,b);

inputa,b;

outputequal;

assignequal=(a==b)?

1:

0;

endmodule

②测试程序

`timescale1ns/1ns;

`include"compare.v"

modulecompare_tb;

rega,b;

wireequal;

initial

begin

a=0;

b=0;

#100a=0;b=1;

#100a=1;b=1;

#100a=1;b=0;

#100a=0;b=0;

#100$stop;

#100a=0;b=1;

end

comparem(.equal(equal),.a(a),.b(b));

endmodule

五、仿真结果

六、实验总结

verilog组合逻辑设计一般常用的语句有两种:

持续赋值语句(assign语句)和过程赋值语句(always@(*)语句)。

两者之间的差别有:

持续赋值语句(assign语句)主要用于对wire型变量的赋值,因为wire(线型)的值不能存住,需要一直给值,所以需要用持续赋值。

例如:

assignc=a+b;  只要a和b有任意变化,都可以立即反映到c上,也就是说c的值是根据a,b的值随时变化的。

过程赋值语句(always语句)主要用于reg型变量的赋值 ,因为always语句被执行是需要满足触发条件的,所以always过程块里面的内容不是每时每刻都被执行,因此需要将被赋值的对象定义成寄存器类型,以便这个值能被保持住。

本实验测试模块中,为了生成变化的数据信号a和b,采用了#100a=0;b=1;赋值语句。

若需要比较的数据较多,所需赋值语句会增加,采用always#100clock=~clock产生周期时钟信号然后随机生成数据更简便。

选作一:

设计一个字节的比较器

一、实验目的

比较两个字节的大小,如a[7:

0]大于b[7:

0],则输出高电平,否则输出低电平;并改写测试模型,使其能进行比较全面的测试。

二、实验设备

安装Modelsim-6.5c的PC机。

三、实验代码

①模块源代码:

modulecompare_8bit(result,a,b);

input[7:

0]a,b;

outputresult;

assignresult=(a>b)?

1:

0;

endmodule

②测试程序

`timescale1ns/1ns

`include"compare_8bit.v"

moduletest;

reg[7:

0]a,b;

wireresult;

initial

begin

a=8'd0;

b=8'd0;

#100a=8'd6;b=8'd5;

#100a=8'd9;b=8'd9;

#100a=8'd12;b=8'd15;

#100$stop;

end

compare_8bitm(.result(result),.a(a),.b(b));

endmodule

经过改写:

`timescale1ns/1ns

`include"./eight.v"

moduletest;

reg[7:

0]a,b;

regclock;

wireresult;

initial

begin

a=8'd0;

b=8'd0;

clock=0;

end

always#50clock=~clock;

always@(posedgeclock)

begin

a={$random}%256;

b={$random}%256;

end

initial

begin#100000$stop;

end

eightm(.result(result),.a(a),.b(b));

endmodule

四、仿真结果

经过改写:

五、实验总结

最初测试模块使用了#100a=8'd6;b=8'd5;的赋值语句,a,b的每个值都要手动赋予。

由于一个字节(8位)有256个可能值,为了进行比较全面的测试,改写为

always#50clock=~clock;

always@(posedgeclock)

begin

a={$random}%256;

b={$random}%256;

让a,b随机生成数据,可通过设置运行时间进行任意次比较。

练习二简单分频时序逻辑电路的设计

一、实验目的

1、掌握最基本组合逻辑电路的实现方法。

2、学习时序电路测试模块的编写。

3、学习综合和不同层次的仿真。

二、实验设备

安装Modelsim-6.5c的PC机。

三、实验内容

用always块和@(posedgeclk)或@(negedgeclk)的结构表述一个1/2分频器的可综合模型,观察时序仿真结果。

四、实验代码

①模块源代码

modulehalf_clk(reset,clk_in,clk_out);

inputclk_in,reset;

outputclk_out;

regclk_out;

always@(posedgeclk_in)

begin

if(!

reset)clk_out=0;

elseclk_out=~clk_out;

end

endmodule

②测试程序

`timescale1ns/100ps

`defineclk_cycle50

moduletop;

regclk,reset;

wireclk_out;

always#`clk_cycleclk=~clk;

initial

begin

clk=0;

reset=1;

#10reset=0;

#110reset=1;

#100000$stop;

end

half_clkm0(.reset(reset),.clk_in(clk),.clk_out(clk_out));

endmodule

五、仿真结果

六、实验总结

在可综合的VerilogHDL模型,通常使用always块和@(posedgeclk)或@(negedgeclk)的结构来表述时序逻辑。

为了能正确地观察到仿真结果,并确定时序电路的起始相位,在可综合风格的模块中,通常定义一个复位信号reset,当reset为低电平时,对电路中的寄存器进行复位。

clk_out起始段为红色,是因为它是reg型,且尚未被赋值,仿真工具认为其为不定态。

选作二七段数码管译码电路

一、实验目的

设计一个七段数码管译码电路。

二、实验设备

安装Modelsim-6.5c的PC机。

三、实验代码

①模块源代码

modulesegdisplay(data,seg);

input[3:

0]data;

output[6:

0]seg;

reg[6:

0]paraseg;

always@(data)

begin

case(data)

4'b0000:

paraseg=7'b1111110;

4'b0001:

paraseg=7'b0110000;

4'b0010:

paraseg=7'b1101101;

4'b0011:

paraseg=7'b1111001;

4'b0100:

paraseg=7'b0110011;

4'b0101:

paraseg=7'b1011011;

4'b0110:

paraseg=7'b0011111;

4'b0111:

paraseg=7'b1110000;

4'b1000:

paraseg=7'b1111111;

4'b1001:

paraseg=7'b1110011;

4'b1010:

paraseg=7'b0001101;

4'b1011:

paraseg=7'b0011001;

4'b1100:

paraseg=7'b0100011;

4'b1101:

paraseg=7'b1001011;

4'b1110:

paraseg=7'b0001111;

4'b1111:

paraseg=7'b0000000;

endcase

end

assignseg=paraseg;

endmodule

②测试程序

`timescale1ns/1ns

moduleexperiment4;

wire[6:

0]out;

reg[3:

0]data;

regclock;

initial

begin

data=0;

clock=0;

end

always#50clock=~clock;

always@(posedgeclock)

begin

data<=data+1;

end

initial

begin

#10000$stop;

end

segdisplaysegdisplay11(.data(data),.seg(out));

endmodule

四、仿真结果

五、实验总结

在每个上升沿data自加,依次从0000加到1111,在把其对应代表七段数码管abcdefg亮暗的7位二进制数赋值给paraseg,即输出out。

练习三:

利用条件语句实现计数分频时序电路

一、实验目的

1、掌握条件语句在简单时序模块设计中的使用。

2、学习在Verilog模块中应用计数器。

3、学习测试模块的编写、综合和不同层次的仿真。

二、实验设备

安装Modelsim-6.5c的PC机。

三、实验内容

仿真一个可综合风格的分频器,将10MB的时钟分频为500KB的时钟,定义一个计数器,原理同1/2分频器一样,只不过分频变为1/20。

四、实验代码

①模块源代码

modulefdivision(RESET,F10M,F500K);

inputF10M,RESET;

outputF500K;

regF500K;

reg[7:

0]j;

always@(posedgeF10M)

if(!

RESET)

begin

F500K<=0;

j<=0;

end

else

begin

if(j==9)

begin

j<=0;

F500K<=~F500K;

end

else

j<=j+1;

end

endmodule

②测试程序

`timescale1ns/100ps

`defineclk_cycle50

moduletest_fdivision;

regF10M,RESET;

wireF500K_clk;

always#`clk_cycl

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

当前位置:首页 > 总结汇报 > 学习总结

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

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