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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 6297|回复: 4

[求助] 求助,怎么用代码实现“前向拼接”

[复制链接]
发表于 2011-7-31 16:04:47 | 显示全部楼层 |阅读模式

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

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

x
前向拼接符号(//),我举个例子:已知数据每个时钟上升沿输入一个数据(数据总数未知):a1=1001,a2=0101,a3=1110,a4=1101,( a5=………………,an=0001
我要实现当所有数据输入完之后得到:val = a1//a2//a3//a4//a5…… //an = 0001 …… 1101 1110 0101 1001,并且将val输出,用verilog怎么实现呢?


我曾想过使用位拼接运算符{},每来一个数据就拼接一下用寄存器temp = {a2,a1}……保存,但是每次拼接后temp的位宽都是在变化的,我不能提前声明temp的位宽,不声明位宽又不能通过综合器的综合;所以这条路走不通;


我又打算用memory型的寄存器(比如:reg[3:0] ram[100:0])把数据先全部存下来,因为memory型的寄存器不能作输出,所以我又用for循环一口气将ram的数据按照一定的顺序赋值给输出端口的寄存器out:




  1. for( cnt=0;cnt<n;cnt=cnt+1 )
  2.         out[ cnt*8+7:0+cnt ] = ram[cnt];


复制代码


但是在综合的时候报错:Most significant bit operand in part-select of vector reg 'out' is illegal,也就是说部分选择赋值是不行的;


然后我就想不出办法了,求高人指点。
发表于 2011-7-31 16:42:55 | 显示全部楼层
你这种想法是不可综合的,HDL是硬件描述语言,你想拼接不固定位宽的数据,必须定义一个最大位宽保证所有应用情况,硬件不存在动态分配寄存器这个说法。
按照第一种做法就定义最大位宽就行了
按照第二种做法是语法错误,向量是不支持用变量来选择某些bit的,for循环建议不要使用,绝大部分都是不可综合的
 楼主| 发表于 2011-7-31 17:42:01 | 显示全部楼层
回复 2# warmheard

你说的我大部分都能理解,但是在第一种方法中定义最大位宽也行不通啊。比如我已知最大位宽是20,我就定义:



  1. reg [19:0] temp


复制代码

每个时钟都对其拼,接也就是:



  1. temp = {a2,a1}


复制代码
,以此类推啦。

第一次:temp = 0000 0000 0000 0101 1001
第二次:temp = 1110
0000 0000 0000 0101 就不对了,你说呢。
发表于 2011-7-31 18:12:00 | 显示全部楼层
input [3:0] data_in;
reg[n-1:0] out;
reg[n-1:0] out_nxt;
assign out_nxt=out>>4;
always @(posedge clk)
out<={data_in,out_nxt[n-1-4:0]};
 楼主| 发表于 2011-8-1 09:52:49 | 显示全部楼层




   你给的代码不错,我试了,可以。就是reg[n-1:0] out_nxt应该改成wire[n-1:0] out_nxt,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-12-23 14:00 , Processed in 0.021667 second(s), 9 queries , Gzip On, Redis On.

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