您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > Verilog-冒泡排序资料
深圳大学实验报告课程名称:Verilog数字系统设计实验名称:四个8位2进制输入数据的冒泡排序学院:信息工程学院专业:电子信息工程班级:2010级电子2班组号:指导教师:报告人:学号:实验时间:2012年11月6日星期二实验地点南区N413实验报告提交时间:2012.11.11实验要求:1、掌握任务在Verilog模块设计中的应用;2、学会在电平敏感列表的always中使用拼接操作、任务和阻塞赋值等语句,并生成复杂组合逻辑的高级方法;3、掌握利用有限状态机实现一般时序逻辑分析的方法;4、掌握用Verilog编写可综合的有限状态机的标准模版;掌握用Verilog编写状态机模块的测试文件的一般方法。实验内容:1、设计一个功能相同的模块,该模块能完成四个8位2进制输入数据的冒泡排序。假设8位数据是按照时钟节拍串行输入的,要求用时钟触发任务的执行法,每个时钟周期完成一次数据交换的操作。2、使用纯组合逻辑实现四个8位2进制输入数据的冒泡排序。实验代码:A.Verilog程序代码_时钟触发moduleRank(clk,x_input,ra0,rb0,rc0,rd0,ra1,rb1,rc1,rd1);inputclk;reg[3:0]state;input[7:0]x_input;output[7:0]ra0,rb0,rc0,rd0,ra1,rb1,rc1,rd1;reg[7:0]va,vb,vc,vd;reg[7:0]ra0,rb0,rc0,rd0,ra1,rb1,rc1,rd1;parameterIDLE0='d0,IDLE1='d1,IDLE2='d2,IDLE3='d3,A='d4,B='d5,C='d6,D='d7,E='d8;always@(posedgeclk)casex(state)IDLE0:begin{va}={x_input};state=IDLE1;endIDLE1:begin{vb}={x_input};state=IDLE2;endIDLE2:begin{vc}={x_input};state=IDLE3;endIDLE3:begin{vd}={x_input};state=A;{ra0,rb0,rc0,rd0}={va,vb,vc,vd};endA:beginsort2(va,vc);state=B;endB:beginsort2(vb,vd);state=C;endC:beginsort2(va,vb);state=D;endD:beginsort2(vc,vd);state=E;endE:beginsort2(vb,vc);{ra1,rb1,rc1,rd1}={va,vb,vc,vd};state=IDLE0;enddefault:state=IDLE0;endcasetasksort2;inout[7:0]x,y;reg[7:0]tmp;if(xy)begintmp=x;x=y;y=tmp;endendtaskendmoduleA.Verilog测试代码_时钟触发moduleTest;//Inputsregclk;reg[7:0]x_input;//Outputswire[7:0]ra0;wire[7:0]rb0;wire[7:0]rc0;wire[7:0]rd0;wire[7:0]ra1;wire[7:0]rb1;wire[7:0]rc1;wire[7:0]rd1;//InstantiatetheUnitUnderTest(UUT)Rankuut(.clk(clk),.x_input(x_input),.ra0(ra0),.rc0(rc0),.rb0(rb0),.rd0(rd0),.ra1(ra1),.rb1(rb1),.rc1(rc1),.rd1(rd1));always#10clk=~clk;always@(posedgeclk)x_input={$random}%256;//保证随机数不大于8位initialbegin//InitializeInputsclk=0;x_input=0;#100$stop;endendmodule仿真波形RTL级仿真:综合后门级仿真:B.Verilog程序代码_纯组合逻辑B.Verilog测试代码_纯组合逻辑moduleTest;//Inputsreg[7:0]a;reg[7:0]b;reg[7:0]c;reg[7:0]d;//Outputswire[7:0]ra;wire[7:0]rb;wire[7:0]rc;wire[7:0]rd;//InstantiatetheUnitUnderTest(UUT)Rankuut(.ra(ra),.rb(rb),.rc(rc),.rd(rd),.a(a),.b(b),.c(c),.d(d));initialbegin//InitializeInputsa=0;b=0;c=0;d=0;repeat(50)begin#100a={$random}%256;b={$random}%256;c={$random}%256;d={$random}%256;end//Wait100nsforglobalresettofinish#100$stop;//AddstimulushereendendmodulemoduleRank(ra,rb,rc,rd,a,b,c,d);input[7:0]a,b,c,d;output[7:0]ra,rb,rc,rd;reg[7:0]ra,rb,rc,rd;reg[7:0]va,vb,vc,vd;always@(aorborcord)begin{va,vb,vc,vd}={a,b,c,d};sort2(va,vc);sort2(vb,vd);sort2(va,vb);sort2(vc,vd);sort2(vb,vc);{ra,rb,rc,rd}={va,vb,vc,vd};endtasksort2;inout[7:0]x,y;reg[7:0]tmp;if(xy)begintmp=x;x=y;y=tmp;endendtaskendmodule仿真结果:仿真波形RTL级仿真:综合后门级仿真:实验过程分析:一、代码分析I.对于纯组合逻辑做法。第一种做法主要同过书写一个task,这一点有点类似C语言的子函数。随后便是利用这个task做简单的纯组合逻辑电路设计II.对于时序触发做法。第二种做法主要使用状态机,通过一个始终周期的到来先进行数据的串行输入,然后再进行数据交换,以此达到冒泡排序的目的。二、仿真分析I.对于纯组合逻辑做法。在clk前四个时钟周期里,进行了数据的输入,此时并未排序。从第五个时钟周期开始到第九个时钟周期结束,数据进行冒泡排序并输出。接下来循环50次。II.对于时序触发做法。在波形上已经很清晰的指出输入数据以此冒泡排序后的数据,不涉及任何延迟。实验心得总结:通过这一次的实验,可以说是悲剧万分呀。主要还是对于时钟触发这种做法不太理解,从一开始的完全一头雾水到最后做到较为透彻的理解,这一过程十分不容易。通过本次实验,学会了状态机的书写方法,重要的是学会了仿真代码的书写方法。并且靠自己读懂了仿真波形。指导教师批阅意见:成绩评定:指导教师签字:年月日备注:注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。
本文标题:Verilog-冒泡排序资料
链接地址:https://www.777doc.com/doc-4734212 .html