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程序代码_时钟触发
module
Rank(clk,x_input,ra0,rb0,rc0,rd0,ra1,rb1,rc1,rd1);
input clk;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;
parameter
IDLE0='d0,IDLE1='d1,IDLE2='d2,IDLE3='d3,A='d4,B='d5,C='d6,D='d7,E='d8;
always@(posedge clk)
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}; 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
task sort2;
inout[7:0] x,y;reg[7:0] tmp;
if(x>y)
begin
tmp=x;x=y;y=tmp;
end
endtask state<=A;
{ra0,rb0,rc0,rd0}={va,vb,vc,vd};
end endmodule
A.Verilog测试代码_时钟触发
module Test;
// Inputs
reg clk;
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;
// Instantiate the Unit Under Test
(UUT)
Rank uut (
.clk(clk),
.x_input(x_input),
.ra0(ra0), .rc0(rc0),
.rb0(rb0), .rd0(rd0),
.ra1(ra1), .rb1(rb1),
.rc1(rc1), .rd1(rd1)
);
always #10 clk=~clk;
always @ (posedge clk)
x_input={$random}%256;//保证随机数不大于8位
initial
begin
// Initialize Inputs
clk = 0;
x_input = 0;
#100 $stop;
end
endmodule
仿真波形
RTL级仿真:
综合后门级仿真:
B.Verilog程序代码_纯组合逻辑
B.Verilog测试代码_纯组合逻辑
module Test;
// 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;
// Instantiate the Unit Under Test
(UUT)
Rank uut (
.ra(ra),
.rb(rb),
.rc(rc),
.rd(rd),
.a(a),
.b(b),
.c(c), .d(d)
);
initial begin
// Initialize Inputs
a = 0;
b = 0;
c = 0;
d = 0;
repeat(50)
begin
#100 a={$random}%256;
b={$random}%256;
c={$random}%256;
d={$random}%256;
end
// Wait 100 ns for global reset
to finish
#100 $stop;
// Add stimulus here
end
endmodule module Rank(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@(a or b or c or d)
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 task sort2;
inout[7:0] x,y;
reg[7:0] tmp;
if(x>y)
begin
tmp=x;
x=y;
y=tmp;
end
endtask
endmodule 仿真结果:
仿真波形
RTL级仿真:
综合后门级仿真:
实验过程分析:
一、代码分析
I. 对于纯组合逻辑做法。
第一种做法主要同过书写一个task,这一点有点类似C语言的子函数。随后便是利用这个task做简单
的纯组合逻辑电路设计
II. 对于时序触发做法。
第二种做法主要使用状态机,通过一个始终周期的到来先进行数据的串行输入,然后再进行数据交换,
以此达到冒泡排序的目的。
二、仿真分析
I. 对于纯组合逻辑做法。
在clk前四个时钟周期里,进行了数据的输入,此时并未排序。从第五个时钟周期开始到第九个时钟
周期结束,数据进行冒泡排序并输出。接下来循环50次。
II. 对于时序触发做法。
在波形上已经很清晰的指出输入数据以此冒泡排序后的数据,不涉及任何延迟。
实验心得总结:
通过这一次的实验,可以说是悲剧万分呀。主要还是对于时钟触发这种做法不太理解,从一开始的完全一头雾水到最后做到较为透彻的理解,这一过程十分不容易。
通过本次实验,学会了状态机的书写方法,重要的是学会了仿真代码的书写方法。并且靠自己读懂了仿真波形。