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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 5891|回复: 10

[求助] verilog中关于并行传输的问题

[复制链接]
发表于 2011-6-4 11:14:51 | 显示全部楼层 |阅读模式

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

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

x
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”

各位大侠,帮忙看看,我不知道有什么错,帮帮我,谢谢了
发表于 2011-6-4 11:45:30 | 显示全部楼层
问题出在reg[7:0] data[15:0];这句吧,定义了8个字,每个字位宽为16.在verilog中,只能直接访问字,而不能直接访问一个字的位。如果要访问,先把这个字取出来好了,然后再访问好啦
 楼主| 发表于 2011-6-4 12:55:51 | 显示全部楼层
回复 2# wys093

谢谢wys093
明白了,在verilog中data[15:0],是指data的低16位,即使有
reg[7:0] data[15:0],
data[15:0]也还是表示低16位,并不是data的16个8位的寄存器
发表于 2011-6-4 14:28:18 | 显示全部楼层
本帖最后由 alexander21th 于 2011-6-4 14:34 编辑

首先:要注意你写代码的风格,代码写的要美观些。
其次:就是你的代码写的是有问题,是寄存器的定义没有搞清楚。
最后:也没有见到你这样写代码的,一般写的直接用多个寄存器来打拍实现。

见下面的代码:

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
发表于 2011-6-4 17:39:05 | 显示全部楼层




    好像有一点点失误的地方:

  reg[ 7: 0] data[15: 0] ;

  这一句是指定了定义了16个字节吧。
发表于 2011-6-4 21:30:23 | 显示全部楼层
回复 5# dlb05061131


    啊,记得的确有错误,谢谢提醒啊
发表于 2011-12-22 15:17:41 | 显示全部楼层
回复 3# chen5135053


   请问一下:如果是512个寄存器该怎么写,总不能都写出来吧,有没有什么办法
发表于 2011-12-22 15:34:26 | 显示全部楼层
回复 4# alexander21th


      你好,请问,要是定义这样的存储器:reg[2:0]fifomem[0:511]    应该怎么实现,谢谢
发表于 2011-12-23 16:17:46 | 显示全部楼层
讲的很对
发表于 2011-12-23 17:34:22 | 显示全部楼层
本帖最后由 vongy 于 2011-12-24 11:57 编辑


回复  alexander21th


      你好,请问,要是定义这样的存储器:reg[2:0]fifomem[0:511]    应该怎么 ...
songchao236 发表于 2011-12-22 15:34



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之类的脚本自动生成代码嘛,虽然最后代码比较长,但是结构是很清晰的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-5-22 07:30 , Processed in 0.034867 second(s), 8 queries , Gzip On, Redis On.

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