Verilog 中关于`define的问题求助
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
这也是个办法哦,赞
同意这种写法~
