2014-2015-2-G02A3050-1电子电路设计训练(数字EDA部分)实验报告(2015 年5 月20 日)教学班学号姓名组长签名成绩自动化科学与电气工程学院目录目录 (1)实验一、简单组合逻辑和简单时序逻辑 (1)1.1 实验任务1——简单组合逻辑 (1)1.1.1 实验要求 (1)1.1.2 模块的核心逻辑设计 (1)1.1.3 测试程序的核心逻辑设计 (1)1.1.4 仿真实验关键结果及其解释 (2)1.2 实验任务2——简单时序逻辑 (3)1.2.1 实验要求 (3)1.2.2 模块的核心逻辑设计 (3)1.2.3 测试程序的核心逻辑设计 (3)1.2.4 仿真实验关键结果及其解释 (4)1.3 实验小结 (4)实验二、条件语句和always过程块 (5)2.1 实验任务1——利用条件语句实现计数分频时序电路 (5)2.1.1 实验要求 (5)2.1.2 模块的核心逻辑设计 (5)2.1.3 测试程序的核心逻辑设计 (6)2.1.4 仿真实验关键结果及其解释 (7)2.2 实验任务2——用always块实现较复杂的组合逻辑电路 (8)2.2.1 实验要求 (8)2.2.2 模块的核心逻辑设计 (8)2.2.3 测试程序的核心逻辑设计 (9)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 仿真实验关键结果及其解释 (14)3.2 实验任务2——在Verilog HDL中使用函数 (16)3.2.1 实验要求 (16)3.2.2 模块的核心逻辑设计 (16)3.2.3 测试程序的核心逻辑设计 (18)3.2.4 仿真实验关键结果及其解释 (19)3.3 实验任务3——在Verilog HDL中使用任务 (20)3.3.1 实验要求 (20)3.3.2 模块的核心逻辑设计 (20)3.2.3 测试程序的核心逻辑设计 (21)3.2.4 仿真实验关键结果及其解释 (22)3.3 实验小结 (22)实验四、有限状态机 (23)4.1 实验任务1——基于状态机的串行数据检测器 (23)4.1.1 实验要求 (23)4.1.2 模块的核心逻辑设计 (23)4.1.3 测试程序的核心逻辑设计 (25)4.1.4 仿真实验关键结果及其解释 (26)4.2 实验任务2——楼梯灯 (26)4.2.1 实验要求 (26)4.2.2 模块的核心逻辑设计 (27)4.2.3 测试程序的核心逻辑设计 (31)4.2.4 仿真实验关键结果及其解释 (32)4.3 实验小结 (34)实验一、简单组合逻辑和简单时序逻辑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)两位数据比较器assign equal=(a==b)?1:0; //用连续赋值语句assign对结果equal赋值,a=b 时,equal输出为1,否则为0(2)字节数据比较器assign res=(a>b)?1:0; //用连续语句assign对结果equal赋值,a>b时equal输出为1,否则输出为01.1.3 测试程序的核心逻辑设计(1)两位数据比较器always #50 clock=~clock; //产生周期性跳变的时钟,50个时间单位跳变一次always@(negedge clock) //always后的语句表示时序控制,每次时钟下降沿时刻产生不同的a和bbegina={$random}%2;b={$random}%2; //每次随机产生a和bendinitialbegin#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@(posedge clk_in)//always语句后表示时序控制,每次clk_in时钟上升沿时刻进行动作beginif(! reset) clk_out=0; //reset信号为低电平时,输出清零else clk_out=~clk_out;//reset为高电平时,输出时钟clk_out在输入时钟clk_in的上升沿时刻翻转end1.2.3 测试程序的核心逻辑设计always #`clk_cycle clk=~clk; //产生输入时钟initialbeginclk=0;reset=1;#10 reset=0; //reset给低电平,输出清零#110 reset=1; //reset复位#100000 $stop; //系统任务,暂停仿真以便观察波形end1.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分频计数器beginif(j==9) //对计数器进行判断,计十个数翻转一次,则一个周期计20个数,即实现20分频beginj<=0; //输出时钟翻转的同时计数器置零F500K<=~F500K;endelsej<=j+1; //若还没计到十个数,继续计数end(2)给定单周期形状的波形beginif(j<=20)beginFDIV<=0;j<=j+1; //前20个输入时钟周期,计数器计数,但输出不跳变endelse if((j>20)&&(j<=30))beginFDIV<=1;j<=j+1; //中间10个时钟周期输出跳变成高电平,保持计数endelse if((j>30)&&(j<=50))beginFDIV<=0;j<=j+1; //后20个时钟周期输出跳变成低电平,保持计数endelsej<=0; //计数器清零end2.1.3 测试程序的核心逻辑设计(1)20分频计数器always #`clk_cycle F10M_clk=~F10M_clk; //产生输入的10MHz时钟initialbeginRESET=1;F10M_clk=0;#100 RESET=0; //reset给低电平,输出清零#100 RESET=1; //reset复位#10000 $stop; //系统任务,暂停仿真以便观察波形end(2)给定单周期形状的波形beginRESET=1;F10M_clk=0;#100 RESET=0;#100 RESET=1;#100000 $stop;end //与(1)一致2.1.4 仿真实验关键结果及其解释(1)20分频计数器图 4 20分频计数器波形图如图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@(opcode or a or b) //电平敏感的always块,当输入数据a,b或控制信号opcode变化时,输出发生变化begincase(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时,输出等于~adefault: out=8'hx; //未收到指令时,输出任意态endcase(2)8路数据选择器always@(ctl or a0 or a1 or a2 or a3 or a4 or a5 or a6 or a7) //电平敏感模块,控制信号ctl或输入a0~a7变化时,输出发生变化begincase(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~a7default: out=4'dx; //未收到指令时,输出任意态endcase2.2.3 测试程序的核心逻辑设计(1)指令译码电路begina={$random}%256; //从0~255共256个数中随机生成一个数作为输入a b={$random}%256; //从0~255共256个数中随机生成一个数作为输入b opcode=3'h0; //控制信号设为初值0,即'plus,求和repeat(times) //repeat循环语句使控制及输入信号重复变化begin#100 a={$random}%256;b={$random}%256;opcode=opcode+1; //每一时钟到来时,输入a,b改变一随机数,控制信号+1end#100 $stop; //系统任务,暂停仿真以观察输出波形end(2)8路数据选择器begina0={$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~a7ctl=3'd0; //控制端置ctl0repeat(times) //repeat语句重复改变输入begin#100 a0={$random}%16;a1={$random}%16;a2={$random}%16;a3={$random}%16;a4={$random}%16;a5={$random}%16;a6={$random}%16;a7={$random}%16; //随机生成a0~a7ctl=ctl+1; //控制端每次加1end#100 $stop;end2.2.4 仿真实验关键结果及其解释(1)指令译码电路图 6 指令译码电路波形指令译码电路输出波形如图所示。