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

【FPGA】for循环求取二进制1的个数的方法与差别

测试二进制值

reg [15 : 0] data_test;initial begindata_test = 16'b1100_0011_0101_1010;repeat (90) @(posedge clk);data_test = 16'b0100_0000_1011_1000;
end

方法一:

数组类型,在always块中用非阻塞式赋值语句

reg  [4 : 0]  bit_cnt [15 : 0];
always @(posedge clk) begin : bit_cnt_blockinteger i;if (!rst_n) beginfor (i = 0 ; i < 16 ; i = i + 1)bit_cnt[i] <= 5'd0;endelse beginfor (i = 0 ; i < 16 ; i = i + 1) beginif (i == 0)bit_cnt[i] <= data_test[i];else bit_cnt[i] <= bit_cnt[i - 1] + data_test[i];endend
end
wire [4 : 0] w_bit_cnt [15 : 0];
genvar i1;
generate for (i1 = 0 ; i1 < 16 ; i1 = i1 + 1)assign w_bit_cnt[i1] = bit_cnt[i1];
endgenerate

测试结果

每一个时钟周期计算一位,需要16个时钟周期才能计算完成,数组类型可以看到运算过程。运算正确✔

方法二:

数组类型,在always块中用阻塞式赋值语句

reg  [4 : 0]  bit_cnt1 [15 : 0];
always @(posedge clk) begin : bit_cnt_block1integer i;if (!rst_n) beginfor (i = 0 ; i < 16 ; i = i + 1)bit_cnt1[i] = 5'd0;endelse beginfor (i = 0 ; i < 16 ; i = i + 1) beginif (i == 0)bit_cnt1[i] = data_test[i];else bit_cnt1[i] = bit_cnt1[i - 1] + data_test[i];endend
end
wire [4 : 0] w_bit_cnt1 [15 : 0];
genvar i2;
generate for (i2 = 0 ; i2 < 16 ; i2 = i2 + 1)assign w_bit_cnt1[i2] = bit_cnt1[i2];
endgenerate

测试结果

一个时钟周期内即可计算完成,数组类型可以看到运算过程。运算正确✔

方法三:

单寄存器类型,always块中用非阻塞式赋值语句

reg     [4 : 0] bit_cnt2;
always @(posedge clk) begin : bit_cnt_block2integer i;if (!rst_n)bit_cnt2 <= 5'd0;else beginfor (i = 0 ; i < 16 ; i = i + 1)bit_cnt2 <= bit_cnt2 + data_test[i];end
end

测试结果

由于是非阻塞式赋值语句,所以把for循环展开,其实只执行最后一次循环体,也就是每次累加第16位的值(data_test[15]),所以这个结果是错误的❌。绝对不能这样使用!

方法四:

单寄存器类型,always块中用阻塞式赋值语句

reg     [4 : 0] bit_cnt3;
always @(posedge clk) begin : bit_cnt_block3integer i;if (!rst_n)bit_cnt3 = 5'd0;else beginbit_cnt3 = 'd0;for (i = 0 ; i < 16 ; i = i + 1)bit_cnt3 = bit_cnt3 + data_test[i];end
end

测试结果

一个时钟周期内即可计算完成,由于是单寄存器,所以只能获得最后的求和结果,看不到中间过程。运算正确✔。

方法二、四对比:

完整tb代码

reg [15 : 0] data_test;initial begindata_test = 16'b1100_0011_0101_1010;repeat (90) @(posedge clk);data_test = 16'b0100_0000_1011_1000;
endreg  [4 : 0]  bit_cnt [15 : 0];
always @(posedge clk) begin : bit_cnt_blockinteger i;if (!rst_n) beginfor (i = 0 ; i < 16 ; i = i + 1)bit_cnt[i] <= 5'd0;endelse beginfor (i = 0 ; i < 16 ; i = i + 1) beginif (i == 0)bit_cnt[i] <= data_test[i];else bit_cnt[i] <= bit_cnt[i - 1] + data_test[i];endend
end
wire [4 : 0] w_bit_cnt [15 : 0];
genvar i1;
generate for (i1 = 0 ; i1 < 16 ; i1 = i1 + 1)assign w_bit_cnt[i1] = bit_cnt[i1];
endgeneratereg  [4 : 0]  bit_cnt1 [15 : 0];
always @(posedge clk) begin : bit_cnt_block1integer i;if (!rst_n) beginfor (i = 0 ; i < 16 ; i = i + 1)bit_cnt1[i] = 5'd0;endelse beginfor (i = 0 ; i < 16 ; i = i + 1) beginif (i == 0)bit_cnt1[i] = data_test[i];else bit_cnt1[i] = bit_cnt1[i - 1] + data_test[i];endend
end
wire [4 : 0] w_bit_cnt1 [15 : 0];
genvar i2;
generate for (i2 = 0 ; i2 < 16 ; i2 = i2 + 1)assign w_bit_cnt1[i2] = bit_cnt1[i2];
endgeneratereg     [4 : 0] bit_cnt2;
always @(posedge clk) begin : bit_cnt_block2integer i;if (!rst_n)bit_cnt2 <= 5'd0;else beginfor (i = 0 ; i < 16 ; i = i + 1)bit_cnt2 <= bit_cnt2 + data_test[i];end
endreg     [4 : 0] bit_cnt3;
always @(posedge clk) begin : bit_cnt_block3integer i;if (!rst_n)bit_cnt3 = 5'd0;else beginbit_cnt3 = 'd0;for (i = 0 ; i < 16 ; i = i + 1)bit_cnt3 = bit_cnt3 + data_test[i];end
end

http://www.dtcms.com/a/593534.html

相关文章:

  • 三亚网站推广团队wordpress做大站好吗
  • 购物网站建设和使用集团网站定制
  • 基于DIC技术的汽车用超高强度双相钢(DP钢)拉伸变形全场应变分布精确分析
  • YOLOv5(四):models/yolo.py
  • SpringBoot~
  • 如何配置Dev-C++的bin目录到系统环境变量中?
  • 如何在Excel实现类似SQL的Where查找功能
  • 整体设计 全面梳理复盘之30 Transformer 九宫格三层架构 Designer 全部功能定稿(初稿)之2
  • 云南省建设厅官方网站两学一做是什么网站
  • 郑州房地产网站奇米网怎么做网站
  • 500+带交互的元件库:Axure原型设计的活字典
  • 11月10工单通重大更新:工艺路线、生产管理等多模块 BUG 修复 + 报表优化,体验再升级!
  • 实用教程:打造支持参数配置的 Git Bash 文件清理脚本
  • 长短期记忆网络(LSTM)入门
  • 图——关键路径
  • 中国建设银行广西分行网站首页24小时在线观看
  • wordpress 下载网站加盟网站推广
  • Pycharm社区版安装
  • 每日算法(1)
  • 基于PLC的多级传送带控制与改造
  • 网站建设案例知名 乐云践新广州市专业网站设计
  • 数字货币众筹网站开发创意设计公司官网
  • requst payload和query string parameters
  • Web网页之前端三剑客汇总篇(基础版)
  • 【AI学习-comfyUI学习-简易加载器抠图工作流(替换抠图节点版)-各个部分学习-第七节】
  • Linux中自定义服务开机自启nginx
  • 【Linux】snakemake应用之扩增子分析流程
  • 可以做哪些网站有哪些内容给别人做的网站要复杂做安全扫描
  • vue中回显word、Excel、txt、markdown文件
  • [吾爱大神原创] 自用 图片叠加 批量图片转PDF工具 [牛马工具]