北航电子电路设计训练数字部分实验报告.doc
《北航电子电路设计训练数字部分实验报告.doc》由会员分享,可在线阅读,更多相关《北航电子电路设计训练数字部分实验报告.doc(27页珍藏版)》请在冰豆网上搜索。
2014-2015-2-G02A3050-1
电子电路设计训练(数字EDA部分)
实验报告
(2015年6月24日)
仪器科学与光电工程学院
目录
目录 1
实验一、简单组合逻辑和简单时序逻辑 3
1.1实验任务1——简单组合逻辑 3
1.1.1实验要求 3
1.1.2模块的核心逻辑设计 3
1.1.3测试程序的核心逻辑设计 4
1.1.4仿真实验关键结果及其解释 4
1.2实验任务2——简单时序逻辑 5
1.2.1实验要求 5
1.2.2模块的核心逻辑设计 5
1.2.3测试程序的核心逻辑设计 5
1.2.4仿真实验关键结果及其解释 6
1.3实验小结 6
实验二、条件语句和always过程块 7
2.1实验任务1——条件语句实现计数分频时序电路 7
2.1.1实验要求 7
2.1.2模块的核心逻辑设计 7
2.1.3测试程序的核心逻辑设计 8
2.1.4仿真实验关键结果及其解释 8
2.2实验任务2——always块实现较复杂的组合逻辑电路 9
2.2.1实验要求 9
2.2.2模块的核心逻辑设计 9
2.2.3测试程序的核心逻辑设计 10
2.2.4仿真实验关键结果及其解释 10
2.3实验小结 11
实验三、赋值、函数和任务 12
3.1实验任务1——阻塞赋值与非阻塞赋值的区别 12
3.1.1实验要求 12
3.1.2模块的核心逻辑设计 12
3.1.3测试程序的核心逻辑设计 13
3.1.4仿真实验关键结果及其解释 13
3.2实验任务2——在VerilogHDL中使用函数 14
3.2.1实验要求 14
3.2.2模块的核心逻辑设计 14
3.2.3测试程序的核心逻辑设计 15
3.2.4仿真实验关键结果及其解释 16
3.3实验任务3——在VerilogHDL中使用任务(task) 17
3.3.1实验要求 17
3.3.2模块的核心逻辑设计 17
3.3.3测试程序的核心逻辑设计 18
3.3.4仿真实验关键结果及其解释 18
实验四、有限状态机 19
4.1实验任务1——利用有限状态机进行时序逻辑的设计 19
4.1.1实验要求 19
4.1.2模块的核心逻辑设计 19
4.1.3测试程序的核心逻辑设计 20
4.1.4仿真实验关键结果及其解释 20
4.2实验任务2——串行数据采样器 21
4.2.1实验要求 21
4.2.2模块的核心逻辑设计 21
4.2.3测试程序的核心逻辑设计 23
4.2.4仿真实验关键结果及其解释 25
4.3实验小结 26
2
北京航空航天大学电子电路设计训练(数字EDA部分)实验报告
实验一、简单组合逻辑和简单时序逻辑
1.1实验任务1——简单组合逻辑
1.1.1实验要求
实验代码提供的是一个可综合的数据比较器。
从语句中可以看出是比较数据a,b的结果,结果相同输出1,否则输出0.测试模块用于检测模块设计是否正确,给出输入信号,观察模块的内部信号和输出信号以确定设计是否正确。
练习题:
设计一个字节(8位)的比较器,比较两个字节的大小,如a[7:
0]大于b[7:
0]则输出高电平,否则输出低电平。
1.1.2模块的核心逻辑设计
4
//compare.v第一种实现方式:
assign
modulecompare(equal,a,b);
inputa,b; //a、b为输入
outputequal;//equal为输出
assignequal=(a==b)?
1:
0;
//a=b时输出为1,否则输出为0
endmodule
//compare.v第二种实现方式:
always
modulecompare(equal,a,b);
inputa,b;
outputequal;
regequal;
always@(aorb)
//a或b的值发生变化时执行判断
if(a==b)
equal=1;
else
equal=0;
endmodule
//练习题compare_8.v:
modulecompare_8(a,b,out);
//与练习一的不同只在于a、b要定义为8位
input[7:
0]a;
input[7:
0]b;
outputout;
regout;
always@(aorb)
begin
if(a>b)
out=1;
else
out=0;
end
endmodule
1.1.3测试程序的核心逻辑设计
//compare_test.v
`timescale1ns/1ns
//仿真时间及步长设置
…
initial
begin
a=0;
b=0;
//a、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));
//compare模块实例化
//compare_8_test.v
initial//变量初始化
begin
a=0;
b=0;
clock=0;
end
always#50clock=~clock;
//产生周期为100ns时钟信号
always@(posedgeclock)
//每次时钟上升沿到来,用随机数给a、b赋值,观察输出的变化
begin
/a={$random}%8;b={$random}%8;
//产生8位随机二进制数字
end
北京航空航天大学电子电路设计训练(数字EDA部分)实验报告
1.1.4仿真实验关键结果及其解释
练习一的仿真结果如图1所示。
可以看到,随着a和b的值变化,输出值按照要求变化,并且在功能仿真中没有延迟,同步变化。
图1练习一仿真波形
练习题的仿真结果如下图所示。
可以看到,每次时钟上升沿到来时a、b的值发生变化,输出随之变化。
图2练习题仿真结果
1.2实验任务2——简单时序逻辑
1.2.1实验要求
设计二分之一分频器的可综合模型。
1.2.2模块的核心逻辑设计
always@(posedgeclk_in)
begin
if(!
reset)//reset为同步复位输入端
clk_out=0;
else
clk_out=~clk_out;//每次输入时钟的上升沿让输出时钟反转,实现二分频
end
1.2.3测试程序的核心逻辑设计
`defineclk_cycle50//宏定义
…
always#`clk_cycleclk=~clk;//产生输入时钟
initial
begin
clk=0;
reset=1;
#10reset=0;
#110reset=1;//将初始时的不定态进行复位,开始分频输出。
#100000$stop;//停止仿真
end
1.2.4仿真实验关键结果及其解释
仿真结果如下图所示。
可以看到,输出时钟clk_out的周期是输入时钟clk的二倍,即实现了二分频。
图3练习二仿真结果
1.3实验小结
本次实验中,我们第一次学习使用Modelsim软件,对课上所学的Verilog语法进行了巩固和提高,参考书中给出的例子自己进行了基本组合电路和时序电路的设计,也学会了编写简单的测试模块对系统进行较为全面的测试。
实验二、条件语句和always过程块
2.1实验任务1——条件语句实现计数分频时序电路
2.1.1实验要求
通过定义计数器,利用条件语句,获得一个1/20分频器,将10MHz的时钟分频为500KHz。
练习题:
利用10MHz的时钟设计一个单周期形状的周期波形。
2.1.2模块的核心逻辑设计
16
//练习三fdivision.v:
always@(posedgeF10M)
if(!
reset)//同步复位端
begin
F500K<=0;
j<=0;
end
else
begin
if(j==9)
/*用j实现计数,从0开始每个时钟上升沿自增1,增加到9后输出反转,实现20分频。
这里书中是增加到19后反转,这样得到的信号周期是原信号的1/40,并不是1/20,故在实验中进行了修改*/
begin
j<=0;
F500K=~F500K;
end
else
j<=j+1;
end
//练习题:
wave.v
always@(posedgeF10M)
if(!
reset)begin
outwave<=0;j<=0;
end
elsebegin
if(j==200)begin
//从0开始累加到200后输出置1
j<=j+1;
outwave<=1;
end
elseif(j==300)begin
//累加到300时输出置0
j<=j+1;
outwave<=0;
end
elseif(j==500)begin
//累加到500时,完成一个周期,计数器清零
j<=0;
outwave<=0;
end
else
j<=j+1;
end
2.1.3测试程序的核心逻辑设计
//fdivision_test.v
always#`clkF10M=~F10M;//产生输入时钟信号
initial
begin
reset=1;
F10M=0;
#100reset=0;
#100reset=1;
#10000$stop;
end
fdivisionfdivision(.reset(reset),.F10M(F10M),.F500K(F500K));//模块实例化
//wave_test.v
always#`clkF10M=~F10M;//产生输入时钟
initial
beg