mayo20102012 发表于 2014-7-9 18:48:15

verilog程序中一个信号经过逻辑优化后被固定置为0,咋办

module tt(clk,rst_n,cnt,cnt_en);
inputclk;
inputrst_n;
output regcnt;
output cnt_en;
reg cnt_en;

always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
    cnt_en <= 1'b0;
    cnt   <= 4'd0;
end
else if(!cnt_en)
   cnt <= cnt+1'b1;
else if(cnt == 4'd15)
cnt_en <= 1'b1;
end
endmodule

上面 是我某个程序中的 计数模块,本想只让计数器计一圈 就停止计数的。结果编译后,提示cnt_en呗固定置为0,所以导致功能实现不了。求解?

chenchaoting 发表于 2014-7-9 19:02:24

output cnt_en; 这里输出做输入可行么 改成inout 试试

xyzabc 发表于 2014-7-9 19:12:39

本帖最后由 xyzabc 于 2014-7-9 19:14 编辑

else if(cnt == 4'd15)
cnt_en <= 1'b1;
这个分支不可能执行的哦,因为cnt_en==0,所以只会执行else if(!cnt_en)这个分支。

mayo20102012 发表于 2014-7-9 19:16:18

xyzabc 发表于 2014-7-9 19:12
else if(cnt == 4'd15)
cnt_en

谢谢啦,看出来了,确实问题出在这儿。

xyzabc 发表于 2014-7-9 19:20:11

本帖最后由 xyzabc 于 2014-7-9 20:35 编辑

always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
    cnt   <= 4'd0;
else if(cnt< 4'd15)
   cnt <= cnt+1'b1;
end

wire cnt_en;
assign   cnt_en = ( cnt>=4'd15 );

endmodule

这样应该是你打意思吧

mayo20102012 发表于 2014-7-9 19:29:58

xyzabc 发表于 2014-7-9 19:20
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)


嗯 这样做也是对的。谢谢啦。。

mayo20102012 发表于 2014-7-9 19:30:54

xyzabc 发表于 2014-7-9 19:20
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)


但是 wire cnt_en 不能在always中赋值吧?

xyzabc 发表于 2014-7-9 20:33:19

mayo20102012 发表于 2014-7-9 19:30
但是 wire cnt_en 不能在always中赋值吧?

恩,复制你的代码,忘了去掉

RUANJI 发表于 2014-7-10 10:47:04

后面两个IF换一下位置。
页: [1]
查看完整版本: verilog程序中一个信号经过逻辑优化后被固定置为0,咋办