> 文档中心 > 【Verilog】通过任务(task)完成3个8bit数据的冒泡排序

【Verilog】通过任务(task)完成3个8bit数据的冒泡排序

题目:

设计一个模块,通过任务完成3个8位2进制输入数据的冒泡排序。要求:时钟触发任务的执行,每个时钟周期完成一次数据交换的操作。


Verilog代码:

modulesort(inputsys_clk,inputsys_rst,input[7:0]a,input[7:0]b,input[7:0]c,outputreg[7:0]max,outputreg[7:0]mid,outputreg[7:0]min);localparamS0=5'b00001,S1=5'b00010,S2=5'b00100,S3=5'b01000,S4=5'b10000;reg[4:0]state;reg[7:0]a_temp = 0;reg[7:0]b_temp = 0;reg[7:0]c_temp = 0;always @ (posedgesys_clkorposedgesys_rst)beginif(sys_rst== 1'b1)beginmax<=8'b0;mid<=8'b0;min<=8'b0;state<=S0;endelse case(state)S0:begina_temp<=a;    b_temp  <=b;    c_temp  <=c;state<=S1;endS1  :beginsort2(a_temp,b_temp);state<=S2;endS2  :beginsort2(c_temp,b_temp);state<=S3;endS3  :beginsort2(a_temp,c_temp);state<=S4;endS4  :beginmax<=b_temp;mid<=c_temp;min<=a_temp;state<=S0;enddefault  :statey)begintemp=x;x=y;y=temp;endendtaskendmodule

test bench:

`timescale1ns/1psmoduletb;regclk,rst;reg[7:0]a,b,c;wire[7:0]max,mid,min;initialbeginclk=0;rst=1;a=0;b=0;c =0;#40rst=0;a=14;b=12;c =37;#60a=2;b=15;c =3;endalways #5clk=~clk;sortu_sort(.sys_clk( clk),.sys_rst    ( rst   ),.a   ( a     ),.b   ( b     ),.c   ( c     ),.max ( max   ),.mid ( mid   ),.min ( min   ));endmodule

仿真结果:

后记

若有其他描述方式,欢迎讨论。

后续会继续更新verilog有意思的或可移植的模块。