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

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;generatefor(i = 0; i < 16; i = i + 1) beginassign w_data_buff[i] = i_buff[i * 16 + 15:i * 16];endendgenerate/*双调排序: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];//间隔1generatefor(i = 0; i < WIN / 4; i = i + 1) beginalways@(posedge i_clk or posedge i_rst) beginif(i_rst) beginr_bitonic_pipe0[i * 4] 	<= 'd0;r_bitonic_pipe0[i * 4 + 1]<= 'd0;endelse beginif(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];endelse beginr_bitonic_pipe0[i * 4] 		<= w_data_buff[i * 4];r_bitonic_pipe0[i * 4 + 1]	<= w_data_buff[i * 4 + 1];endendendalways@(posedge i_clk or posedge i_rst) beginif(i_rst) beginr_bitonic_pipe0[i * 4 + 2]<= 'd0;r_bitonic_pipe0[i * 4 + 3]<= 'd0;endelse beginif(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];endelse beginr_bitonic_pipe0[i * 4 + 2]<= w_data_buff[i * 4 + 2];r_bitonic_pipe0[i * 4 + 3]<= w_data_buff[i * 4 + 3];endendendendendgeneratereg	signed	[15:0]	r_bitonic_pipe1	[0:WIN - 1];//间隔2generatefor(i = 0; i < WIN / 8; i = i + 1) beginfor(j = 0; j < WIN / 8; j = j + 1) beginalways@(posedge i_clk or posedge i_rst) beginif(i_rst) beginr_bitonic_pipe1[i * 8 + j] 	<= 'd0;r_bitonic_pipe1[i * 8 + j + 2]<= 'd0;endelse beginif(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];endelse beginr_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];				endendendalways@(posedge i_clk or posedge i_rst) beginif(i_rst) beginr_bitonic_pipe1[i * 8 + j + 4]<= 'd0;r_bitonic_pipe1[i * 8 + j + 6]<= 'd0;endelse beginif(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];endelse beginr_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];				endendendendendendgeneratereg	signed	[15:0]	r_bitonic_pipe2	[0:WIN - 1];generatefor(i = 0; i < WIN / 8; i = i + 1) beginfor(j = 0; j < WIN / 8; j = j + 1) beginalways@(posedge i_clk or posedge i_rst) beginif(i_rst) beginr_bitonic_pipe2[i * 8 + j * 2] 		<= 'd0;r_bitonic_pipe2[i * 8 + j * 2 + 1] 	<= 'd0;endelse beginif(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];endelse beginr_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];endendendalways@(posedge i_clk or posedge i_rst) beginif(i_rst) beginr_bitonic_pipe2[i * 8 + j * 2 + 4]	<= 'd0;r_bitonic_pipe2[i * 8 + j * 2 + 5]	<= 'd0;endelse beginif(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];endelse beginr_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];endendendendendendgeneratereg	signed	[15:0]	r_bitonic_pipe3	[0:WIN - 1];//间隔4generatefor(i = 0; i < WIN / 4; i = i + 1) beginalways@(posedge i_clk or posedge i_rst) beginif(i_rst) beginr_bitonic_pipe3[i]	<= 'd0;r_bitonic_pipe3[i + 4]<= 'd0;endelse beginif(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];endelse beginr_bitonic_pipe3[i]		<= r_bitonic_pipe2[i];r_bitonic_pipe3[i + 4]	<= r_bitonic_pipe2[i + 4];endend	endalways@(posedge i_clk or posedge i_rst) beginif(i_rst) beginr_bitonic_pipe3[i + 8] <= 'd0;r_bitonic_pipe3[i + 12]<= 'd0;endelse beginif(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];endelse beginr_bitonic_pipe3[i + 8] <= r_bitonic_pipe2[i + 8];r_bitonic_pipe3[i + 12]<= r_bitonic_pipe2[i + 12];endendendendendgeneratereg	signed	[15:0]	r_bitonic_pipe4	[0:WIN - 1];//间隔2generatefor(i = 0; i < WIN / 8; i = i + 1) beginfor(j = 0; j < WIN / 8; j = j + 1) beginalways@(posedge i_clk or posedge i_rst) beginif(i_rst) beginr_bitonic_pipe4[i * 4 + j] 		<= 'd0;r_bitonic_pipe4[i * 4 + j + 2]	<= 'd0;endelse beginif(r_bitonic_pipe3[i * 4 + j] > r_bitonic_pipe3[i * 4 + j + 2]) beginr_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];endelse beginr_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];endendendalways@(posedge i_clk or posedge i_rst) beginif(i_rst) beginr_bitonic_pipe4[i * 4 + j + 8]	<= 'd0;r_bitonic_pipe4[i * 4 + j + 10]	<= 'd0;endelse beginif(r_bitonic_pipe3[i * 4 + j + 8] < r_bitonic_pipe3[i * 4 + j + 10]) beginr_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];endelse beginr_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];endendendend		endendgeneratereg	signed	[15:0]	r_bitonic_pipe5	[0:WIN - 1];//间隔1generatefor(i = 0; i < WIN / 4; i = i + 1) beginalways@(posedge i_clk or posedge i_rst) beginif(i_rst) beginr_bitonic_pipe5[i * 2]		<= 'd0;r_bitonic_pipe5[i * 2 + 1]	<= 'd0;endelse beginif(r_bitonic_pipe4[i * 2] > r_bitonic_pipe4[i * 2 + 1]) beginr_bitonic_pipe5[i * 2]		<= r_bitonic_pipe4[i * 2 + 1];r_bitonic_pipe5[i * 2 + 1]	<= r_bitonic_pipe4[i * 2];endelse beginr_bitonic_pipe5[i * 2]		<= r_bitonic_pipe4[i * 2];r_bitonic_pipe5[i * 2 + 1]	<= r_bitonic_pipe4[i * 2 + 1];endendendalways@(posedge i_clk or posedge i_rst) beginif(i_rst) beginr_bitonic_pipe5[i * 2 + 8]	<= 'd0;r_bitonic_pipe5[i * 2 + 9]	<= 'd0;endelse beginif(r_bitonic_pipe4[i * 2 + 8] < r_bitonic_pipe4[i * 2 + 9]) beginr_bitonic_pipe5[i * 2 + 8]	<= r_bitonic_pipe4[i * 2 + 9];r_bitonic_pipe5[i * 2 + 9]	<= r_bitonic_pipe4[i * 2 + 8];endelse beginr_bitonic_pipe5[i * 2 + 8]	<= r_bitonic_pipe4[i * 2 + 8];r_bitonic_pipe5[i * 2 + 9]	<= r_bitonic_pipe4[i * 2 + 9];endendendendendgeneratereg	signed	[15:0]	r_bitonic_pipe6	[0:WIN - 1];//间隔8generatefor(i = 0; i < WIN / 2; i = i + 1) beginalways@(posedge i_clk or posedge i_rst) beginif(i_rst) beginr_bitonic_pipe6[i]		<= 'd0;r_bitonic_pipe6[i + 8]	<= 'd0;endelse beginif(r_bitonic_pipe5[i] > r_bitonic_pipe5[i + 8]) beginr_bitonic_pipe6[i]		<= r_bitonic_pipe5[i + 8];r_bitonic_pipe6[i + 8]	<= r_bitonic_pipe5[i];endelse beginr_bitonic_pipe6[i]		<= r_bitonic_pipe5[i];r_bitonic_pipe6[i + 8]	<= r_bitonic_pipe5[i + 8];endendendendendgeneratereg	signed	[15:0]	r_bitonic_pipe7	[0:WIN - 1];//间隔4generatefor(i = 0; i < WIN / 8; i = i + 1) beginfor(j = 0; j < WIN / 4; j = j + 1) beginalways@(posedge i_clk or posedge i_rst) beginif(i_rst) beginr_bitonic_pipe7[i * 8 + j]		<= 'd0;r_bitonic_pipe7[i * 8 + j + 4]	<= 'd0;endelse beginif(r_bitonic_pipe6[i * 8 + j] > r_bitonic_pipe6[i * 8 + j + 4]) beginr_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];endelse beginr_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];endendendendendendgeneratereg	signed	[15:0]	r_bitonic_pipe8	[0:WIN - 1];//间隔2generatefor(i = 0; i < WIN / 4; i = i + 1) beginfor(j = 0; j < WIN / 8; j = j + 1) beginalways@(posedge i_clk or posedge i_rst) beginif(i_rst) beginr_bitonic_pipe8[i * 4 + j]		<= 'd0;r_bitonic_pipe8[i * 4 + j + 2]	<= 'd0;endelse beginif(r_bitonic_pipe7[i * 4 + j] > r_bitonic_pipe7[i * 4 + j + 2]) beginr_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];endelse beginr_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];endendendendendendgeneratereg	signed	[15:0]	r_bitonic_pipe9	[0:WIN - 1];//间隔1generatefor(i = 0; i < WIN / 2; i = i + 1) beginalways@(posedge i_clk or posedge i_rst) beginif(i_rst) beginr_bitonic_pipe9[i * 2]		<= 'd0;r_bitonic_pipe9[i * 2 + 1]	<= 'd0;endelse beginif(r_bitonic_pipe8[i * 2] > r_bitonic_pipe8[i * 2 + 1]) beginr_bitonic_pipe9[i * 2]		<= r_bitonic_pipe8[i * 2 + 1];r_bitonic_pipe9[i * 2 + 1]	<= r_bitonic_pipe8[i * 2];endelse beginr_bitonic_pipe9[i * 2]		<= r_bitonic_pipe8[i * 2]	;r_bitonic_pipe9[i * 2 + 1]	<= r_bitonic_pipe8[i * 2 + 1];endendendendendgenerate	generatefor(i = 0; i < 16; i = i + 1) beginassign	o_buff[i * 16 + 15:i * 16] = r_bitonic_pipe9[i];endendgenerateendmodule

http://www.xdnf.cn/news/19730.html

相关文章:

  • 开源 C++ QT Widget 开发(十二)图表--环境监测表盘
  • CouponHub项目开发记录-基于责任链来进行创建优惠券模板的参数验证
  • Django get_or_create 方法详解
  • centos9 docker启动不起来,docker启动发生堵塞问题!
  • 少儿舞蹈小程序(6)打造您的“活”名片:动态展示机构实力
  • MySQL的utf8 、utf8mb3 和 utf8mb4 的区别和排序规则
  • Python 工具: Windows 带宽监控工具
  • JavaScript考核
  • Tomcat 全面指南:从目录结构到应用部署与高级配置
  • mit6.031 2023spring 软件构造 笔记 Specification
  • 【LeetCode 热题 100】1143. 最长公共子序列——(解法二)递推
  • 2025 大学生职业准备清单:从数据到财会,这些核心证书值得考
  • 【IO】多进程编程课后练习
  • 单多行文本溢出
  • Selenium核心技巧:元素定位与等待策略
  • ArkUI核心功能组件使用
  • 【线段树】3525. 求出数组的 X 值 II|2645
  • Spring 事务原理解析:AOP 的一次完美落地
  • 深度学习——基于卷积神经网络实现食物图像分类【4】(使用最优模型)
  • 广度优先搜索(BFS, Breadth-First Search)
  • 数字化转型的六大天问:你的项目为何失败
  • 数据开发工作了一年,准备跳槽,回顾一些面试常见问题,大数据面试题汇总与答案分享
  • 【3D打印】3D打印机首次使用心得
  • 2025最新“Java 面试八股文 + 各大厂的面试真题”限时开源
  • 人工智能助力流感疫苗选择:MIT 团队推出 VaxSeer 系统
  • Understanding the Flap T in American English
  • 开源企业级快速开发平台(JeecgBoot)
  • Python闭包机制:原理、应用与安全防护
  • 【Doris入门】Doris数据表模型:聚合模型(Aggregate Key Model)详解
  • java-设计模式-4-创建型模式-工厂