搜索
bottom↓
回复: 10

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

[复制链接]

出675入8汤圆

发表于 2010-1-11 10:39:02 | 显示全部楼层 |阅读模式
data_buf是我定义的是一个二维数组来当做一个存储器
reg [15:0] data_buf[0:22][0:19];

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

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

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

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

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

出675入8汤圆

 楼主| 发表于 2010-1-13 10:06:02 | 显示全部楼层
现在改成了一维,不过数组深度有点深,一次性要处理460个元素
我把二维数组改成了一维,并且把数据宽度由原来的16位改成了8位,数组的深度是460
reg [7:0] data_buf[0:460];  这样定义的整个要编译综合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[num] = data_buf[num]+1;   //要对数组执行这个操作    这里就是如果改成调用RAM这个操作将很麻烦,好像还是要用到数组,没想明白,有好的方法的请明示

出0入0汤圆

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

出675入8汤圆

 楼主| 发表于 2010-1-13 16:50:26 | 显示全部楼层
完了,小弟才疏学浅,是个菜鸟。。。正在努力学习探索中,谢谢兽哥

出675入8汤圆

 楼主| 发表于 2010-1-13 17:04:34 | 显示全部楼层
不是我不想用RAM,是因为我要执行这个操作  data_buf[num] = data_buf[num]+1;  而不是num = num+1;
而数组的下标是经过row 和col算出来的,比如说data_buf[99]可能经过运算处理后是100,而data_buf[50]可能加到了20,
。。。。。。。这下事情搞大了,原来C移植到VERILOG上并不那么简单,并不想当然啊

出0入0汤圆

发表于 2010-1-13 17:25:58 | 显示全部楼层
试试看nios2的 C2H

出0入0汤圆

发表于 2010-1-13 17:56:25 | 显示全部楼层
FPGA中就那么多资源,你要考虑你所写的代码最终映射成什么资源,比如LUT,DDF,RAM,DSP等等

出0入0汤圆

发表于 2010-1-14 05:29:23 | 显示全部楼层
所以说你这个算法太软件化,如果要移植FPGA,看来要改动的还是比较大的。实在不行要是上软核的话,又失去FPGA的意义了不是吗

出675入8汤圆

 楼主| 发表于 2010-1-14 09:32:11 | 显示全部楼层
看来兽哥也是个夜猫子,不晓得是5点半还没睡还是这么早就起来了,呵呵
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 11:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表