求助,怎么用代码实现“前向拼接”
时间:10-02
整理:3721RD
点击:
前向拼接符号(//),我举个例子:已知数据每个时钟上升沿输入一个数据(数据总数未知):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:
但是在综合的时候报错:Most significant bit operand in part-select of vector reg 'out' is illegal,也就是说部分选择赋值是不行的;
然后我就想不出办法了,求高人指点。
每个时钟都对其拼,接也就是:
第一次:temp = 0000 0000 0000 0101 1001
第二次:temp = 1110
0000 0000 0000 0101 就不对了,你说呢。
我要实现当所有数据输入完之后得到: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:
- for( cnt=0;cnt<n;cnt=cnt+1 )
- out[ cnt*8+7:0+cnt ] = ram[cnt];
但是在综合的时候报错:Most significant bit operand in part-select of vector reg 'out' is illegal,也就是说部分选择赋值是不行的;
然后我就想不出办法了,求高人指点。
你这种想法是不可综合的,HDL是硬件描述语言,你想拼接不固定位宽的数据,必须定义一个最大位宽保证所有应用情况,硬件不存在动态分配寄存器这个说法。
按照第一种做法就定义最大位宽就行了
按照第二种做法是语法错误,向量是不支持用变量来选择某些bit的,for循环建议不要使用,绝大部分都是不可综合的
你说的我大部分都能理解,但是在第一种方法中定义最大位宽也行不通啊。比如我已知最大位宽是20,我就定义:
- reg [19:0] temp
每个时钟都对其拼,接也就是:
- temp = {a2,a1}
第一次:temp = 0000 0000 0000 0101 1001
第二次:temp = 1110
0000 0000 0000 0101 就不对了,你说呢。
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]};
你给的代码不错,我试了,可以。就是reg[n-1:0] out_nxt应该改成wire[n-1:0] out_nxt,
