verilog二维数组赋值更新问题

reg [16*8-1:0]D_x; //一大串个16位的数据,8个连续的样本全放在这个寄存器中
always @ (posedge clk or rst_n)
if(!rst_n)
D_x <= 0;
else
D_x <= { D_x[16*7-1:16] , Xi};//舍去高16位,低16位由新数据补齐

genevar i;
reg [15:0]data_x[0:7];//8个16位的数组

generate
for(i=0;i<8;i=i+1)]
always @ (posedge clk or rst_n)
begin:data_to_memory
if(!rst_n)
data_x[i] <= 0;
esle
data_x[i] <= D_x[16*(i+1)-1 :[16*(i+1) ]; //把D_x分成8段,每段存到数组data_x的一个单元
end
endgenerate

以上代码没错,仿真的时候前8个数据都存到了数组中,关键是之后的数据这个数组就不更新了 求解
data_x[i] <= D_x[16*(i+1)-1 :[16*i ]; //把D_x分成8段,每段存到数组data_x的一个单元

这后面确实写错了

不过这个问题被我解决了,借了一个是时钟信号把这个数组复位

for语句在verilog还是用的呢 尤其是在generate语句里面

把移位代码改成:D_x <= { D_x[16*7-1:0] , Xi}; //舍去高16位,低16位由新数据补齐
这句也要改成: data_x[j] <= D_x[16*(j+1)-1:16*j]; //把D_x分成8段,每段存到数组data_x的一个单元

另外,代码里还有一些错误,不知道如何仿真通过的。
代码改了一下。以下的代码我是仿真过了的,

always @ (posedge clk or rst_n)
if(!rst_n)
D_x <= 0;
else
//D_x <= { D_x[16*7-1:16] , Xi}; //舍去高16位,低16位由新数据补齐
D_x <= { D_x[16*7-1:0] , Xi}; //舍去高16位,低16位由新数据补齐

genvar j;
reg [15:0]data_x[0:7];//8个16位的数组
generate for(j=0;j<8;j=j+1)
always @ (posedge clk or rst_n)
begin:data_to_memory
if(!rst_n)
data_x[j] <= 0;
else
data_x[j] <= D_x[16*(j+1)-1:16*j]; //把D_x分成8段,每段存到数组data_x的一个单元
end
endgenerate
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-03-30
data_x[i] <= D_x[16*(i+1)-1 :[16*(i+1) ]; 看起来不对啊 多1个括号不说 右边的位宽只有2啊 这样其它位就被舍弃了 应该是16*(i+1)-1 :16*(i)
二维变量和一维变量的赋值没有任何区别 应该看看D_x是否有变化

很简单的一个试验是 让D_x自加 这样可以看到每当一个时钟沿 data_x[i]至少有一个有变化追问

对 我写错了 是16*(i+1)-1 :16*(i)的
这个问题别我解决了 借了个时钟吧memory复位了一下,意思就是数组要刷新

本回答被网友采纳
第2个回答  2014-03-31
后面数据的时候i一直都没有变化了吧,for语句综合不了一般很少用,不知道说的对不对。追问

你说的不对 for在generate里面跟always外面的情况还是用的比较多

for跟if语句如果直接用在always外面的的话,那会条件编译,里面的判断条件不能使reg或者是wire,一定要是 常量

相似回答