在verilog中实现闭环

时间:2013-01-26 06:42:49

标签: loops verilog

我正在尝试在不使用verilog中的循环指令的情况下实现循环,所以我制作了一个计数器模块并且仿真完美但是当我尝试在FPGA上实现它时我在映射中遇到了很多错误,比如这个一个

ERROR:MapLib:979 - LUT4 symbol
"Inst_Count/Mcompar_GND_1105_o_xcount[7]_LessThan_25_o_lut<0>" (output
signal=Inst_Count/Mcompar_GND_1105_o_xcount[7]_LessThan_25_o_lut<0>) has
input signal "Inst_Count/Madd_x[9]_GND_1105_o_add_0_OUT_cy<0>" which will be
trimmed. See Section 5 of the Map Report File for details about why the input
signal will become undriven. 

这些错误只发生在我用循环指令模块替换这个模块时所以没有人没有这个问题吗?

感谢您抽出时间:)

module average( input rst , output reg [7:0]
reg [7:0] count;
reg [7:0] prv_count;

reg clk;

initial
begin

count = 8'd0;

end

always @ (posedge rst)
begin

clk = 1'b0;

end

always @ (clk)
begin

prv_count = count ;
count = prv_count + 1'b1;

end

always @ (count)
begin

if (count == 8'd255)
G_count= count;
else
begin

clk = ~clk;
G_count= count;

end

end
endmodule

1 个答案:

答案 0 :(得分:2)

哦,这是完全错误的。我不认为任何人可以在没有给你关于Verilog的演讲的情况下提供帮助,但是......有些事情可以立即引起注意:

  1. 您的模块参数列表中存在明显的语法错误,您不会将其关闭(即)丢失)。
  2. 时钟应该是模块的输入。即使您只依赖于复位输入并使用寄存器作为“时钟”,它也不起作用(逻辑上,你必须打破组合循环,否则......)。
  3. 不要在应该可合成的代码中使用初始块。
  4. prv_count没用。
  5. 无需手动处理溢出(检查255?8'd255正好是8'b11111111,如果添加1'b1等,它会重置为0.)
  6. 还有很多引起明显问题的其他事情 - 你是否尝试过阅读一些关于Verilog的书籍,最好是那些涵盖语言可综合部分的书籍? :)无论如何,你想要做的事情(据我所知)可能看起来像这样:

    module average(input clk, input rst, output reg [7:0] overflow_count);
       reg [7:0] count;
    
       always @(posedge clk or negedge rst) begin
          if (~rst) begin
             count <= 8'b0;
             overflow_count <= 8'b0;
          end else begin
             count <= (count + 1'b1);
             if (count == 8'b0)
               overflow_count <= (overflow_count + 1'b1);
          end
       end
    endmodule
    

    希望它有所帮助,并且真的建议你看一些关于HDL的好书。