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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 7108|回复: 13

[求助] Verilog 中关于`define的问题求助

[复制链接]
发表于 2012-3-9 17:31:39 | 显示全部楼层 |阅读模式

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

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

x
以下是未定义宏的右移代码:
reg  [15:0]  data;
always @(posedge clk or posedge reset)
  begin
     if(reset)
          data<=  16'h8000;
     else
          data<= {1‘b0,data[15:1]};
  end
定义了位宽的宏之后
`define   DATAWIDTH  16reg  [`DATAWIDTH-1 : 0]  data;
always @(posedge clk or posedge reset)
  begin
     if(reset)
          data <=  {1'b1,`DATAWIDTH-1'b0};   
     else
          data <= {1’b0,data [`DATAWIDTH-1 : 1] };
  end
//data <=  {1'b1,`DATAWIDTH-1'b0};  编译器把它自动remove了,为什么?
//这样编译无语法错误,但结果却不对,改如何写这个表达式?
//这段代码引用DATAWIDTH宏的目的,就是使data的位宽可随意修改,每次reset的时候使其最高位为1,其余各位为0,改如何写?
发表于 2012-3-9 21:22:52 | 显示全部楼层
data <=  {1'b1,`DATAWIDTH-1'b0}??????data <=  {1'b1,(`DATAWIDTH-1)'b0}?????
发表于 2012-3-9 22:08:43 | 显示全部楼层
哎,怎么感觉你这个明显有问题啊。 DATA没有初始化 ,data赋值左右位数不一样
 楼主| 发表于 2012-3-10 13:38:27 | 显示全部楼层
回复 2# cdsmakc


   data <=  {1'b1,`DATAWIDTH-1'b0}报警告,data寄存器被Remove了,   data <=  {1'b1,(`DATAWIDTH-1)'b0} 语法通不过
 楼主| 发表于 2012-3-10 13:44:42 | 显示全部楼层



我想实现以下功能
   reg  [15:0]  data;
always @(posedge clk or posedge reset)
  begin
     if(reset)
          data<=  16'h8000;
     else
          data<= {1‘b0,data[15:1]};
  end
定义了位宽的宏之后不知道该怎么写表达式
`define   DATAWIDTH  16reg  [`DATAWIDTH-1 : 0]  data;
always @(posedge clk or posedge reset)
  begin
     if(reset)
          data <=  {1'b1,`DATAWIDTH-1'b0};   //编译器删掉了这个reg,          data<=   {1'b1,(`DATAWIDTH-1)'b0}; //语法通不过,
          //我就是想求教这里该怎么写?
     else
          data <= {1’b0,data [`DATAWIDTH-1 : 1] };
  end
发表于 2012-3-10 16:24:46 | 显示全部楼层
试一试:
data <=  {1'b1,(`DATAWIDTH-1){1'b0}};
发表于 2012-3-10 18:48:10 | 显示全部楼层
两个建议:
1。 `define NEW_WIDTH = (`DATA_WIDTH - 1), 然后再用,否则有点糊涂
2。可以考虑把右移改成左移,这样你在初始化的时候可以用data <=  `DATAWIDTH‘b1;
 楼主| 发表于 2012-3-12 12:18:13 | 显示全部楼层




   data <=  {1'b1,(`DATAWIDTH-1){1'b0}};   的写法用synplify做FPGA综合没有报错,但是NC_verilog和synopsys综合都报错,
 楼主| 发表于 2012-3-12 13:34:19 | 显示全部楼层
这个问题我最终把一行代码拆成两行解决的
`define   DATAWIDTH  16
reg  [`DATAWIDTH-1 : 0]  data;
always @(posedge clk or posedge reset)
  begin
     if(reset)
       begin
          data[`DATAWIDTH-1]    <=  1'b1;   
          data[`DATAWIDTH-2:0] <= 'b0;
       end
     else
          data <= {1’b0,data [`DATAWIDTH-1 : 1] };
  end
但总感觉这是一个笨办法,如果有高人能提供更简洁的办法,不胜感激
发表于 2012-3-13 22:40:39 | 显示全部楼层
试试这个:
`define   DATAWIDTH  16
reg  [`DATAWIDTH-1 : 0]  data;
always @(posedge clk or posedge reset)
  begin
     if(reset)
          data <= {1’b1,{(`DATAWIDTH-1 ){1'b0}}};
     else
          data <= {1’b0,data [`DATAWIDTH-1 : 1] };
  end

应该就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-5-18 19:56 , Processed in 0.035420 second(s), 10 queries , Gzip On, Redis On.

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