微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > verilog中关于并行传输的问题

verilog中关于并行传输的问题

时间:10-02 整理:3721RD 点击:
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];
....
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之类的脚本自动生成代码嘛,虽然最后代码比较长,但是结构是很清晰的。


哦,我懂了,多谢你的耐心回答,祝圣诞快乐

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top