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