在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3641|回复: 7

[原创] Verilog:挑出一个数组中的非零数据并按原顺序排列

[复制链接]
发表于 2020-11-23 14:39:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
挑出一个数组中的非零数据并按原顺序排列,要求使用组合逻辑在一个周期内实现,例:一个数组input wire[7:0]array[0:7]=[0,1,0,3,0,5,0,7],得到[7:0]new_array[0:7]=[1,3,5,7,0,0,0,0]。常规操作,首先得到原始数组的对应非零数据的下标(如:indix[i]),再对原始数组进行取数存到另一个新数组(如:new_array[j]=array[indix[i]])。
问题1:怎么实现?generate-for方法?
问题2:更好的实现方法?



 楼主| 发表于 2020-11-24 12:57:35 | 显示全部楼层
挑出一个数组中的非零数据并按原顺序排列
发表于 2020-11-25 00:48:02 | 显示全部楼层
提供一个思路,尚未编译,仅供参考。



  1. module ARRAY_SORT #(
  2.         parameter W = 8,
  3.         parameter N = 8
  4. )(
  5.         input  wire                clk      ,// Clk
  6.         input  wire [N-1:0][W-1:0] array    ,// Packed Array
  7.         output reg  [N-1:0][W-1:0] array_new // Packed Array
  8. );

  9. localparam CNT_W = $clog2(N);

  10. //==================================================================
  11. wire [N-1:0] nonzero_sts;
  12. generate
  13.         genvar i;
  14.         for (i=0; i<N; i=i+1) begin : GEN_NONZERO_STS
  15.                 assign nonzero_sts[i] = |array[i];
  16.         end
  17. endgenerate

  18. //==================================================================
  19. wire [N-1:0][CNT_W:0] location_ptr;
  20. assign location_ptr[0] = nonzero_sts[0];
  21. generate
  22.         genvar j;
  23.         for (j=1; j<N; j=j+1) begin : GEN_LOCATION_PTR
  24.                 assign location_ptr[j] = location_ptr[j-1] + nonzero_sts[j];
  25.         end
  26. endgenerate

  27. //==================================================================
  28. generate
  29.         genvar k;
  30.         for (k=0; k<N; k=k+1) begin : GEN_ARRAY_NEW
  31.                 always @(posedge clk) begin
  32.                         if (nonzero_sts[k]) array_new[location_ptr[k]-1] <= array[k];
  33.                 end
  34.         end
  35. endgenerate

  36. //==================================================================
  37. endmodule


复制代码


 楼主| 发表于 2020-11-25 15:17:16 | 显示全部楼层


IC.Michael 发表于 2020-11-25 00:48
提供一个思路,尚未编译,仅供参考。


非常感谢,看来只能从原数组或新数组的下标入手,通过下标转换解决。
发表于 2020-11-25 22:06:34 | 显示全部楼层


IC.Michael 发表于 2020-11-25 00:48
提供一个思路,尚未编译,仅供参考。


厉害厉害!
 楼主| 发表于 2020-12-18 18:37:24 | 显示全部楼层
还有其他方法吗?各位小朋友
发表于 2020-12-22 21:33:29 | 显示全部楼层
看你想用多大的面积来做了。譬如上面的例子,八路输入八路输出。每路输出都来自一个八路复用器。每个复用器的输入就是前面的八路,选择控制则是来自一个译码器。译码器的输入是原八路输入的投射(非零为1,零为0,这样得到一个八位数,然后去译码),译码器的逻辑用真值表自己画个卡诺图很快出来了。大致思路如此。
发表于 2024-3-26 13:48:23 | 显示全部楼层


IC.Michael 发表于 2020-11-25 00:48
提供一个思路,尚未编译,仅供参考。


由于 每个元素的 array_new 都在不同的 always 块中赋值,这可能会导致多个 always 块同时尝试驱动 array_new ,从而引发多驱动问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-28 12:34 , Processed in 0.023596 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表