xml2028 发表于 2010-1-11 10:39:02

请求高手指点:在VERILOG中使用二维数组出现的问题

data_buf是我定义的是一个二维数组来当做一个存储器
reg data_buf;

我需要用到这个二维数组来存储我采集的数据,因为原来在ARM中数据是按照行和列的关系存储的,我用VERILOG想移植到FPGA上,

如果这样用的话,编译器要出现一个info
Info (10008): Verilog HDL or VHDL information: EDA Netlist Writer cannot regroup multidimensional array "data_buf" into its bus   

结果 兽哥 说不行,能否详细说明下?

我在网上查到 :支持多维数组,但是超过2维的,在使用时不能用变量查询
是这样的吗?

ngzhang 发表于 2010-1-12 20:18:51

呃,我是说最好不要这样用。
写verilog的时候要时刻注意不是在写C。如果是类似于 reg data_buf这样的话,可以想象对应的硬件是一块ram,有对应的地址线和数据线。但是再增加1维,那你说综合器会将reg data_buf综合成怎样的一个硬件电路呢?我的意思是,类似情况最好能够理清你的想法,从硬件的角度出发来写这段代码,对综合出的电路有相应的预期。

xml2028 发表于 2010-1-13 10:06:02

现在改成了一维,不过数组深度有点深,一次性要处理460个元素
我把二维数组改成了一维,并且把数据宽度由原来的16位改成了8位,数组的深度是460
reg data_buf;这样定义的整个要编译综合20分钟,改成200的深度的话勉强还能通过,要8分钟,是不是我定义的数组深度太深了?不过一次确实要存储这么多的数据,有网友建议我用RAM,但是我存入的这些数据并不是顺序存入的,可能还要对某些数据进行一些处理,比如
if(dd > 800)
          row = 22;                //二维数组 行 的下标                                       
else if(dd > 200)
        row = dd * 2/100 + 6;                               
else if(dd > 5)
        row = dd * 4/100 + 2;                                                                       
else
        row = dd * 8/100 ;               
                                       
if(v > 1000)
        col = 19;               //二维数组 列的下标                                   
else if(v > 900)
        col = 18;                                                                    
else if(v > 340)
        col = (v * 125 + 675)/100;                           
else if(v > 1)
        col = (v * 250 + 250)/100;                                               
else
         col = v * 5/100 ;                                                                                       
                               
num = row*20 +col;               //转化为一维数组 的下标
        data_buf = data_buf+1;   //要对数组执行这个操作    这里就是如果改成调用RAM这个操作将很麻烦,好像还是要用到数组,没想明白,有好的方法的请明示

ngzhang 发表于 2010-1-13 16:11:04

461个字节的存储,建议使用BRAM来实现。用触发器或者分布式ram实现,过于浪费资源。
用BRAM来实现,也是有地址线和数据线的,地址线给出地址,read信号给出以后,下一个上升沿就能从数据输出端口取数了。
另外看你的算法,莫非要算/100这样的除法?verilog无法综合非2的幂的除法的哦。

xml2028 发表于 2010-1-13 16:50:26

完了,小弟才疏学浅,是个菜鸟。。。正在努力学习探索中,谢谢兽哥

xml2028 发表于 2010-1-13 17:04:34

不是我不想用RAM,是因为我要执行这个操作data_buf = data_buf+1;而不是num = num+1;
而数组的下标是经过row 和col算出来的,比如说data_buf可能经过运算处理后是100,而data_buf可能加到了20,
。。。。。。。这下事情搞大了,原来C移植到VERILOG上并不那么简单,并不想当然啊

chopin1998 发表于 2010-1-13 17:25:58

试试看nios2的 C2H

atomdust 发表于 2010-1-13 17:56:25

FPGA中就那么多资源,你要考虑你所写的代码最终映射成什么资源,比如LUT,DDF,RAM,DSP等等

ngzhang 发表于 2010-1-14 05:29:23

所以说你这个算法太软件化,如果要移植FPGA,看来要改动的还是比较大的。实在不行要是上软核的话,又失去FPGA的意义了不是吗

xml2028 发表于 2010-1-14 09:32:11

看来兽哥也是个夜猫子,不晓得是5点半还没睡还是这么早就起来了,呵呵
页: [1]
查看完整版本: 请求高手指点:在VERILOG中使用二维数组出现的问题