排序(Verilog)

RTL代码:

module sort(
	input clk,
	input rst_n,
	input sort_start,
	
	output reg sort_end,
	output reg [7:0]data_out
);
	//输入要排序的数组
	wire [7:0]data_in[7:0];
	
	assign data_in[0] = 8'd5;
	assign data_in[1] = 8'd8;
	assign data_in[2] = 8'd9;
	assign data_in[3] = 8'd1;
	assign data_in[4] = 8'd7;
	assign data_in[5] = 8'd9;
	assign data_in[6] = 8'd0;
	assign data_in[7] = 8'd0;
	
	parameter len = 8;
	reg [3:0]i;
	reg [3:0]j;
	reg en;
	
	//控制比较使能信号
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
			en <= 1'b0;
		else if(sort_start)
			en <= 1'b1;
		else if(sort_end)
			en <= 1'b0;
		else
			en <= en;
	end
	
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
			sort_end <= 1'b0;
		else if((j == len-1) && (i == len-1-j))
			sort_end <= 1'b1;
		else
			sort_end <= 1'b0;
	end
	
	//内部循环
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
			i <= 'd0;
		else if(en)begin
			if(i < len-1-j)
				i <= i + 1'b1;
			else
				i <= 'd0;
		end
		else
			i <= 'd0;
	end
	
	
	reg [7:0]data_r[7:0];
	reg [7:0]temp;
	
	//数据比较
	always@(*)begin
		if(!rst_n)begin
			data_r[0] = data_in[0]; 
			data_r[1] = data_in[1]; 
			data_r[2] = data_in[2]; 
			data_r[3] = data_in[3]; 
			data_r[4] = data_in[4]; 
			data_r[5] = data_in[5]; 
			data_r[6] = data_in[6]; 
			data_r[7] = data_in[7]; 
			temp = 'd0;
		end
		else if(data_r[i] > data_r[i+1])begin
			temp = data_r[i];
			data_r[i] = data_r[i+1];
			data_r[i+1] = temp;
		end
		else begin
			temp = temp;
			data_r[i] =data_r[i];
			data_r[i+1] = data_r[i+1];
		end			
	end
	
	//外层循环
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
			j <= 'd0;
		else if(en)begin
			if(i == len-1-j)
				j <= j + 1'b1;
			else
				j <= j;
		end
		else
			j <= 'd0;
	end
	
	reg end_en;
	reg [2:0]cnt;
	
	//比较之后数据输出
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
			end_en <= 1'b0;
		else if(sort_end)
			end_en <= 1'b1;
		else if(cnt == 'd7)
			end_en <= 1'b0;
		else
			end_en <= end_en;
	end
	
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
			cnt <= 'd0;
		else if(end_en)begin
			if(cnt == 'd7)
				cnt <= 'd0;
			else
				cnt <= cnt + 1'b1;
		end
		else
			cnt <= 'd0;
	end
	
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
			data_out <= 'd0; 
		else if(end_en)
			data_out <= data_r[cnt]; 
		else
			data_out <= 'd0; 
	end
	

endmodule


RTL仿真:

`timescale 1ns / 1ps

module sort_tb;

    reg clk;
	reg rst_n;
	reg sort_start;
	
	wire sort_end;
	wire [7:0]data_out;
	
    sort sort_inst(
	   .clk        (clk),
	   .rst_n      (rst_n),
	   .sort_start (sort_start),
	
	   .sort_end   (sort_end),
       .data_out   (data_out)
);

    initial clk = 0;
    always#10 clk = ~clk;
    
    initial begin
        rst_n = 0;
        sort_start = 0;
        #200;
        rst_n = 1;
        #200;
        sort_start = 1;
        #20;
        sort_start = 0;
    end

endmodule

仿真波形:
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值