verilog中关于并行传输的问题
input[7:0] data_in;
output[7:0] data_out;
reg[7:0] data[15:0];
....
always@(posedge clk or posedge reset)
if(reset)
..
else begin
data_out<=data[0];
data[14:0]<=data[15:1];
data[15]<=data_in;
end
...
endmodule
其中
data[14:0]<=data[15:1];
有错,错误提示如下:illegal part select of unpacked array “data”
各位大侠,帮忙看看,我不知道有什么错,帮帮我,谢谢了
问题出在reg[7:0] data[15:0];这句吧,定义了8个字,每个字位宽为16.在verilog中,只能直接访问字,而不能直接访问一个字的位。如果要访问,先把这个字取出来好了,然后再访问好啦
谢谢wys093
明白了,在verilog中data[15:0],是指data的低16位,即使有
reg[7:0] data[15:0],
data[15:0]也还是表示低16位,并不是data的16个8位的寄存器
首先:要注意你写代码的风格,代码写的要美观些。
其次:就是你的代码写的是有问题,是寄存器的定义没有搞清楚。
最后:也没有见到你这样写代码的,一般写的直接用多个寄存器来打拍实现。
见下面的代码:
module aaa(/*autoarg*/
//Inputs
clk,
reset,
data_in,
//Outputs
data_out
);
//===================== Parameter Declaration ===================
//===================== Port Declaration ===================
input clk; //
input reset; //
input [7:0] data_in; //
output [7:0] data_out; //
//===================== Register Declaration ===================
reg [7:0] data; //
reg [7:0] data_r1; //
...
reg [7:0] data_r15; //
//===================== Entity Logic ===================
....
always@(posedge clk or posedge reset)
if(reset)
...
else
begin
data_out <= data_r15;
data_r15 <= data_r14;
data_r14 <= data_r13;
...
data_r1 <= data;
data <= data_in;
end
...
endmodule// end of the module aaa
好像有一点点失误的地方:
reg[ 7: 0] data[15: 0] ;
这一句是指定了定义了16个字节吧。
啊,记得的确有错误,谢谢提醒啊
请问一下:如果是512个寄存器该怎么写,总不能都写出来吧,有没有什么办法
你好,请问,要是定义这样的存储器:reg[2:0]fifomem[0:511] 应该怎么实现,谢谢
讲的很对
module(clk,reset,data_in,data_out);input clk,reset;
input[7:0] data_in;
output[7:0] data_out;
reg[7:0] data[15:0];
....
integer i;
always@(posedge clk or posedge reset)
if(reset)
..
else begin
data_out<=data[0];
for(i=0; i<15; i=i+1)
data [ i ] <= data[i+1];
data[15]<=data_in;
end
...
endmodule
这样的写法在VERILOG2001是可以合成的,但是极其不推荐这样的写法,有时候FOR搞多了电路结构具体是什么样子你心里没有底,不管多少,还是建议一个一个的写,太多没有关系,你还是可以用perl之类的脚本自动生成代码嘛,虽然最后代码比较长,但是结构是很清晰的。
哦,我懂了,多谢你的耐心回答,祝圣诞快乐
