微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > Verilog 中关于`define的问题求助

Verilog 中关于`define的问题求助

时间:10-02 整理:3721RD 点击:
以下是未定义宏的右移代码:
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,改如何写?

data <=  {1'b1,`DATAWIDTH-1'b0}?data <=  {1'b1,(`DATAWIDTH-1)'b0}?

哎,怎么感觉你这个明显有问题啊。 DATA没有初始化 ,data赋值左右位数不一样



   data <=  {1'b1,`DATAWIDTH-1'b0}报警告,data寄存器被Remove了,   data <=  {1'b1,(`DATAWIDTH-1)'b0} 语法通不过

我想实现以下功能
   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

试一试:
data <=  {1'b1,(`DATAWIDTH-1){1'b0}};

两个建议:
1。 `define NEW_WIDTH = (`DATA_WIDTH - 1), 然后再用,否则有点糊涂
2。可以考虑把右移改成左移,这样你在初始化的时候可以用data <=  `DATAWIDTH‘b1;

   data <=  {1'b1,(`DATAWIDTH-1){1'b0}};   的写法用synplify做FPGA综合没有报错,但是NC_verilog和synopsys综合都报错,

这个问题我最终把一行代码拆成两行解决的
`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
但总感觉这是一个笨办法,如果有高人能提供更简洁的办法,不胜感激

试试这个:
`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
应该就可以了。

换成这样:
          data <= {1'b1, {(`DATAWIDTH-1 ){1'b0}}};
肯定行!

可以这样写:
`define   DATAWIDTH  16
reg  [`DATAWIDTH-1 : 0]  data;
always @(posedge clk or posedge reset)
  begin
     if(reset)
          data <=  1'b1 << `DATAWIDTH;
    else
          data <= {1’b0,data [`DATAWIDTH-1 : 1] };
  end



   这也是个办法哦,赞

同意这种写法~

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

网站地图

Top