北航电子电路设计训练数字部分实验报告.doc

上传人:b****3 文档编号:2489857 上传时间:2022-10-30 格式:DOC 页数:27 大小:570.50KB
下载 相关 举报
北航电子电路设计训练数字部分实验报告.doc_第1页
第1页 / 共27页
北航电子电路设计训练数字部分实验报告.doc_第2页
第2页 / 共27页
北航电子电路设计训练数字部分实验报告.doc_第3页
第3页 / 共27页
北航电子电路设计训练数字部分实验报告.doc_第4页
第4页 / 共27页
北航电子电路设计训练数字部分实验报告.doc_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

北航电子电路设计训练数字部分实验报告.doc

《北航电子电路设计训练数字部分实验报告.doc》由会员分享,可在线阅读,更多相关《北航电子电路设计训练数字部分实验报告.doc(27页珍藏版)》请在冰豆网上搜索。

北航电子电路设计训练数字部分实验报告.doc

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1