verilog 自动售货机状态机实现_堆排序的Verilog实现

欢迎FPGA工程师加入官方微信技术群最近在做项目的过程中遇到了一个排序问题,需要对4096个正值数据进行排序。由于使用的Xilinx的Kintex系列FPGA,逻辑资源较为丰富,所以希望能利用逻辑资源尽量加速排序算法。但是自己对排序算法了解不多,所以目前根据网上的资料,选择了堆排序实现排序算法。参考资料如下目前我实现的堆排序算法并没有很好的利用FPGA的并行特性,更多的还是利用FSM进行...
摘要由CSDN通过智能技术生成

欢迎FPGA工程师加入官方微信技术群

最近在做项目的过程中遇到了一个排序问题,需要对4096个正值数据进行排序。由于使用的Xilinx的Kintex系列FPGA,逻辑资源较为丰富,所以希望能利用逻辑资源尽量加速排序算法。但是自己对排序算法了解不多,所以目前根据网上的资料,选择了堆排序实现排序算法。参考资料如下

58a4cf1fff595de0aadef91333c0b78c.png

目前我实现的堆排序算法并没有很好的利用FPGA的并行特性,更多的还是利用FSM进行循环计算。希望可以借本文抛砖引玉,得到大神的指点,介绍给我一个可以利用FPGA并行计算特性实现大量数据快速排序的FPGA算法。大家要是有什么想法或者建议一定要给我留言,拜托拜托。

堆排序算法原理不再介绍,排序六 堆排序 - 静默虚空 - 博客园这篇博客介绍的非常详细。这里补充一下:算法的思想是将RAM看做一个堆,RAM的地址就对应堆的各个节点,通过对RAM的读写就可以实现对堆节点的交换、比较,排序结束后RAM内的数据就会按顺序排好。我将堆排序算法分为两个模块:堆初始化模块和上层控制模块,根据堆排序的具体算法可以得到状态机具体内容如下:

0d7287def4b831b08d76dd637a567469.png
堆初始化模块状态机
04a9f029d305d27738ff056481e10158.png
上层控制模块状态机

这里状态机均由三段式状态机实现,Verilog代码如下(请看明白原理再拿走代码,不然我这篇文章就没有意义了)

堆初始化模块:

`timescale 1ns / 1ps
module initial_stack
#(
parameter addr_width = 5,
parameter data_width = 8
)
(
input clk,
input rst_n,
input en,
input clr,
output reg done,

input [addr_width - 1:0] parent,
input [addr_width - 1:0] length,

output reg wea,
output reg [ addr_width - 1:0 ] addra,
output reg [ data_width - 1:0 ] data_we,
input [ data_width - 1:0 ] data_re
);

reg [data_width - 1:0] temp;
reg [addr_width :0] parent_r;//attention: For recognize the parent, we must expand data width of it
reg [addr_width :0] child_r;
reg [addr_width :0] length_r;

parameter IDLE = 6'b000001;
parameter BEGIN = 6'b000010;
parameter GET = 6'b000100;
parameter COMPARE = 6'b001000;
parameter WRITE = 6'b010000;
parameter COMPLETE= 6'b100000;


reg [5:0] state;
reg [5:0] next_state;
reg [7:0] cnt;
reg [data_width - 1:0] child_compare;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n) begin state <= IDLE; end
else begin state <= next_state; end
end

always@(*)
begin
case(state)
IDLE: begin
if(en) begin next_state = BEGIN; end
else begin next_state = IDLE; end
end
BEGIN:begin
if(cnt == 8'd2) begin next_state = GET; end
else begin next_state = BEGIN; end
end
GET: begin
if(child_r >= length_r) begin next_state = COMPLETE; end
else if(cnt == 8'd4) begin next_state = COMPARE; end
else begin next_state = GET; end
end
COMPARE: begin
if(temp >= child_compare) begi
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值