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