北航eda实验报告数字Word格式文档下载.docx
- 文档编号:781257
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:51
- 大小:513.09KB
北航eda实验报告数字Word格式文档下载.docx
《北航eda实验报告数字Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《北航eda实验报告数字Word格式文档下载.docx(51页珍藏版)》请在冰点文库上搜索。
(3)学习测试模块的编写
(4)通过综合和布局布线了解不同层次仿真的物理意义
实验原理:
实验代码提供的是一个可综合的数据比较器。
从语句中可以看出是比较数据a,b的结果,结果相同输出1,否则输出0.测试模块用于检测模块设计是否正确,给出输入信号,观察模块的内部信号和输出信号以确定设计是否正确。
综合就是把compare.v文件送到synplify或其他综合器进行处理,启动综合器编译。
布局布线就是把综合后的另一种文件(EDIF),在布线工具控制下进行处理,启动布局布线的编译。
实验内容:
模块源代码的组合逻辑仿真与测试
实验代码:
modulecompare(equal,a,b);
inputa,b;
outputequal;
assignequal=(a==b)?
1:
0;
endmodule
`timescale1ns/1ns
`include"
./compare.v"
modulet;
rega,b;
wireequal;
initial
begin
a=0;
b=0;
#100a=0;
b=1;
#100a=1;
b=0;
#100$stop;
end
comparem(.equal(equal),.a(a),.b(b));
实验仿真:
练习二简单分频时序逻辑电路的设计
(1)掌握最基本时序电路的实现方法
(2)学习时序电路测试模块的编写
(3)学习综合和不同层次的仿真
对于组合逻辑电路,可综合成具体电路结构的时序逻辑电路也有准确的表达方式。
在可综合的模型中,通常用always块或者@(posedgeclk)或(negedgeclk)结构表达时序逻辑。
实验为二分之一分频器模型。
在always块中,被赋值信号都必须定义为reg型,对于reg型数据,如果未对它进行赋值,仿真工具会认为它是不定态的。
为了正确观察结果,在可综合模块中,常定义一个复位信号reset,其为低电平时对寄存器进行复位。
分频时序电路的仿真测试
modulehalf_clk(reset,clk_in,clk_out);
inputclk_in,reset;
outputclk_out;
regclk_out;
always@(posedgeclk_in)
if(!
reset)clk_out=0;
elseclk_out=~clk_out;
`timescale1ns/100ps
`defineclk_cycle50
moduletop;
regclk,reset;
wireclk_out;
always#`clk_cycleclk=~clk;
clk=0;
reset=1;
#10reset=0;
#110reset=1;
#100000$stop;
half_clkm0(.reset(reset),.clk_in(clk),.clk_out(clk_out));
选做一设计一个字节(8位)比较器
比较两个字节的大小,若a[7:
0]大于b[7:
0],则输出高电平,否则输出低电平。
input[7:
0]a,b;
assignequal=(a>
b)?
./compare2.v"
modulet2;
reg[7:
regclock;
clock=0;
always#50clock=~clock;
always@(posedgeclock)
repeat(10)
a={$random}%255;
b={$random}%255;
comparem2(.equal(equal),.a(a),.b(b));
选做二7段数码管译码电路
moduledigital(a,b);
input[3:
0]a;
output[6:
0]b;
reg[6:
always@(a)
case(a[3:
0])
4'
d0:
b=7'
b1111110;
d1:
b0110000;
d2:
b1101101;
d3:
b1111001;
d4:
b0110011;
d5:
b1011011;
d6:
b0011111;
d7:
b1110000;
d8:
b1111111;
d9:
b1110011;
d10:
b0001101;
d11:
b0011001;
d12:
b0100011;
d13:
b1001011;
d14:
b0001111;
d15:
b0000000;
default:
;
endcase
./digital.v"
moduledigitaltest;
reg[3:
wire[6:
#100a[3]=0;
a[2]=0;
a[1]=0;
a[0]=0;
a[0]=1;
a[1]=1;
a[2]=1;
#100a[3]=1;
digitaldigital(.a(a),.b(b));
第二次实验课
练习三利用条件语句实现计数分频时序电路
(1)掌握条件语句在简单时序模块设计中的使用
(2)学习在Verilog模块中应用计数器
(3)学习测试模块的编写、综合和不同层次的仿真
在可综合的VerilogHDL模型中,常用的条件语句有if…else和case…endcase两种结构,用法和C语言相似。
1.if语句
(1)if(表达式)语句
(2)if(表达式)语句1
else语句2
(3)if(表达式1)语句1;
elseif(表达式2)语句2;
elseif(表达式3)语句3;
……
2.case语句
(1)case(表达式)<
case分支项>
(2)casez(表达式)<
(3)casex(表达式)<
前者用于不太复杂的分支关系,实际编写模块时常用的是后者。
实验代码是一个可综合风格的分频器,可将10M时钟分频为500K,基本原理和二分之一分频器类似,但需要定义一个计数器以准确获得1/20分频。
进行所给代码计数分频器的仿真测试并观察输出波形
实验代码:
modulefdivision(reset,F10M,F500K);
inputF10M,reset;
outputF500K;
regF500K;
0]j;
always@(posedgeF10M)
reset)
F500K<
=0;
j<
else
if(j==19)
=~F500K;
=j+1;
modulefdivisiontext;
regF10M,reset;
wireF500K_clk;
always#`clk_cycleF10M=~F10M;
F10M=0;
#100reset=0;
#100reset=1;
#10000$stop;
fdivisionfdivision(.reset(reset),.F10M(F10M),.F500K(F500K_clk));
实验仿真:
练习五用always块实现较复杂的组合逻辑电路
(1)掌握用always实现较大组合逻辑电路的方法;
(2)进一步了解assign与always两种组合电路实现方法的区别和注意点;
(3)学习测试模块中随机数的产生和应用;
(4)学习综合不同层次的仿真,并比较结果。
(1)自触发always块:
例:
采用非阻塞赋值的自触发振荡器
moduleosc2(clk);
outputclk;
regclk;
initial#10clk=0;
always@(clk)#10clk<
=~clk;
@(clk)的第一次触发之后,非阻塞赋值的RHS表达式便计算出来,并把值赋给LHS的时间并安排在更新事件队列中。
在非阻塞赋值更新事件队列被激活之前,又遇到了@(clk)触发语句,并且always块再次对clk的值变化产生反应。
当非阻塞LHS的值在同一时刻被更新时,@(clk)再一次触发。
本实验示例中使用了电平敏感的always块,所谓电平敏感的触发条件:
@后的括号内电平里表中的任何一个电平发生变化(与时序逻辑不同,它在@后的括号内没有沿敏感关键词,如posedge或negedge),就能触发always块的动作。
(2)assign与always
使用assign结构来实现组合逻辑电路,如果逻辑关系比较复杂,不容易理解语句的功能,而适当采用always来设计组合逻辑,使源代码语句的功能容易理解。
同一组合逻辑电路分别用always块和连续赋值语句assign描述时,代码的形式大相径庭,但在always中,若适当运用default(在case结构中)和else(在if…else结构中)语句时,通常可以综合为纯组合逻辑,尽管被赋值的变量一定要定义为reg型;
若不使用default或else对默认项进行说明,则易生成意想不到的锁存器,这一点一定注意!
`defineplus3'
d0
`defineminus3'
d1
`defineband3'
d2
`definebor3'
d3
`defineunegate3'
d4
modulealwaysp(out,opcode,a,b);
output[7:
0]out;
input[2:
0]opcode;
always@(opcodeoraorb)
case(opcode)
`plus:
out=a+b;
`minus:
out=a-b;
`band:
out=a&
b;
`bor:
out=a|b;
`unegate:
out=~a;
out=8'
hx;
//`include"
./seven_alu.v"
modulealwaystest;
wire[7:
reg[7:
reg[2:
parametertimes=5;
a={$random}%256;
b={$random}%256;
opcode=3'
h0;
repeat(times)
#100a={$random}%256;
opcode=opcode+1;
alwayspalwaysp(.out(out),.opcode(opcode),.a(a),.b(b));
endmodule
利用原有代码,自己编写模块源代码和测试模块代码,利用10M时钟,设计一个单周期形状的周期波形
modulemono(RESET,F10M,F200K);
inputF10M,RESET;
outputF200K;
regF200K;
reg[9:
always@(posedgeF10M)
RESET)
F200K<
if(j==199)
=~F200K;
if(j==299)
modulemonotest;
regF10M_clk,RESET;
wireF200K_clk;
always#`clk_cycleF10M_clk=~F10M_clk;
RESET=1;
F10M_clk=0;
#100RESET=0;
#100RESET=1;
#50000$stop;
monomono(.RESET(RESET),.F10M(F10M_clk),.F200K(F200K_clk));
选做二、用always块实现较复杂的组合逻辑电路
运用always块设计一个8路数据选择器。
要求:
每路输入数据与输出数据均为4位2进制数,当选择开关(至少3位)或输入数据变化时,输出数据也相应的变化。
`definefirst3'
`definesecond3'
`definethird3'
`definefourth3'
`definefifth3'
`definesixth3'
d5
`defineseventh3'
d6
`defineeighth3'
d7
modulealways8(out,opcode,a1,a2,a3,a4,a5,a6,a7,a8);
output[3:
input[3:
0]a1,a2,a3,a4,a5,a6,a7,a8;
always@(opcodeora1ora2ora3ora4ora5ora6ora7ora8)
`first:
out=a1;
`second:
out=a2;
`third:
out=a3;
`fourth:
out=a4;
`fifth:
out=a5;
`sixth:
out=a6;
`seventh:
out=a7;
`eighth:
out=a8;
out=4'
modulealways8test;
wire[3:
reg[3:
parametertimes=8;
a1={$random}%16;
a2={$random}%16;
a3={$random}%16;
a4={$random}%16;
a5={$random}%16;
a6={$random}%16;
a7={$random}%16;
a8={$random}%16;
#100a1={$random}%16;
always8always8(.out(out),.opcode(opcode),.a1(a1),.a2(a2),.a3(a3),.a4(a4),.a5(a5),.a6(a6),.a7(a7),.a8(a8));
第三次实验课
练习六在VerilogHDL中使用函数
(1)了解函数的定义和在模块设计中的使用;
(2)了解函数的综合性问题;
(3)了解许多综合器不能综合复杂的算术运算。
与一般的程序设计语言一样,VerilogHDL中也可使用函数以适应对不同变量采取同一种运算的操作。
VerilogHDL函数在综合时被理解成具有独立运算功能的电路,每调用一次函数相当于改变这部分电路的输入以得到相应的计算结果。
函数的目的是返回一个用于表达式的值。
(1)函数定义
Function<
返回值的类型或范围>
(函数名);
<
端口说明语句>
变量类型说明语句>
Begin
语句>
……
End
Endfuction
(2)函数调用
函数名>
(<
表达式>
,…<
)
采用同步时钟触发运算的执行,每个clk时钟周期都会执行一次运算,并且在测试模块中,通过调用系统任务$display及在时钟的下降沿显示每次计算的结果。
moduletryfunct(clk,n,result,reset);
output[31:
0]result;
input[4:
0]n;
inputreset,clk;
reg[31:
always@(posedgeclk)
begin
if(!
reset)
result<
else
begin
result<
=n*factorial(n)/((n*2)+1);
end
end
function[31:
0]factorial;
input[4:
0]operand;
reg[4:
0]index;
factorial=operand?
for(index=2;
index<
=operand;
index=index+1)
factorial=index*factorial;
endfunction
./tryfunct.v"
moduletryfuncttest;
reg[4:
0]n,i;
regreset,clk;
wire[31:
clk=0;
n=0;
reset=1;
#100reset=0;
#100reset=1;
for(i=0;
i<
=15;
i=i+1)
#200n=i;
#100$stop
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北航 eda 实验 报告 数字