北航eda实验报告.docx
- 文档编号:15559107
- 上传时间:2023-07-05
- 格式:DOCX
- 页数:24
- 大小:759.70KB
北航eda实验报告.docx
《北航eda实验报告.docx》由会员分享,可在线阅读,更多相关《北航eda实验报告.docx(24页珍藏版)》请在冰点文库上搜索。
北航eda实验报告
2014-2015-2-G02A3050-1
电子电路设计训练(数字EDA部分)
实验报告
(2015年5月19日)
教学班
学号
姓名
组长
签名
成绩
120311
王天然
*
120311
马璇
120312
唐玥
自动化科学与电气工程学院
实验一、简单组合逻辑和简单时序逻辑
简单的组合逻辑设计
实验目的和内容:
目的:
(1)掌握基本组合逻辑电路的实现方法
(2)初步了解两种基本组合逻辑电路的生成方法
(3)学习测试模块的编写
(4)通过综合和布局布线了解不同层次仿真的物理意义
内容:
模块源代码的组合逻辑仿真与测试
实验源代码:
modulecompare(equal,a,b);
inputa,b;
outputequal;
assignequal=(a>b)1:
0;"
modulet;
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;
end
comparem(.equal(equal),.a(a),.b(b));
endmodule
实验仿真:
测试模块检测模块设计,给出输入信号,通过波形观察模块的内部信号和输出信号。
综合就是将文件送到synplify或其他综合器进行处理,启动综合器编译。
简单分频时序逻辑电路的设计
实验目的和内容:
目的:
(1)掌握最基本时序电路的实现方法
(2)学习时序电路测试模块的编写
(3)学习综合和不同层次的仿真
内容:
分频时序电路的仿真测试
实验源代码:
modulehalf_clk(reset,clk_in,clk_out);
inputclk_in,reset;
outputclk_out;
regclk_out
always@(posedgeclk_in)eset(reset),.clk_in(clk),.clk_out(clk_out));
endmodule
实验仿真:
每遇到clk的上升沿一次,输出电平翻转一次
(选作)设计一个字节(8位)比较器
实验内容:
比较两个字节的大小,若a[7:
0]大于b[7:
0],则输出高电平,否则输出低电平。
实验代码:
modulecompare(equal,a,b);
input[7:
0]a,b;
outputequal;
assignequal=(a>b)1:
0;"
modulet2;
reg[7:
0]a,b;
regclock;
wireequal;
initial
begin
a=0;
b=0;
clock=0;
end
always#50clock=~clock;
always@(posedgeclock)
begin
repeat(10)
begin
a={$random}%255;qual(equal),.a(a),.b(b));
endmodule
第一个initial块常用于仿真时信号的给出;第二个initial块是系统
任务,暂停仿真以便观察仿真波形。
它们的关系是并列关系,仿真一并执行。
实验仿真:
实验小结
这次实验主要学习了简单组合逻辑电路和时序逻辑电路的设计。
试验一通过简单的逻辑语句就完成了一个数据比较器的设计,这个试验主要应用到了组合逻辑常用的assign结构和always模块,让我对verilog语言有了初步了解。
试验二学习了用always块和@(posedgeclk),@(negedgeclk)组成时序逻辑电路,做成分频器。
在测试模块部分,用{$random}%255随机产生值,给定随机输出。
实验二、条件语句和always过程块
实验任务1——利用条件语句实现计数分频时序电路
实验要求
(1)掌握条件语句在简单时序模块设计中的使用
(2)学习在Verilog模块中应用计数器
(3)学习测试模块的编写、综合和不同层次的仿真
模块的核心逻辑设计
always@(posedgeF10M)
if(!
reset)
moduleblocking1(clk,a,b,c);
output[3:
0]b,c;
input[3:
0]a;
inputclk;
reg[3:
0]b,c;
always@(posedgeclk)
begin
c=b;,a,b,c);
end
endmodule
3.
moduleblocking2(clk,a,b,c);
output[3:
0]b,c;
input[3:
0]a;
inputclk;
reg[3:
0]b,c;
always@(posedgeclk)b=a;,a,b,c);
endmodule
测试程序的核心逻辑设计
测试部分
1
`timescale1ns/100ps
`include"./"
`include"./"
`include"./"
`include"./"
modulecompareTop;
wire[3:
0]b11,c11,b12,c12,b13,c13,b2,c2;
reg[3:
0]a;
regclk;
initial
begin
clk=0;
forever#50clk=~clk;
end
initial
begin
a=4'h3;
$display("%d",a);
#100a=4'h7;
$display("%d",a);
#100a=4'hf;
$display("%d",a);
#100a=4'ha;
$display("%d",a);
#100a=4'h2;
$display("%d",a);
#100$stop;
end
blockingblocking(clk,a,b11,c11);
blocking1blocking1(clk,a,b12,c12);
blocking2blocking2(clk,a,b13,c13);
non_blockingnon_blocking(clk,a,b2,c2);
endmodule
2.
`timescale1ns/100ps
`include"./"
`include"./"
modulecompareTop2;
wire[3:
0]b1,c1,b2,c2;
reg[3:
0]a;
regclk;
initial
begin
clk=0;
forever#50clk=~clk;
end
initial
begin
a=4'h3;
$display("");
#100a=4'h7;
$display("");
#100a=4'hf;
$display("");
#100a=4'ha;
$display("");
#100a=4'h2;
$display("");
#100
$display("");
$stop;
end
blocking1blocking1(clk,a,b1,c1);
blocking2blocking2(clk,a,b2,c2);
endmodule
仿真实验关键结果及其解释
对非阻塞,在上升沿到来时把a的值给b,并同时把b的值给c。
如第一个上升沿来时把-1给b2,把7给c2。
对阻塞,先把-1给b1,再把变为-1的b1给c1.
2.
思考题1分析:
时钟上升沿来时将b的值赋给c并同时将a的值赋给b。
思考题2分析:
第一个时钟上升沿来时,将a的值赋给b,第二个时钟上升沿来时,将b的值赋给c。
实验任务2——在VerilogHDL中使用函数
实验要求
1.采用同步时钟触发执行,每个clk时钟周期都会执行一次运算,并且在测试模块中,通过调用系统任务$display及在时钟的下降沿显示每次计算的结果,
2.设计一个带控制端的逻辑运算电路,分别完成正整数的平方,立方和最大数为5的阶乘运算,要求可综合,编写测试模块,并给出各种层次的仿真波形,比较他们的不同。
模块的核心逻辑设计
1、
moduletryfunct(clk,n,result,reset);
output[31:
0]result;
input[3:
0]n;
inputreset,clk;
reg[31:
0]result;
always@(posedgeclk)
`include"./"
`timescale1ns/100ps
`defineclk_cycle50
moduletryfunctTop;
reg[3:
0]n,i;
regreset,clk;
wire[31:
0]result;
initial
begin
clk=0;
n=0;
reset=1;
#100reset=0;lk(clk),.n(n),.result(result),.reset(reset));
endmodule
2、
`include"./"
`timescale1ns/100ps
`defineclk_cycle50
moduletryfunctcombtest;
reg[2:
0]n;
regreset,clk;
reg[1:
0]cal;
wire[6:
0]result;
parameterperiods=20;
initial
begin
n=0;
reset=1;
clk=0;
cal=0;
#100reset=0;
#100reset=1;
repeat(periods)
begin
#50cal={$random}%3;
#50n={$random}%6;
end
#100$stop;
end
always#`clk_cycleclk=~clk;
tryfunctcombm(.clk(clk),.n(n),.result(result),.reset(reset),.cal(cal));
endmodule
仿真实验关键结果及其解释
1.
2.
实验任务3——在VerilogHDL中使用任务(task)
实验要求
用两种不同方法设计一个功能相同的模块,该模块能完成四个8位2进制输入数据的冒泡排序。
第一种,模仿原题例子中用纯组合逻辑实现;第二种,假设8位数据是按照时钟节拍串行输入的,要求用时钟触发任务的执行法,每个时钟周期完成一次数据交换操作。
模块的核心逻辑设计
modulesort4(ra,rb,rc,rd,a,b,c,d);
output[3:
0]ra,rb,rc,rd;
input[3:
0]a,b,c,d;
reg[3:
0]ra,rb,rc,rd;
reg[3:
0]va,vb,vc,vd;
always@(aorborcord)
begin
{va,vb,vc,vd}={a,b,c,d};
sort2(va,vc);(a),.b(b),.c(c),.d(d),.ra(ra),.rb(rb),.rc(rc),.rd(rd));
endmodule
仿真实验关键结果及其解释
将a,b,c,d的值分别赋给va,vb,vc,vd,将va与vc互换,vb与vd互换,va与vb互换,vc与vd互换,vb与vc互换,换完后,将va,vb,vc,vd的值赋给ra,rb,rc,rd。
实验总结
这次实验主要学习了赋值语句函数和任务。
试验四通过在always块中阻塞赋值和非阻塞赋值,让我理解了他们语法上和综合后电路的区别。
用=阻塞赋值顺序进行,用<=非阻塞赋值并发进行。
试验六学习了在verilogHDL中使用函数,通过在always块中调用函数完成一个计算。
试验其使用任务,不同于函数,调用任务可以输出多个结果不需要返回值。
实验四、有限状态机
实验任务1——基于状态机的串行数据检测器
实验要求
设计一个串行数据检测器。
要求是:
连续4个或4个以上为1时输出为1,其他情况下为0.编写测试莫阔对设计的模块进行各种层次的方针,并观察波形,编写实验报告。
模块的核心逻辑设计
moduleseqdet(x,z,clk,rst,state);
inputx,clk,rst;
outputz;
output[2:
0]state;
reg[2:
0]state;
wirez;
parameterIDLE=0,A=1,B=2,C=3,D=4;
assignz=(state==D&&x==1)1:
0;
"
moduleseqdet_Top;
regclk,rst;
reg[23:
0]data;
wire[2:
0]state;
wirez,x;
assignx=data[23];
always#10clk=~clk;
always@(posedgeclk)
data={data[22:
0],data[23]};
initial
begin
clk=0;
rst=1;
#2rst=0;
#30rst=1;
data='b1111_1001_0111_1001_0100;
实验任务2——楼梯灯
实验要求
楼下到楼上依次有3个感应灯:
灯1、灯2、灯3。
当行人上下楼梯时,各个灯感应到后自动点亮,若在8s内感应信号消失,则点亮8s,若感应信号存在时间超过8s,则感应信号消失4s后灯自动关闭。
任务1:
做出如上逻辑电路设计并仿真;
任务2:
设感应信号是电平信号,考虑去抖情况,对于感应信号到达存在毛刺(小于,设计合适逻辑并剔除。
任务3:
若为节约能源,下一个灯点亮的同时将自动关闭上一个灯,作出如上逻辑设计并仿真(仅考虑一个人的情况);
任务4:
考虑存在多个人上下楼梯的情况,比如:
行人1已经从灯1到达灯2,灯2受感应自动点亮,但此时行人2刚上楼梯到达灯1的位置,则灯1和灯2都须点亮,更加复杂一点,如果行人2是下楼梯刚到达灯3位置,作出如上逻辑设计并仿真;
模块的核心逻辑设计
end
else
begin
state1<=state1_start;//没有触发信号,状态不改变,继续等待信号
light[1]<='b0;
end
state1_up:
begin
light[1]<='b1;//点亮灯0
state1<=state1_work;
end
state1_work:
if(count1>0)
begin
count1<=count1-1;//计数器从79自减到0,实现当一个灯被感应信号触发时至少亮8秒
if(switch[1]=='b0&&(state2==3'b010||state3==3'b010))//实现任务3:
若1号灯位置没有触发并且2,3号灯处于点亮(state_up)状态,则直接熄灭1号灯后进入关灯状态(state1_down)
begin
light[1]<='b0;
state1<=state1_down;
end
end
else
if(switch[1]=='b0)
begin
state1<=state1_down;
end
else
begin
state1<=state1_other;
count1<=39;
end//如果8秒后触发信号还在,则给2号计数器置39,以用于为感应信号消失的4秒计时,并进入state_other状态
state1_down:
begin
light[1]<='b0;
count_1<=3'b0;
state1<=state1_start;
end//关闭1号灯,计数器置0
state1_other:
//用于8秒后仍有触发信号的状态
if(switch[1]=='b1)//检查触发信号,若有,则维持在本状态,计数器不变
state1<=state1_other;
else//一旦触发信号消失,则开始4秒的计时
if(count1>0)
begin
count1<=count1-1;
if(switch[1]=='b0&&(state2==3'b010||state3==3'b010))
//用于实现任务3,解释同上
begin
light[1]<='b0;
state1<=state1_down;
end
end
else//一旦计时器计满4秒,关闭灯1
state1<=state1_down;
default:
state1<=state1_start;//其他任何情况,回到初始状态
endcase
测试程序的核心逻辑设计
`timescale10ms/1msmodule//仿真单位时间
regclk10,rst;//时钟与复位信号
reg[2:
0]up,down;//行人
wire[2:
0]swh,light;//触发信号与灯
parameterHALF_PERIOD=5;
always#HALF_PERIODclk10=~clk10;//生成时钟
initialbegin//初始化
clk10=0;
rst=1;
up=3'b000;down=3'b000;
#1rst=0;
#10rst=1;
#100up=3'b001;down=3'b000;
#500up=3'b010;down=3'b100;
#600up=3'b011;down=3'b010;
…………//模拟行人上下楼情况
#1000$stop;
end
assignswh=up|down;//取并集来模拟多个行人出现处的触发状态,实现任务4
仿真实验关键结果及其解释
任务1:
观察light0,在触发秒后(去抖)被点亮,由于触发很快消失,灯亮状态持续时间为8s;
任务1:
观察light2,触发持续时间已经超过8s,则在触发消失后4s,light2熄灭
任务2:
毛刺并未影响灯的状态
任务3:
观察light0,触发结束后,灯亮时间未达8s,但是light0熄灭,原因是此时light1亮着,为节约能源则light0提前关闭。
任务4在测试模块中实现,swh=up||down
实验总结
这次实验主要用有限状态机进行时序逻辑设计。
状态机分一段式状态机即所有逻辑(输入、输出、状态)都在一个always块中解决;两段式状态机:
(常用)时序逻辑和组合逻辑划分开来。
对于习题上比较简单的任务采用一段式,对补充试验则更复杂得多,因为各个状态之间的跳转不再是依靠某一个单一的变量,而是要有好几个变量。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北航 eda 实验 报告