Verilog冒泡排序.docx
《Verilog冒泡排序.docx》由会员分享,可在线阅读,更多相关《Verilog冒泡排序.docx(11页珍藏版)》请在冰豆网上搜索。
![Verilog冒泡排序.docx](https://file1.bdocx.com/fileroot1/2022-12/31/3dc00bcc-af0c-4a7b-a67e-f4fa99d9d9ca/3dc00bcc-af0c-4a7b-a67e-f4fa99d9d9ca1.gif)
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;
end
IDLE1:
begin
{vb}={x_input};state<=IDLE2;
end
IDLE2:
begin
{vc}={x_input};state<=IDLE3;
end
IDLE3:
begin
{vd}={x_input};
state<=A;
{ra0,rb0,rc0,rd0}={va,vb,vc,vd};
end
A:
begin
sort2(va,vc);state<=B;
end
B:
begin
sort2(vb,vd);state<=C;
end
C:
begin
sort2(va,vb);state<=D;
end
D:
begin
sort2(vc,vd);state<=E;
end
E:
begin
sort2(vb,vc);
{ra1,rb1,rc1,rd1}={va,vb,vc,vd};
state<=IDLE0;
end
default:
state<=IDLE0;
endcase
tasksort2;
inout[7:
0]x,y;reg[7:
0]tmp;
if(x>y)
begin
tmp=x;x=y;y=tmp;
end
endtask
endmodule
A.Verilog测试代码_时钟触发
moduleTest;
//Inputs
regclk;
reg[7:
0]x_input;
//Outputs
wire[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位
initial
begin
//InitializeInputs
clk=0;
x_input=0;
#100$stop;
end
endmodule
仿真波形
RTL级仿真:
综合后门级仿真:
B.Verilog程序代码_纯组合逻辑
moduleRank(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};
end
tasksort2;
inout[7:
0]x,y;
reg[7:
0]tmp;
if(x>y)
begin
tmp=x;
x=y;
y=tmp;
end
endtask
endmodule
B.Verilog测试代码_纯组合逻辑
moduleTest;
//Inputs
reg[7:
0]a;
reg[7:
0]b;
reg[7:
0]c;
reg[7:
0]d;
//Outputs
wire[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
//InitializeInputs
a=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;
//Addstimulushere
end
endmodule
仿真结果:
仿真波形
RTL级仿真:
综合后门级仿真:
实验过程分析:
一、代码分析
I.对于纯组合逻辑做法。
第一种做法主要同过书写一个task,这一点有点类似C语言的子函数。
随后便是利用这个task做简单
的纯组合逻辑电路设计
II.对于时序触发做法。
第二种做法主要使用状态机,通过一个始终周期的到来先进行数据的串行输入,然后再进行数据交换,
以此达到冒泡排序的目的。
2、仿真分析
I.对于纯组合逻辑做法。
在clk前四个时钟周期里,进行了数据的输入,此时并未排序。
从第五个时钟周期开始到第九个时钟
周期结束,数据进行冒泡排序并输出。
接下来循环50次。
II.对于时序触发做法。
在波形上已经很清晰的指出输入数据以此冒泡排序后的数据,不涉及任何延迟。
实验心得总结:
通过这一次的实验,可以说是悲剧万分呀。
主要还是对于时钟触发这种做法不太理解,从一开始的完全一头雾水到最后做到较为透彻的理解,这一过程十分不容易。
通过本次实验,学会了状态机的书写方法,重要的是学会了仿真代码的书写方法。
并且靠自己读懂了仿真波形。
指导教师批阅意见:
成绩评定:
指导教师签字:
年月日
备注:
注:
1、报告的项目或容设置,可根据实际情况加以调整和补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日。