北航_电子实习_数字部分实验报告(优秀)_北航电力电子实验报告
北航_电子实习_数字部分实验报告(优秀)由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“北航电力电子实验报告”。
报告名称:电子电路设计训练数字部
分
学院:仪器科学与光电工程学院
目录
实验报告概述:...............................................................................................................3
一、选做实验总结:.................................................................................................3(1)补充练习2:楼梯灯设计.............................................................................3(2)练习题6:用两种不同的设计方法设计一个功能相同的模块,完成4个数据的冒泡排序...................................................................................................................5(3)(4)(5)
二、(1)(2)(3)(4)(5)练习题3:利用10MB的时钟,设计一个单周期形状的周期波形..................6 练习题4:运用always块设计一个8路数据选择器......................................6 练习题5:设计一个带控制端的逻辑运算电路.............................................7 练习一:简单组合逻辑设计.........................................................................7 练习三:利用条件语句实现计数分频失序电路.............................................7 练习四:阻塞赋值与非阻塞赋值得区别.......................................................8 练习五:用always块实现较复杂的组合逻辑电路........................................8 练习六:在verilog HDL中使用函数..............................................................9 必做实验总结:.................................................................................................7(6)练习七:在verilog HDL中使用任务..............................................................9(7)练习八:利用有限状态机进行时许逻辑设计..............................................10
三、实验总结及体会:............................................................................................10
四、选作程序源代码...............................................................................................11(1)练习题3:利用10MB的时钟,设计一个单周期形状的周期波形................11(2)练习题4:运用always块设计一个8路数据选择器....................................12(3)练习题5:设计一个带控制端的逻辑运算电路...........................................13(4)练习题6:用两种不同的设计方法设计一个功能相同的模块,完成4个数据的冒泡排序.................................................................................................................14(5)补充练习2:楼梯灯设计...........................................................................16
图表目录
Figure 1 楼梯灯任务4..............................................................................................5 Figure 2 组合逻辑.....................................................................................................5 Figure 3 时序逻辑.....................................................................................................6 Figure 4 周期波形....................................................................................................6 Figure 5 8路数据选择器..........................................................................................6 Figure 6 逻辑运算电路.............................................................................................7 Figure 7 组合逻辑设计.............................................................................................7 Figure 8 计数分频时序电路......................................................................................8 Figure 9 阻塞赋值与非阻塞赋值得区别....................................................................8 Figure 10 always块组合逻辑电路.............................................................................9 Figure 11 使用函数..................................................................................................9 Figure 12 使用任务................................................................................................10 Figure 13 有限状态机............................................................................................10
电子电路设计训练(数字部分)实验报告
实验报告概述:
本实验报告为对四次电子电路设计训练(数字部分)实验的总结,主要包括以下四部分:
第一部分为选做实验总结,主要包括每个选择实验的设计思路、运行结果、注意事项、心得体会;
第二部分为必做实验总结,包括运行结果、总结、心得体会; 第三部分为课程总结和体会,是对全部实验及课程的总结; 第四部分为选做实验部分源代码;
一、选做实验总结:
(1)补充练习2:楼梯灯设计
设计思路:
本题给出楼梯的运行规则,并分别给与四个相应任务进行编程设计,考虑到程序的通用性及FPGA高速并行处理的优点,主要思路如下:
根据运行规则(8s内和大于8s等),对每个灯的相应状态进行编程,设计时序逻辑及有限状态机;由于在总体上看,每个灯的状态变化相对独立(只有一个人上楼除外),故对每个灯编程所得到的程序代码可通用于其它灯(只需要改变相应寄存器定义即可),此即为灯控制模块,对4个不同的任务,只需设计其它部分判断逻辑,即可完成任务要求;如此设计,可大大提高程序设计效率、易用性,同时如果面对更多的灯控制需要,也可快速进行修改部署。
下面针对不同任务给出不同处理方法:
任务1/任务3:由于任务1和任务3在定义上有很大相同点,比如同样是一个人走楼梯,若不考虑一个人同时在两层使两个灯亮,则事实上就是一个人始终只能使一盏灯亮,亮起后盏时熄灭前一盏;在保持每个灯控制模块不改变的情况下,利用非阻塞赋值,判断该人目前所处状态及位置(上楼/下楼,楼层),同时规定输出,同时只能亮一盏灯;
任务2:由于输入信号已被赋值给寄存器变量,此时只需在系统时钟作用下对寄存器中输入变量进行判断,满足要求即为正确信号,再输入灯控制模块;
任务4:由于已有灯控制模块,此时只需结合任务2防抖电路,直接输出状态信号所对应的结果即可;
(单个)灯控制模块代码:
always @(posedgeclk)begin signal_test[0]
begin
i0=i0+1;
end else
i0=0;if(i0>=5)
begin signal_reg[0]=signal[0];
end
if(state0==light_off)
begin
k0=0;
k0a=0;
k0b=0;
end else
k0=k0+1;
case(signal_reg[0])
1: if(!reset)
begin
state0=light_off;
end
else
begin
k0a=k0a+1;*分栏显示,详细代码见报告第四部分;
运行结果:
if((k0a >= 79)&&(k0
state0=light_on12;
else
state0=light_on8;
end
0:if(!reset)
begin
state0=light_off;
end
else if(k0a==0)
state0=light_off;endcase
case(state0)
light_off:light_reg[0]=0;
light_on8:
begin light_reg[0]=1;
if(k0b==79)
state0=light_off;
else
k0b=k0b+1;
end
light_on12:
begin
light_reg[0]=1;
if(k0b==119)
state0=light_off;
else
k0b=k0b+1;
end endcase end
Figure 1楼梯灯任务4
Figure 2楼梯灯信号防抖部分放大结果
(2)练习题6:用两种不同的设计方法设计一个功能相同的模块,完成4个数据的冒泡排序
设计思路:
纯组合排序中,设计sort排序任务对数列中的元素进行排序,通过调用任务实现对不同元素的排序功能,并将排序完成的结果直接输出;
冒泡排序即为每次将两个相邻数进行比较,大的数后“浮”,每一趟比较获得较大值并置于数列末位;
根据题目要求,每比较一次,即将调换位置的数字进行输出;同样设计sort任务,对两数字进行比较并排序;
通过排序控制和逻辑判断代码,控制sort任务的有效调用,进而实现冒泡排序功能;
根据设计要求,程序中只设计有一个输入端口,通过对输入信号不断移位,模拟串并行信号转换,从而完成穿行输入,并行比较的功能;
运行结果:
Figure 3组合逻辑
Figure 4时序逻辑
(3)练习题3:利用10MB的时钟,设计一个单周期形状的周期波形
设计思路:
对输入时钟进行计数,通过if语句进行判断,若满足判断条件,则按要求改变输出信号;如此循环往复,即可产生所需单周期形状的周期波形;
运行结果:
Figure 5周期波形
(4)练习题4:运用always块设计一个8路数据选择器
设计思路:
利用define宏定义预先定义,利于后期程序功能的扩充和调整;同时利用case语句判断信号,并将相对应信号输出,进而完成系统目标功能;
运行结果:
Figure 68路数据选择器
(5)练习题5:设计一个带控制端的逻辑运算电路
设计思路:
设计三个函数分别完成三个要求的计算,通过函数调用实现相应功能;设计的控制端为同步控制端,需要通过时钟信号从而进行检测复位;
运行结果:
Figure 7逻辑运算电路
二、必做实验总结:
(1)练习一:简单组合逻辑设计
语法要点:
Aign语句构成的组合逻辑电路,若输入a,b改变,则输出equal;
利用aign equal=(a==b)?1:0语句,可同时完成判断赋值功能,大大减少代码量; 运行结果:
Figure 8组合逻辑设计
(2)练习三:利用条件语句实现计数分频时序电路
语法要点:
此程序主要练习了对输入时钟进行计数,判断,从而实现分频输出;
在实际应用中,可以通过该方式获得不同占空比或频率的信号供系统使用;
课本程序问题修改:
课本测试程序中未定义F10M_clk变量,故应将测试程序fdivision_TOP中出现的该变量改为已定义的F10M;
运行结果:
Figure 9计数分频时序电路
(3)练习四:阻塞赋值与非阻塞赋值的区别
语法要点:
阻塞赋值呈现的是一种立即赋值的状态,即同一个变量在前后语句中用到,语句间的顺序会影响到输出的结果;
非阻塞赋值对每一个块中语句间的相对位置没有要求,只在该块语句全部运行完成后同一进行赋值;
运行结果:
Figure 10阻塞赋值与非阻塞赋值得区别
(4)练习五:用always块实现较复杂的组合逻辑电路
语法要点:
Always@实现了对若干输入信号的敏感,即只要有一个信号改变,输出即改变; 通过case语句,实现了选择性输出,对不同功能进行综合;
运行结果:
Figure 11 always块组合逻辑电路
(5)练习六:在verilog HDL中使用函数
语法要点:
函数最基本功能即实现计算,通过对不同函数定义,实现不同的计算功能;同时定义函数,可以利于在该模块外对某函数功能的调用,增强了程序的通用性和功能性,同时可以使程序结构更加清晰,易读易懂;
运行结果:
Figure 12使用函数
(6)练习七:在verilog HDL中使用任务
语法要点:
相比函数,任务的调用功能更强大,可以实现运算并输出多个结果的功能,同时任务并不返回计算值,只通过类似C语言中的形参和实参的数据交换,实现功能;任务的定义和调用可
以只程序结构更明晰,功能更丰富;
程序中通过对比较顺序的设计,实现了对4个数字,进行5次比较即可成功完成排序功能的目的;
运行结果:
Figure 13使用任务
(7)练习八:利用有限状态机进行时许逻辑设计
语法要点:
设计有限状态机主要需要进行状态分配,状态编码,然后利用case语句进行判断,从而改变相应状态,实现状态转移和输出变换;
对涉及时钟的一般时序逻辑,主要运用非阻塞(〈=)赋值完成功能;
课本程序问题修改:
在modelsim 10中,测试文件时钟无法仿真,故只能保持与课本测试文件相同的思路,重新编写测试文件,仿真结果如下,与课本完全一致;
运行结果:
Figure 14有限状态机
三、实验总结及体会:
通过半个学期的学习和实验,我初步掌握了verilogHDL语言和modelsim软件,可以通过编程实现数字电路基础中几乎全部简单逻辑芯片的功能,同时可以用编程实现相对复杂一点的逻辑电路和功能.总体而言,四次实验内容相对简单,几乎是在课后实验的基础上稍稍做了提高,以利于我们掌握并巩固课上学习的知识。有几个课后实验内容,按照程序输入后无法进行波形仿真,在改正一些错误定义,或者重写测试程序后,都能顺利完成实验任务。通过实验上机,巩固了我们的理论知识,加强了实际运用的能力,对整个课程的学习起到了很好的作用。
最后一个补充实验相对复杂,但实现的方法却可以有很多,在实际写代码前进行构思分析,在这个实验中显得尤为重要,例如,如何发挥FPGA并行处理的能力,如何提高程序的通用性,能够将所设计的模块结构同时完成四个任务,如何设计代码提高效率的同时节省硬件资源„„都是在设计构思中不得不考虑的环节,因此,通过最后一个实验的设计,能够很好的锻炼我们解决实际生活中问题的能力,使我们对所学的知识能够真正有所使用。
运用verilog HDL语言进行硬件电路设计,已成为未来电路设计的主要趋势,学习这门语言及相应软件,能够帮助我们在以后的学习及科研中,大大提高我们的效率,使我们能够快速搭建实验平台,完成目标功能。
虽然8周的课,时间相对较短,但通过这8周的学习,我对verilog HDL语言有了全面的认识,对基本的语法都有了很好的掌握,虽然时间有限,不能对verilog HDL语言有更深入的认识,但通过这8周的学习,我为我将来进一步深化使用这个工具打下了坚实的基础。
四、选作程序源代码(1)练习题3:利用10MB的时钟,设计一个单周期形状的周期波形 主程序:
module fdivison_2(RESET,F10M,clk_out,j);input F10M,RESET;output clk_out;output[12:0] j;
regclk_out;
reg[12:0] j;always @(posedge F10M)begin if(!RESET)begin clk_out
else begin if(j==199)
begin
j
end
else if(j==299)
begin
j
end
else if(j==499)
j
else j
endmodule
output[3:0] out;
reg[3:0] out;
always @(a or b or c or d or e or f or g or h or selet)
begin
case(selet)
`s1:out=a;
`s2:out=b;
`s3:out=c;
`s4:out=d;
`s5:out=e;
`s6:out=f;
`s7:out=g;
`s8:out=h;default:out=4'hz;endcase
end
endmodule
测试程序: `timescale 1 ns/1 ns
module muxtest;
wire[3:0] out;reg[3:0] a,b,c,d,e,f,g,h;reg[2:0] selet;
parameter times1=8;
initial
begin
a=0;
b=1;
c=2;d=3;
e=4;
f=5;
g=6;
h=7;selet=3'h0;
repeat(5)测试程序:
`timescale 1ns/100ps `define clk_cycle 50 module TOP_2;reg F10M,RESET;wire clk;wire[12:0] j;always #`clk_cycle
F10M = ~F10M;
initial
begin
RESET=1;
F10M=0;
#100 RESET=0;
#100 RESET=1;
#10000 $stop;
end
fdivison_2 fdivison_2(.RESET(RESET),.F10M(F10M),.clk_out(clk),.j(j));
endmodule
(2)练习题4:运用always块设计一个8路数据选择器
主程序: `define s1 3'd0 `define s2 3'd1 `define s3 3'd2 `define s4 3'd3 `define s5 3'd4 `define s6 3'd5 `define s7 3'd6 `define s8 3'd7
module mux_8(a,b,c,d,e,f,g,h,selet,out);
input[3:0] a,b,c,d,e,f,g,h;
input[2:0] selet;
begin
#100 selet=selet+1;
end
selet=0;repeat(times1)
begin
#100 selet=selet+1;
a={$random}%16;
b={$random}%16;
c={$random}%16;
d={$random}%16;
e={$random}%16;
f={$random}%16;
g={$random}%16;
h={$random}%16;
end
#100 $stop;
end
mux_8 m0(a,b,c,d,e,f,g,h,selet,out);endmodule
(3)练习题5:设计一个带控制端的逻辑运算电路
主程序:
`define sqrR 4'd0 `define triR 4'd0 `define factR 4'd0
module sqr(a,reset,clk,sqr_out,tri_out,fact_out);
input[3:0] a;input reset,clk;output[7:0] sqr_out,tri_out,fact_out;reg[7:0] sqr_out,tri_out,fact_out;
always @(posedgeclk)begin
if(!reset)
{sqr_out,tri_out,fact_out}={`sqrR,`triR,`factR};
else
begin
sqr_out=sqr_cal(a);tri_out=tri_cal(a);fact_out=fact_cal(a);
end end
function[7:0] sqr_cal;
input[3:0] a;
begin sqr_cal=a*a;
end endfunction
function[7:0] tri_cal;
input[3:0] a;
begin tri_cal=a*a*a;
end endfunction
function[7:0] fact_cal;
input[3:0] a;
begin
if(a>5)fact_cal=0;
else
begin
case(a)
0:fact_cal=1;
1:fact_cal=1;
2:fact_cal=2;
3:fact_cal=6;
4:fact_cal=24;
5:fact_cal=120;endcase
end
end endfunction
endmodule
测试程序:
`timescale 1 ns/100 ps `define clk_cycle 50
module sqrTEST;
reg[3:0] a,i;regreset,clk;
wire[7:0] sqr_out,tri_out,fact_out;
initial
begin clk=0;
a=0;
reset=1;
#100 reset=0;
#100 reset=1;
for(i=0;i
begin
#200 a=i;
end
#100 $stop;
end
always #`clk_cycleclk=~clk;
sqr m(a,reset,clk,sqr_out,tri_out,fact_out);
endmodule
(4)练习题6:用两种不同的设计方法设计一个功能相同的模块,完成4个数据的冒泡排序
组合逻辑实现程序:
module bub(ai,bi,ci,di,ao,bo,co,do);
input[7:0] ai,bi,ci,di;output[7:0] ao,bo,co,do;reg[7:0] ao,bo,co,do;reg[7:0] ar,br,cr,dr;reg[3:0] n;
parameter so=4;
//
always @(ai or bi or ci or di)begin
{ar,br,cr,dr}={ai,bi,ci,di};
for(n=so;n>1;n=n-1)
//
bb(ar,br,cr,dr,n);
{ao,bo,co,do}={ar,br,cr,dr};end
task bb;
// inout[7:0] x1,x2,x3,x4;
input[3:0] n;
// reg[7:0] temp;reg[3:0] s;
if(n>0)
for(s=1;s
begin
case(s)
1:sort2(x1,x2);2:sort2(x2,x3);
3:sort2(x3,x4);endcase
end endtask
task sort2;inout[7:0] x,y;reg[7:0] temp;
if(x>y)
begin
temp=x;
x=y;
y=temp;
end endtask
endmodule
组合逻辑测试程序: `timescale 1 ns/100 ps
module bubTEST;reg[7:0] ai,bi,ci,di;wire[7:0] ao,bo,co,do;
initial
begin ai=0;bi=0;ci=0;di=0;
repeat(4)
begin
#100 ai={$random}%256;
bi={$random}%256;
ci={$random}%256;
di={$random}%256;
end
#100 $stop;
end
bub m0(ai,bi,ci,di,ao,bo,co,do);
endmodule
时序逻辑实现程序:
module bub_1(in,clk,ar,br,cr,dr,ao,bo,co,do);
input[7:0] in;input clk;output[7:0] ao,bo,co,do;output[7:0] ar,br,cr,dr;reg[7:0] ao,bo,co,do;reg[7:0] ar,br,cr,dr;reg[3:0] n,s,q;
parameter so=4;
initial
begin
n=0;
s=0;
q=0;
end
always @(posedgeclk)begin
if(n
begin
n=n+1;ar
end
if(n==so+1)
begin
n
s
q
end
if(s>1)
begin
{ao,bo,co,do}
if(q
begin
case(q)
1:sort2(ar,br);
2:sort2(br,cr);
3:sort2(cr,dr);endcase
q
end
else
begin
s
q
end
end
end
task sort2;inout[7:0] x,y;reg[7:0] temp;
if(x>y)
begin
temp=x;
x=y;
y=temp;
end endtask
endmodule
时序逻辑测试程序: `timescale 1 ns/100 ps
module bubTEST_1;reg[7:0] in;regclk;
wire[7:0] ao,bo,co,do,ar,br,cr,dr;
initial
begin clk=0;
in=0;
begin
repeat(4)
#100 in={$random}%256;
end
#100 $stop;
end
always #50 clk=~clk;
bub_1 m0(in,clk,ar,br,cr,dr,ao,bo,co,do);
endmodule
(5)补充练习2:楼梯灯设计 主程序:
module final2(signal,reset,clk,light);
input[2:0] signal;
input reset,clk;
output[2:0] light;
reg[2:0]
signal_reg,light_reg,light_test,signal_test;
reg[11:0] k0,k1,k2,k0a,k1a,k2a,k0b,k1b,k2b;
reg[1:0] state0,state1,state2;
reg[3:0] i0,i1,i2;
parameter light_off=2'b00,light_on8=2'b01,light_on12=2'b10;initial begin
k0=0;k1=0;k2=0;
k0a=0;k1a=0;k2a=0;
k0b=0;k1b=0;k2b=0;
i0=0;i1=0;i2=0;light_reg=3'b000;
state0=light_off;
state1=light_off;
state2=light_off;signal_reg=0;signal_test=signal;end
//
//
always @(posedgeclk)begin
signal_test[0]
begin
i0=i0+1;
end else
i0=0;if(i0>=5)
begin
signal_reg[0]=signal[0];
end
if(state0==light_off)
begin
k0=0;
k0a=0;
k0b=0;
end else
k0=k0+1;
case(signal_reg[0])
1: if(!reset)
begin
state0=light_off;
end
else
begin
k0a=k0a+1;
if((k0a >= 79)&&(k0
state0=light_on12;
else
state0=light_on8;
end
0:if(!reset)
begin
state0=light_off;
end
else if(k0a==0)
state0=light_off;endcase
case(state0)
light_off:light_reg[0]=0;
light_on8:
begin light_reg[0]=1;
if(k0b==79)
state0=light_off;
else
k0b=k0b+1;
end
light_on12:
begin light_reg[0]=1;
if(k0b==119)
state0=light_off;
else
k0b=k0b+1;
end endcase end
always @(posedgeclk)begin
signal_test[1]
begin
i1=i1+1;
end else
i1=0;
if(i1>=5)
begin
signal_reg[1]=signal[1];
end
if(state1==light_off)
begin
k1=0;
k1a=0;
k1b=0;
end else
k1=k1+1;
case(signal_reg[1])
1: if(!reset)
begin
state1=light_off;
end
else
begin
k1a=k1a+1;
if((k1a >= 79)&&(k1
state1=light_on12;
else
state1=light_on8;
end
0:if(!reset)
begin
state1=light_off;
end
else if(k1a==0)
state1=light_off;endcase
case(state1)
light_off:light_reg[1]=0;
light_on8:
begin light_reg[1]=1;
if(k1b==79)
state1=light_off;
else
k1b=k1b+1;
end
light_on12:
begin light_reg[1]=1;
if(k1b==119)
state1=light_off;
else
k1b=k1b+1;
end endcase end
//
// always @(posedgeclk)begin signal_test[2]
begin
i2=i2+1;
end else
i2=0;if(i2>=5)
begin signal_reg[2]=signal[2];
end
if(state2==light_off)
begin
k2=0;
k2a=0;
k2b=0;
end else
k2=k2+1;
case(signal_reg[2])
1: if(!reset)
begin
state2=light_off;
end
else
begin
k2a=k2a+1;
if((k2a >= 79)&&(k2
state2=light_on12;
else
state2=light_on8;
end
0:if(!reset)
begin
state2=light_off;
end
else if(k2a==0)
state2=light_off;endcase
case(state2)
light_off:light_reg[2]=0;
light_on8:
begin light_reg[2]=1;
if(k2b==79)
state2=light_off;
else
k2b=k2b+1;
end
light_on12:
begin light_reg[2]=1;
if(k2b==119)
state2=light_off;
else
k2b=k2b+1;
end endcase
casex(light_reg)
3'b000:light_test=000;
3'b001:light_test=001;
3'b01x:light_test=010;
3'b1xx:light_test=100;endcase end
aign light=light_test;endmodule
测试程序:
`timescale 10ms/10ms
module final_TOP2;reg[2:0] signal;regclk,reset;
wire[2:0] light;
initial begin clk=0;
reset=1;
#2 reset=0;
#10 reset=1;
#10 signal=3'b111;
#10 signal=3'b000;
#900 signal=3'b111;
#100 signal=3'b000;
#900 signal=3'b011;
#100 signal=3'b000;
#900 signal=3'b001;
#900 signal=3'b000;
#100 $stop;end
always #5 clk=~clk;
final2 m(signal,reset,clk,light);endmodule