当前位置:文档之家› Verilog-冒泡排序资料教学内容

Verilog-冒泡排序资料教学内容

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. 对于时序触发做法。

在波形上已经很清晰的指出输入数据以此冒泡排序后的数据,不涉及任何延迟。

实验心得总结:

通过这一次的实验,可以说是悲剧万分呀。主要还是对于时钟触发这种做法不太理解,从一开始的完全一头雾水到最后做到较为透彻的理解,这一过程十分不容易。

通过本次实验,学会了状态机的书写方法,重要的是学会了仿真代码的书写方法。并且靠自己读懂了仿真波形。

相关主题