当前位置: 首页 > news >正文

FPGA实现流水式排序算法

该算法采用双调排序算法,是一种可流水的递推算法,且算法的消耗时长可算,具体细节参考视频:

https://www.bilibili.com/video/BV1S3thzWEnh/?spm_id_from=333.1387.homepage.video_card.click&vd_source=69fb997b62efa60ae1add8b53b6a5923

module bitonic_sort( input i_clk , input i_rst , input [16 * 16 - 1:0] i_buff , output [16 * 16 - 1:0] o_buff ); localparam WIN = 16; wire signed [15:0] w_data_buff [0:15]; genvar i; genvar j; generate for(i = 0; i < 16; i = i + 1) begin assign w_data_buff[i] = i_buff[i * 16 + 15:i * 16]; end endgenerate /* 双调排序:Bitonic 首先将相邻两个元素作为一个数组: (0,1)(2,3)(4,5)(6,7)(8,9)(10,11)(12,13)(14,15) 将其按照顺序、逆序交替排序,并两个相邻数组组成一个四元素的双调数组 (0,1,2,3)(4,5,6,7)(8,9,10,11)(12,13,14,15) 通过对每个四元素数组进行2、1间隔排序,使四元素数组按照顺序、逆序交替排序,并两个相邻数组组成一个8元素数组 (0,1,2,3,4,5,6,7)(8,9,10,11,12,13,14,15) 对每个8元素数组进行4、2、1间隔排序,使其按照顺序、逆序交替排序,最终组成16元素的回调数组 (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15) 对回调数组按照8、4、2、1间隔排序,完成顺序或逆序排列 */ reg signed [15:0] r_bitonic_pipe0 [0:WIN - 1];//间隔1 generate for(i = 0; i < WIN / 4; i = i + 1) begin always@(posedge i_clk or posedge i_rst) begin if(i_rst) begin r_bitonic_pipe0[i * 4] <= 'd0; r_bitonic_pipe0[i * 4 + 1]<= 'd0; end else begin if(w_data_buff[i * 4] > w_data_buff[i * 4 + 1]) begin//升序 r_bitonic_pipe0[i * 4] <= w_data_buff[i * 4 + 1]; r_bitonic_pipe0[i * 4 + 1] <= w_data_buff[i * 4]; end else begin r_bitonic_pipe0[i * 4] <= w_data_buff[i * 4]; r_bitonic_pipe0[i * 4 + 1] <= w_data_buff[i * 4 + 1]; end end end always@(posedge i_clk or posedge i_rst) begin if(i_rst) begin r_bitonic_pipe0[i * 4 + 2]<= 'd0; r_bitonic_pipe0[i * 4 + 3]<= 'd0; end else begin if(w_data_buff[i * 4 + 2] < w_data_buff[i * 4 + 3]) begin//降序 r_bitonic_pipe0[i * 4 + 2]<= w_data_buff[i * 4 + 3]; r_bitonic_pipe0[i * 4 + 3]<= w_data_buff[i * 4 + 2]; end else begin r_bitonic_pipe0[i * 4 + 2]<= w_data_buff[i * 4 + 2]; r_bitonic_pipe0[i * 4 + 3]<= w_data_buff[i * 4 + 3]; end end end end endgenerate reg signed [15:0] r_bitonic_pipe1 [0:WIN - 1];//间隔2 generate for(i = 0; i < WIN / 8; i = i + 1) begin for(j = 0; j < WIN / 8; j = j + 1) begin always@(posedge i_clk or posedge i_rst) begin if(i_rst) begin r_bitonic_pipe1[i * 8 + j] <= 'd0; r_bitonic_pipe1[i * 8 + j + 2]<= 'd0; end else begin if(r_bitonic_pipe0[i * 8 + j] > r_bitonic_pipe0[i * 8 + j + 2]) begin//升序 r_bitonic_pipe1[i * 8 + j] <= r_bitonic_pipe0[i * 8 + j + 2]; r_bitonic_pipe1[i * 8 + j + 2] <= r_bitonic_pipe0[i * 8 + j]; end else begin r_bitonic_pipe1[i * 8 + j] <= r_bitonic_pipe0[i * 8 + j]; r_bitonic_pipe1[i * 8 + j + 2] <= r_bitonic_pipe0[i * 8 + j + 2]; end end end always@(posedge i_clk or posedge i_rst) begin if(i_rst) begin r_bitonic_pipe1[i * 8 + j + 4]<= 'd0; r_bitonic_pipe1[i * 8 + j + 6]<= 'd0; end else begin if(r_bitonic_pipe0[i * 8 + j + 4] < r_bitonic_pipe0[i * 8 + j + 6]) begin//降序 r_bitonic_pipe1[i * 8 + j + 4]<= r_bitonic_pipe0[i * 8 + j + 6]; r_bitonic_pipe1[i * 8 + j + 6]<= r_bitonic_pipe0[i * 8 + j + 4]; end else begin r_bitonic_pipe1[i * 8 + j + 4]<= r_bitonic_pipe0[i * 8 + j + 4]; r_bitonic_pipe1[i * 8 + j + 6]<= r_bitonic_pipe0[i * 8 + j + 6]; end end end end end endgenerate reg signed [15:0] r_bitonic_pipe2 [0:WIN - 1]; generate for(i = 0; i < WIN / 8; i = i + 1) begin for(j = 0; j < WIN / 8; j = j + 1) begin always@(posedge i_clk or posedge i_rst) begin if(i_rst) begin r_bitonic_pipe2[i * 8 + j * 2] <= 'd0; r_bitonic_pipe2[i * 8 + j * 2 + 1] <= 'd0; end else begin if(r_bitonic_pipe1[i * 8 + j * 2] > r_bitonic_pipe1[i * 8 + j * 2 + 1]) begin//升序 r_bitonic_pipe2[i * 8 + j * 2] <= r_bitonic_pipe1[i * 8 + j * 2+ 1]; r_bitonic_pipe2[i * 8 + j * 2 + 1] <= r_bitonic_pipe1[i * 8 + j * 2]; end else begin r_bitonic_pipe2[i * 8 + j * 2] <= r_bitonic_pipe1[i * 8 + j * 2]; r_bitonic_pipe2[i * 8 + j * 2 + 1] <= r_bitonic_pipe1[i * 8 + j * 2 + 1]; end end end always@(posedge i_clk or posedge i_rst) begin if(i_rst) begin r_bitonic_pipe2[i * 8 + j * 2 + 4] <= 'd0; r_bitonic_pipe2[i * 8 + j * 2 + 5] <= 'd0; end else begin if(r_bitonic_pipe1[i * 8 + j * 2 + 4] < r_bitonic_pipe1[i * 8 + j * 2 + 5]) begin//降序 r_bitonic_pipe2[i * 8 + j * 2 + 4] <= r_bitonic_pipe1[i * 8 + j * 2 + 5]; r_bitonic_pipe2[i * 8 + j * 2 + 5] <= r_bitonic_pipe1[i * 8 + j * 2 + 4]; end else begin r_bitonic_pipe2[i * 8 + j * 2 + 4] <= r_bitonic_pipe1[i * 8 + j * 2 + 4]; r_bitonic_pipe2[i * 8 + j * 2 + 5] <= r_bitonic_pipe1[i * 8 + j * 2 + 5]; end end end end end endgenerate reg signed [15:0] r_bitonic_pipe3 [0:WIN - 1];//间隔4 generate for(i = 0; i < WIN / 4; i = i + 1) begin always@(posedge i_clk or posedge i_rst) begin if(i_rst) begin r_bitonic_pipe3[i] <= 'd0; r_bitonic_pipe3[i + 4]<= 'd0; end else begin if(r_bitonic_pipe2[i] > r_bitonic_pipe2[i + 4]) begin//升序 r_bitonic_pipe3[i] <= r_bitonic_pipe2[i + 4]; r_bitonic_pipe3[i + 4] <= r_bitonic_pipe2[i]; end else begin r_bitonic_pipe3[i] <= r_bitonic_pipe2[i]; r_bitonic_pipe3[i + 4] <= r_bitonic_pipe2[i + 4]; end end end always@(posedge i_clk or posedge i_rst) begin if(i_rst) begin r_bitonic_pipe3[i + 8] <= 'd0; r_bitonic_pipe3[i + 12]<= 'd0; end else begin if(r_bitonic_pipe2[i + 8] < r_bitonic_pipe2[i + 12]) begin//降序 r_bitonic_pipe3[i + 8] <= r_bitonic_pipe2[i + 12]; r_bitonic_pipe3[i + 12]<= r_bitonic_pipe2[i + 8]; end else begin r_bitonic_pipe3[i + 8] <= r_bitonic_pipe2[i + 8]; r_bitonic_pipe3[i + 12]<= r_bitonic_pipe2[i + 12]; end end end end endgenerate reg signed [15:0] r_bitonic_pipe4 [0:WIN - 1];//间隔2 generate for(i = 0; i < WIN / 8; i = i + 1) begin for(j = 0; j < WIN / 8; j = j + 1) begin always@(posedge i_clk or posedge i_rst) begin if(i_rst) begin r_bitonic_pipe4[i * 4 + j] <= 'd0; r_bitonic_pipe4[i * 4 + j + 2] <= 'd0; end else begin if(r_bitonic_pipe3[i * 4 + j] > r_bitonic_pipe3[i * 4 + j + 2]) begin r_bitonic_pipe4[i * 4 + j] <= r_bitonic_pipe3[i * 4 + j + 2]; r_bitonic_pipe4[i * 4 + j + 2] <= r_bitonic_pipe3[i * 4 + j]; end else begin r_bitonic_pipe4[i * 4 + j] <= r_bitonic_pipe3[i * 4 + j]; r_bitonic_pipe4[i * 4 + j + 2] <= r_bitonic_pipe3[i * 4 + j + 2]; end end end always@(posedge i_clk or posedge i_rst) begin if(i_rst) begin r_bitonic_pipe4[i * 4 + j + 8] <= 'd0; r_bitonic_pipe4[i * 4 + j + 10] <= 'd0; end else begin if(r_bitonic_pipe3[i * 4 + j + 8] < r_bitonic_pipe3[i * 4 + j + 10]) begin r_bitonic_pipe4[i * 4 + j + 8] <= r_bitonic_pipe3[i * 4 + j + 10]; r_bitonic_pipe4[i * 4 + j + 10] <= r_bitonic_pipe3[i * 4 + j + 8]; end else begin r_bitonic_pipe4[i * 4 + j + 8] <= r_bitonic_pipe3[i * 4 + j + 8]; r_bitonic_pipe4[i * 4 + j + 10] <= r_bitonic_pipe3[i * 4 + j + 10]; end end end end end endgenerate reg signed [15:0] r_bitonic_pipe5 [0:WIN - 1];//间隔1 generate for(i = 0; i < WIN / 4; i = i + 1) begin always@(posedge i_clk or posedge i_rst) begin if(i_rst) begin r_bitonic_pipe5[i * 2] <= 'd0; r_bitonic_pipe5[i * 2 + 1] <= 'd0; end else begin if(r_bitonic_pipe4[i * 2] > r_bitonic_pipe4[i * 2 + 1]) begin r_bitonic_pipe5[i * 2] <= r_bitonic_pipe4[i * 2 + 1]; r_bitonic_pipe5[i * 2 + 1] <= r_bitonic_pipe4[i * 2]; end else begin r_bitonic_pipe5[i * 2] <= r_bitonic_pipe4[i * 2]; r_bitonic_pipe5[i * 2 + 1] <= r_bitonic_pipe4[i * 2 + 1]; end end end always@(posedge i_clk or posedge i_rst) begin if(i_rst) begin r_bitonic_pipe5[i * 2 + 8] <= 'd0; r_bitonic_pipe5[i * 2 + 9] <= 'd0; end else begin if(r_bitonic_pipe4[i * 2 + 8] < r_bitonic_pipe4[i * 2 + 9]) begin r_bitonic_pipe5[i * 2 + 8] <= r_bitonic_pipe4[i * 2 + 9]; r_bitonic_pipe5[i * 2 + 9] <= r_bitonic_pipe4[i * 2 + 8]; end else begin r_bitonic_pipe5[i * 2 + 8] <= r_bitonic_pipe4[i * 2 + 8]; r_bitonic_pipe5[i * 2 + 9] <= r_bitonic_pipe4[i * 2 + 9]; end end end end endgenerate reg signed [15:0] r_bitonic_pipe6 [0:WIN - 1];//间隔8 generate for(i = 0; i < WIN / 2; i = i + 1) begin always@(posedge i_clk or posedge i_rst) begin if(i_rst) begin r_bitonic_pipe6[i] <= 'd0; r_bitonic_pipe6[i + 8] <= 'd0; end else begin if(r_bitonic_pipe5[i] > r_bitonic_pipe5[i + 8]) begin r_bitonic_pipe6[i] <= r_bitonic_pipe5[i + 8]; r_bitonic_pipe6[i + 8] <= r_bitonic_pipe5[i]; end else begin r_bitonic_pipe6[i] <= r_bitonic_pipe5[i]; r_bitonic_pipe6[i + 8] <= r_bitonic_pipe5[i + 8]; end end end end endgenerate reg signed [15:0] r_bitonic_pipe7 [0:WIN - 1];//间隔4 generate for(i = 0; i < WIN / 8; i = i + 1) begin for(j = 0; j < WIN / 4; j = j + 1) begin always@(posedge i_clk or posedge i_rst) begin if(i_rst) begin r_bitonic_pipe7[i * 8 + j] <= 'd0; r_bitonic_pipe7[i * 8 + j + 4] <= 'd0; end else begin if(r_bitonic_pipe6[i * 8 + j] > r_bitonic_pipe6[i * 8 + j + 4]) begin r_bitonic_pipe7[i * 8 + j] <= r_bitonic_pipe6[i * 8 + j + 4]; r_bitonic_pipe7[i * 8 + j + 4] <= r_bitonic_pipe6[i * 8 + j]; end else begin r_bitonic_pipe7[i * 8 + j] <= r_bitonic_pipe6[i * 8 + j] ; r_bitonic_pipe7[i * 8 + j + 4] <= r_bitonic_pipe6[i * 8 + j + 4]; end end end end end endgenerate reg signed [15:0] r_bitonic_pipe8 [0:WIN - 1];//间隔2 generate for(i = 0; i < WIN / 4; i = i + 1) begin for(j = 0; j < WIN / 8; j = j + 1) begin always@(posedge i_clk or posedge i_rst) begin if(i_rst) begin r_bitonic_pipe8[i * 4 + j] <= 'd0; r_bitonic_pipe8[i * 4 + j + 2] <= 'd0; end else begin if(r_bitonic_pipe7[i * 4 + j] > r_bitonic_pipe7[i * 4 + j + 2]) begin r_bitonic_pipe8[i * 4 + j] <= r_bitonic_pipe7[i * 4 + j + 2]; r_bitonic_pipe8[i * 4 + j + 2] <= r_bitonic_pipe7[i * 4 + j]; end else begin r_bitonic_pipe8[i * 4 + j] <= r_bitonic_pipe7[i * 4 + j] ; r_bitonic_pipe8[i * 4 + j + 2] <= r_bitonic_pipe7[i * 4 + j + 2]; end end end end end endgenerate reg signed [15:0] r_bitonic_pipe9 [0:WIN - 1];//间隔1 generate for(i = 0; i < WIN / 2; i = i + 1) begin always@(posedge i_clk or posedge i_rst) begin if(i_rst) begin r_bitonic_pipe9[i * 2] <= 'd0; r_bitonic_pipe9[i * 2 + 1] <= 'd0; end else begin if(r_bitonic_pipe8[i * 2] > r_bitonic_pipe8[i * 2 + 1]) begin r_bitonic_pipe9[i * 2] <= r_bitonic_pipe8[i * 2 + 1]; r_bitonic_pipe9[i * 2 + 1] <= r_bitonic_pipe8[i * 2]; end else begin r_bitonic_pipe9[i * 2] <= r_bitonic_pipe8[i * 2] ; r_bitonic_pipe9[i * 2 + 1] <= r_bitonic_pipe8[i * 2 + 1]; end end end end endgenerate generate for(i = 0; i < 16; i = i + 1) begin assign o_buff[i * 16 + 15:i * 16] = r_bitonic_pipe9[i]; end endgenerate endmodule
http://www.jsqmd.com/news/651108/

