电子电路设计训练数字EDA部分.docx
《电子电路设计训练数字EDA部分.docx》由会员分享,可在线阅读,更多相关《电子电路设计训练数字EDA部分.docx(31页珍藏版)》请在冰豆网上搜索。
电子电路设计训练数字EDA部分
2014-2015-2-G02A3050-1
电子电路设计训练(数字EDA部分)
实验报告
(2015年5月20日)
教学班
学号
姓名
组长
签名
成绩
自动化科学与电气工程学院
实验一、简单组合逻辑和简单时序逻辑
1.1实验任务1——简单组合逻辑
1.1.1实验要求
(1)设计一个两位数据比较器,比较两个数据a和b。
若两数据相同,则给出结果1,否则给出结果0。
(2)设计一个字节(8位)的比较器,比较两个字节a[7:
0]和b[7:
0]的大小。
若a大于b,则输出高电平,否则输出低电平。
1.1.2模块的核心逻辑设计
(1)两位数据比较器
assignequal=(a==b)?
1:
0;//用连续赋值语句assign对结果equal赋值,a=b时,equal输出为1,否则为0
(2)字节数据比较器
assignres=(a>b)?
1:
0;//用连续语句assign对结果equal赋值,a>b时equal输出为1,否则输出为0
1.1.3测试程序的核心逻辑设计
(1)两位数据比较器
always#50clock=~clock;//产生周期性跳变的时钟,50个时间单位跳变一次
always@(negedgeclock)//always后的语句表示时序控制,每次时钟下降沿时刻产生不同的a和b
begin
a={$random}%2;
b={$random}%2;//每次随机产生a和b
end
initial
begin#100000000$stop;end//系统任务,暂停仿真以观察波形
(2)字节数据比较器
a={$random}%256;
b={$random}%256;//a和b从0~255共256个数中随机产生,即可生成8位字节数据
1.1.4仿真实验关键结果及其解释
(1)两位数据比较器
图1两位数据比较器波形图
如图1所示,a和b相同时equal输出为高电平,否则输出低电平。
(2)字节数据比较器
图2字节数据比较器波形图
如图2所示,a>b时,res输出高电平,否则res输出低电平。
1.2实验任务2——简单时序逻辑
1.2.1实验要求
设计一个分频器,将时钟波形二分频。
1.2.2模块的核心逻辑设计
always@(posedgeclk_in)//always语句后表示时序控制,每次clk_in时钟上升沿时刻进行动作
begin
if(!
reset)clk_out=0;//reset信号为低电平时,输出清零
elseclk_out=~clk_out;//reset为高电平时,输出时钟clk_out在输入时钟clk_in的上升沿时刻翻转
end
1.2.3测试程序的核心逻辑设计
always#`clk_cycleclk=~clk;//产生输入时钟
initial
begin
clk=0;
reset=1;
#10reset=0;//reset给低电平,输出清零
#110reset=1;//reset复位
#100000$stop;//系统任务,暂停仿真以便观察波形
end
1.2.4仿真实验关键结果及其解释
图3二分频器的波形图
如图3所示,输入时钟clk被二分频输出。
1.3实验小结
通过实验一,我掌握了如下内容:
1)assign连续赋值语句的使用。
2)always,initial块的使用。
3)reg,wire等数据类型的适用范围
4)调用被测试模块的方法
实验二、条件语句和always过程块
2.1实验任务1——利用条件语句实现计数分频时序电路
2.1.1实验要求
(1)设计20分频计数器,将10MHz的时钟分频为500kHz的时钟。
(2)利用10MHz的时钟,设计一个给定单周期形状的周期波形。
2.1.2模块的核心逻辑设计
(1)20分频计数器
begin
if(j==9)//对计数器进行判断,计十个数翻转一次,则一个周期计20个数,即实现20分频
begin
j<=0;//输出时钟翻转的同时计数器置零
F500K<=~F500K;
end
else
j<=j+1;//若还没计到十个数,继续计数
end
(2)给定单周期形状的波形
begin
if(j<=20)
begin
FDIV<=0;
j<=j+1;//前20个输入时钟周期,计数器计数,但输出不跳变
end
elseif((j>20)&&(j<=30))
begin
FDIV<=1;
j<=j+1;//中间10个时钟周期输出跳变成高电平,保持计数
end
elseif((j>30)&&(j<=50))
begin
FDIV<=0;
j<=j+1;//后20个时钟周期输出跳变成低电平,保持计数
end
else
j<=0;//计数器清零
end
2.1.3测试程序的核心逻辑设计
(1)20分频计数器
always#`clk_cycleF10M_clk=~F10M_clk;//产生输入的10MHz时钟
initial
begin
RESET=1;
F10M_clk=0;
#100RESET=0;//reset给低电平,输出清零
#100RESET=1;//reset复位
#10000$stop;//系统任务,暂停仿真以便观察波形
end
(2)给定单周期形状的波形
begin
RESET=1;
F10M_clk=0;
#100RESET=0;
#100RESET=1;
#100000$stop;
end//与
(1)一致
2.1.4仿真实验关键结果及其解释
(1)20分频计数器
图420分频计数器波形图
如图4所示,10MHz的时钟F10M被20分频成500kHz的时钟F500k。
(2)给定单周期形状的波形
图5给定单周期形状的波形图
如图5所示,生成了题目要求形状的周期波形图。
2.2实验任务2——用always块实现较复杂的组合逻辑电路
2.2.1实验要求
(1)设计一个指令译码电路,对输入数据执行相应的操作,包括加、减、与、或和求反。
(2)运用always块设计一个8路数据选择器。
要求:
每路输入数据与输出数据均为4位2进制数,当选择开关(至少3位)或输入数据发生变化时,输出数据也相应变化。
2.2.2模块的核心逻辑设计
(1)指令译码电路
always@(opcodeoraorb)//电平敏感的always块,当输入数据a,b或控制信号opcode变化时,输出发生变化
begin
case(opcode)
`plus:
out=a+b;//控制信号为'plus时,输出等于a+b
`minus:
out=a-b;//控制信号为'minus时,输出等于a-b
`band:
out=a&b;//控制信号为'band时,输出等于a&b
`bor:
out=a|b;//控制信号为'bor时,输出等于a|b
`unegate:
out=~a;//控制信号为'unegate时,输出等于~a
default:
out=8'hx;//未收到指令时,输出任意态
endcase
(2)8路数据选择器
always@(ctlora0ora1ora2ora3ora4ora5ora6ora7)//电平敏感模块,控制信号ctl或输入a0~a7变化时,输出发生变化
begin
case(ctl)
`ctl0:
out=a0;
`ctl1:
out=a1;
`ctl2:
out=a2;
`ctl3:
out=a3;
`ctl4:
out=a4;
`ctl5:
out=a5;
`ctl6:
out=a6;
`ctl7:
out=a7;//控制端为ctl0~ctl7对应输出a0~a7
default:
out=4'dx;//未收到指令时,输出任意态
endcase
2.2.3测试程序的核心逻辑设计
(1)指令译码电路
begin
a={$random}%256;//从0~255共256个数中随机生成一个数作为输入a
b={$random}%256;//从0~255共256个数中随机生成一个数作为输入b
opcode=3'h0;//控制信号设为初值0,即'plus,求和
repeat(times)//repeat循环语句使控制及输入信号重复变化
begin
#100a={$random}%256;
b={$random}%256;
opcode=opcode+1;//每一时钟到来时,输入a,b改变一随机数,控制信号+1
end
#100$stop;//系统任务,暂停仿真以观察输出波形
end
(2)8路数据选择器
begin
a0={$random}%16;
a1={$random}%16;
a2={$random}%16;
a3={$random}%16;
a4={$random}%16;
a5={$random}%16;
a6={$random}%16;
a7={$random}%16;//从0~15中随机生成输入a0~a7
ctl=3'd0;//控制端置ctl0
repeat(times)//repeat语句重复改变输入
begin
#100a0={$random}%16;
a1={$random}%16;
a2={$random}%16;
a3={$random}%16;
a4={$random}%16;
a5={$random}%16;
a6={$random}%16;
a7={$random}%16;//随机生成a0~a7
ctl=ctl+1;//控制端每次加1
end
#100$stop;
end
2.2.4仿真实验关键结果及其解释
(1)指令译码电路
图6指令译码电路波形
指令译码电路输出波形如图所示。
控制信号opcode为0时,输出为a+b;控制信号opcode为1时,输出为a-b;......以此类推。
(2)8路数据选择器
图78选1数据选择器波形图
8路数据选择器输出波形如图7所示,控制端ctl为0~7时对应输出a0~a7。
2.3实验小结
通过实验二,我掌握了如下内容:
1)if...else条件语句的使用。
2)case条件语句的使用
实验三、赋值、函数和任务
3.1实验任务1——阻塞赋值与非阻塞赋值的区别
3.1.1实验要求
本实验中两个模块"blocking"和"non_blocking"分别采用阻塞赋值和非阻塞赋值语句,从实验结果比较他们的区别。
3.1.2模块的核心逻辑设计
(1)阻塞赋值
always@(posedgeclk)
begin
b=a;
c=b;//阻塞赋值,a赋给b,b赋给c
$display("Blocking