北航verilog实验报告Word格式.docx
- 文档编号:17260405
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:31
- 大小:1.03MB
北航verilog实验报告Word格式.docx
《北航verilog实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《北航verilog实验报告Word格式.docx(31页珍藏版)》请在冰豆网上搜索。
always#`clk_cycleclk=~clk;
initial
clk=0;
reset=-1;
#10reset=0;
#110reset=1;
#100000$stop;
half_clkm0(.reset(reset),.clk_in(clk),.clk_out(clk_out));
endmodule
五.综合仿真结果
实验三利用条件语句实现计数分频时序电路
1.掌握条件语句在简单时序模块设计中的使用。
2.学习在Verilog模块中应用计数器。
3.学习测试模块的编写、综合和不同层次的仿真。
仿真一个可综合风格的分频器,将10MB的时钟分频为500KB的时钟,定义一个计数器,原理同1/2分频器一样,只不过分频变为1/20。
modulefdivision(RESET,F10M,F500K);
inputRESET,F10M;
outputF500K;
regF500K;
reg[7:
0]j;
always@(posedgeF10M)
RESET)
F500K<
=0;
j<
=0;
if(j==9)
F500K=~F500K;
=j+1;
`timescale1ns/1ps
moduledivision_Top;
regF10M,RESET;
wireF500K_clk;
always#`clk_cycleF10M=~F10M;
initial
RESET=1;
F10M=0;
#100RESET=0;
#100RESET=1;
#10000$stop;
fdivisionfdivision(.RESET(RESET),.F10M(F10M),.F500K(F500K_clk));
实验四阻塞赋值与非阻塞赋值的区别
1.通过实验,掌握阻塞赋值与非阻塞赋值的概念和区别。
2.了解非阻塞和阻塞赋值的不同使用场合。
两个模块,一个阻塞赋值,一个非阻塞赋值,观察两者之间的区别
moduleblocking(clk,a,b,c);
output[3:
0]b,c;
input[3:
0]a;
inputclk;
reg[3:
always@(posedgeclk)
b=a;
c=b;
$display("
Blocking:
a=%d,b=%d,c=%d"
a,b,c);
//non_blocking.v
modulenon_blocking(clk,a,b,c);
b<
=a;
c<
=b;
Non_Blocking:
//comepareTop.v
moduleconpareTop;
wire[3:
0]b1,c1,b2,c2;
reg[3:
regclk;
forever#50clk=~clk;
a=4'
h3;
___________"
);
#100a=4'
h7;
hf;
ha;
h2;
#100$display("
$stop;
non_blockingnon_blocking(clk,a,b2,c2);
blockingblocking(clk,a,b1,c1);
实验五用always块实现较复杂的组合逻辑:
1.掌握用always实现较大组合逻辑电路的方法。
2.进一步了解assign与always两种组合电路实现方法的区别和注意点。
3.学习测试模块中随机数的产生和应用。
4.学习综合不同层次的仿真,并比较结果
设计一个简单的指令译码电路,该电路通过对指令的判断,对输入数据执行相应的操作,包括加、减、与、或和求反,并且无论是指令作用的数据还是指令本身发生变化,都有要作出及时的反应。
`defineplus3'
d0
`defineminus3'
d1
`defineband3'
d2
`definebor3'
d3
`defineunegate3'
d4
modulealu(out,opcode,a,b);
output[7:
0]out;
reg[7:
input[2:
0]opcode;
input[7:
0]a,b;
always@(opcodeoraorb)
case(opcode)
`plus:
out=a+b;
`minus:
out=a-b;
`band:
out=a&
b;
`bor:
out=a|b;
`unegate:
out=~a;
default:
out=8'
hx;
endcase
`timescale1ns/1ns
modulealutest;
wire[7:
reg[2:
parametertimes=5;
a={$random}%256;
b={$random}%256;
opcode=3'
h0;
repeat(times)
#100a={$random}%256;
opcode=opcode+1;
#100$stop;
alualu1(out,opcode,a,b);
实验六在VerilogHDL中使用函数
1.了解函数的定义和在模块设计中的使用。
2.了解函数的可综合性问题。
3.了解许多综合器不能综合复杂的算术运算。
做一个函数调用的示例,采用同步时钟触发运算的执行,每个clk时钟周期执行一次运算,在测试模块中,调用系统任务$display及在时钟的下降沿显示每次运算的结果。
moduletryfunct(clk,n,result,reset);
output[31:
0]result;
0]n;
inputreset,clk;
reg[31:
reset)
result<
=n*factorial(n)/((n*2)+1);
function[31:
0]factorial;
0]operand;
0]index;
factorial=operand?
1:
0;
for(index=2;
index<
=operand;
index=index+1)
factorial=index*factorial;
endfunction
endmodule
//测试模块代码
moduletryfunctTop;
0]n,i;
regreset,clk;
wire[31:
n=0;
reset=1;
#100reset=0;
#100reset=1;
for(i=0;
i<
=15;
i=i+1)
#200n=i;
tryfunctm(.clk(clk),.n(n),.result(result),.reset(reset));
练习题仿真结果
实验七在VerilogHDL中使用任务(task)
1.掌握任务在Verilog模块设计中的应用。
2.学会在电平敏感列表的always中使用拼接操作、任务和阻塞赋值等语句,并生成复杂组合逻辑的高级方法。
安装Modelsim-6.2b的PC机。
利用电平敏感的always块和一个比较两变量大小排序的任务,设计出4个并行输入数的高速排序组合逻辑。
modulesort4(ra,rb,rc,rd,a,b,c,d);
0]ra,rb,rc,rd;
0]a,b,c,d;
0]va,vb,vc,vd;
always@(aorborcord)
{va,vb,vc,vd}={a,b,c,d};
sort2(va,vc);
sort2(vb,vd);
sort2(va,vb);
sort2(vc,vd);
sort2(vb,vc);
{ra,rb,rc,rd}={va,vb,vc,vd};
tasksort2;
inout[3:
0]x,y;
0]tmp;
if(x>
y)
tmp=x;
x=y;
y=tmp;
endtask
moduletask_Top;
wire[3:
0]ra,rb,rc,rd;
a=0;
b=0;
c=0;
d=0;
repeat(50)
#100a={$random}%15;
b={$random}%15;
c={$random}%15;
d={$random}%15;
sort4sort4(.a(a),.b(b),.c(c),.d(d),.ra(ra),.rb(rb),.rc(rc),.rd(rd));
实验八利用有限状态机进行时序逻辑的设计
1.掌握利用有限状态机实现一般时序逻辑分析的方法。
2.掌握用Verilog编写可综合的有限状态机的标准模板。
3.掌握用Verilog编写状态机模块的测试文件的一般方法。
设计一个简单的状态机,功能是检测一个5位的二进制序列“10010”。
moduleseqdet(x,z,clk,rst,state);
inputx,clk,rst;
outputz;
output[2:
0]state;
wirez;
parameterIDLE='
d0,A='
d1,B='
d2,C='
d3,D='
d4,E='
d5,F='
d6,G='
d7;
assignz=(state==E&
&
x==0)?
1:
rst)
state<
=IDLE;
casex(state)
IDLE:
if(x==1)
=A;
A:
if(x==0)
=B;
B:
=C;
=F;
C:
=D;
=G;
D:
=E;
E:
F:
G:
state<
moduleseqdet_Top;
regclk,rst;
reg[23:
0]data;
wire[2:
wirez,x;
assignx=data[23];
always#10clk=~clk;
data={data[22:
0],data[30]};
rst=1;
#2rst=0;
#30rst=1;
data='
b1100_1001_0000_1001_0100;
#500$stop;
seqdetm(x,z,clk,rst,state);
实验九楼梯灯
掌握用Verilog编写简单程序
Ø
楼下到楼上依次有3个感应灯:
灯1、灯2、灯3。
当行人上下楼梯时,各个灯感应到后自动点亮,若在8s内感应信号消失,则点亮8s,若感应信号存在时间超过8s,则感应信号消失4s后灯自动关闭。
任务1:
做出如上逻辑电路设计并仿真;
任务2:
考虑去抖情况,对于感应信号到达存在毛刺(小于0.5s),设计合适逻辑并剔出。
任务3:
若为节约能源,下一个灯点亮的同时将自动关闭上一个灯,做出如上逻辑设计并仿真(仅考虑一个人的情况)
modulestairled(light,switch,clk10,rst);
inputclk10,rst;
input[2:
0]switch;
output[2:
0]light;
reg[2:
0]state1,state2,state3;
0]count1,count2,count3;
0]counter1,counter2,counter3;
parameter
IDLE1=3'
b000,IDLE2=3'
b000,IDLE3=3'
b000,
state1_main=3'
b001,state2_main=3'
b001,state3_main=3'
b001,
state1_pos=3'
b010,state2_pos=3'
b010,state3_pos=3'
b010,
state1_neg=3'
b011,state2_neg=3'
b011,state3_neg=3'
b011,
state1_spe_01=3'
b100,state2_spe_01=3'
b100,state3_spe_01=3'
b100,
state1_spe_02=3'
b101,state2_spe_02=3'
b101,state3_spe_02=3'
b101;
/*
ThefirstalwaysblockTodealwithlight1&
switch1
*/
always@(posedgeclk10)
state1<
=IDLE1;
count1<
=8'
b0;
counter1<
=3'
if(switch[0]==1'
b1&
counter1<
5)counter1<
=counter1+1;
else
case(state1)
IDLE1:
if(switch[0]=='
b1)
=state1_pos;
=79;
light[0]<
state1_main:
if(count1>
0)
=count1-1;
if(switch[0]==0)
=state1_neg;
if(switch[0]==1)
=state1_spe_01;
state1_spe_01:
=state1_spe_02;
=39;
elsestate1<
state1_spe_02:
state1_neg:
='
end
state1_pos:
=1;
=state1_main;
state1<
ThesecondalwaysblockTodealwithlight2&
switch2
state2<
=IDLE2;
count2<
counter2<
if(switch[1]==1'
counter2<
5)counter2<
=counter2+1;
case(state2)
IDLE2:
if(switch[1]=='
=state2_pos;
light[1]<
state2_main:
if(count2>
=count2-1;
if(switch[1]==0)
=state2_neg;
if(switch[1]==1)
=state2_spe_01;
state2_spe_01:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北航 verilog 实验 报告