相关文章:

  • 收藏!让AI不偷懒:用agent-skills提升编程效率,小白也能掌握大模型技巧
  • 生成式AI多集群协同架构实战(K8s+LLM推理+跨云策略大起底)
  • 揭秘2026奇点智能大会语音助手内核:如何用1/10算力实现99.2%离线唤醒准确率?
  • 手把手教你从全球五大CORS网免费下载GNSS观测数据(附详细FTP地址与文件命名规则)
  • CubeMX+Keil双剑合璧:手把手教你给STM32G474的CCM SRAM“搬家”(附分散加载文件详解)
  • 保姆级教程:用Python手撕S-R-S七轴机器人逆解(附完整代码与避坑指南)
  • Unity 2D智能寻路终极指南:NavMeshPlus架构解析与实战应用
  • 网盘直链下载助手:八大平台全支持,你的下载效率提升终极方案
  • GeoServer与Mapbox-GL离线矢量切片地图服务实战指南
  • 告别重复劳动:用Python+pywinauto打造你的微信个人助理(自动回复/收款/定时发消息)
  • 5分钟快速部署MinerU智能文档理解服务,搭建PDF解析系统
  • UVM验证进阶:覆盖率驱动的验证策略与收敛实践
  • 2026 纯净水设备五大厂家实力详解:国晟环保登顶,引领西北工业净水新标杆 - 深度智识库
  • 用Python和C++搞定字符串编辑距离的变种:带空格惩罚的动态规划实战
  • DPABI新手避坑指南:从DICOM到NIFTI,我的fMRI预处理血泪史(附MATLAB 2018a配置)
  • SAP账期管理核心事务代码全解析:从FI、CO到MM的实战操作指南
  • 多主题领域EI会议推荐:好中、快审、稳检索
  • 终极指南:CubiFS社区版功能请求全流程解析——从用户反馈到落地实现的完整路径
  • go-quai挖矿完全指南:从零开始成为Quai网络验证者
  • openEuler智能调度器深度评测:AI负载下的多核调度与实时响应优化
  • React Bits PixelCard 终极指南:打造像素级复古卡片动画效果
  • UniApp应用上架前必检项:除了底部安全区,这些`app-plus`配置你也可能漏掉了
  • ARM架构下虚拟化支持检测的5种实用技巧
  • 【ROS2实战笔记-7】ros2top:用看进程的方式看ROS 2节点
  • 用友U8二次开发避坑实录:我是如何用C#封装WebAPI,让Java版OA系统成功对接的
  • 还在手动敲字模数组?用PCtoLCD2002为STM32的SSD1306 OLED生成中文字库(附完整代码)
  • B站m4s视频转换终极指南:3步实现无损格式转换与永久保存
  • AlertToast源码解析:探索SwiftUI弹窗库的内部实现原理
  • Python22_httpx网络请求
  • Linux下C++内存泄漏排查实战:用Valgrind的memcheck工具保姆级教程