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