微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 新手求助,请问累加操作,如何用生成块实现?

新手求助,请问累加操作,如何用生成块实现?

时间:10-02 整理:3721RD 点击:

一下是我的代码的一部分:
generate for (i=1; i<10; i=i+1)
       MyUnit abc1(c, a, b);   // c=a*b
endgenerate
assign sum=c[1]+c[2]+c[3]+c[4]+c[5]....+c[10];   //如果用matlab就是累加了sum=0;  for i=1:10 ;  sum=sum+c; 这样,但是用verilog我就不会了——!//
always @(posedge clk)
    ......
    for(j=1; j<10; j=j+1)
         begin
           a[j]=........;
           b[j]=........;
         end
...................
因为我已经在always里面用for并行地实现了a和b的计算,同时用generate语句并行地实现了c的计算,所以c也是并行计算出来的。
但是最终需要c的累加: c[1]+c[2]+....c[10].
我想过用always来迭代着算c的累加,但是这个累加一定要在clk的一个周期内完成,也就是说累加c时用的是最快的时钟,而上例中的always @(clk)要用慢10倍的时钟。(小弟对数字电路的时序控制,和时钟分配不怎么懂,请问大侠们面对类似问题时是如何处理的呢?)
以上迭代累加貌似是主流的设计方法,但是因为我没有信心实现好时钟分配,就用了assign 直接算了(总感觉用wire心里没底,但是仿真结果是对的)。但是,因为目前只有10个数相加,我可以assign sum=++++++, 但是假如有100个数呢?用generate可以完成这种累加吗?(也可能assign本身也不是个好主意。)
谢谢各位大侠了。

“这个累加一定要在clk的一个周期内完成”?我劝你不要这样固执,对于n个数相加,需采用并行结构,每个加法器最好不要多于4~6个输入,输出给register,能在log2(n)个周期内完成,软件算法转换为硬件实现不是那么容易的
reg sum;
reg c11,c22,c99,c1010;
always@(posedge clk)
begin
c11 <= c1 + c2 + c3 + c4;
c22 <= c5 + c6 + c7 + c8;
c99 <= c9;
c1010 <= c10;
sum <= c11 + c22 + c99 + c1010;
end
2个周期完成,很丑陋吧?但这就是verilog,这就是硬件

累加?这里貌似不是累加的意思,就是一个加法而已。小编的表达也要问题,你的需求和解决方法,自己的考虑等等都混杂在一起说,一点层次都没有。

如果想硬件综合的话,不要在always中加入for语句。


谢谢大侠指点。
从你的例子中学到不少东西。
我本想: 每一个clk周期并行地算出c[1]到c[100], 所以如果用多个clk周期来完成这些c[1]到c[100]的相加的话,计算结果就错了。
所以我还是得放慢更新c的频率才行吧。如果和您的这个例子联系起来,10个数相加的话,c的更新频率就减小一半对吧?
如果是100个数相加,每个加法操作4个数,那么第一个周期得到25个和,第二个周期得到7个和,第三个周期得到2个和,第四个周期是2个数相加,对吗?
我太笨了,不知道这么理解对不对,以后的选专业课上上,请高手们不吝拍砖。


多谢回复。
我之前总是想用软件的思考方式,for循环里sum=sum+c这么做。
请问你认为累加的定义是什么?以后我好问出有层次的问题。


always里用for不能被综合吗?我初学者, 用的是Verilog HDL数字设计与综合(第二版)14.3节讲的是综合问题, always 和 循环都是可综合的啊?不太懂,请大侠指点,谢谢

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top