如何修改Verilog代码以避免语法错误?

时间:2016-06-06 11:57:27

标签: verilog fpga

功能是:当h posedge到来时,开始计数clk,如果计数到105,r设置为0,如果计数到517,r设置为1;如果数超过600,什么都不做; h是周期性的信号;

  module make_counter(h, clk, P);
        input wire h;
        input wire clk;
        output wire P;
        reg r=1'b1;
        reg[9:0] n=0;

        always @(negedge clk)
              always @(posedge h)
              begin 
                  n=0;
              end

              begin
              if(n<600)
                    n=n+1'b1;

              if(n==106)
                    r<=1'b0;
              else if(n==517)
                    r<=1'b1;
              else 
                    ;
              end
        assign P=r;
    endmodule

错误(10170):在main.v(115)附近文本“always”的Verilog HDL语法错误;期待“;”

错误(10170):在文本“begin”附近的main.v(119)处的Verilog HDL语法错误;期待“endmodule”

图像是我想要的。当flag1开始设置n = 0,并计数clk;   当count到flag2时,设置P = 0;当计数到红色箭头时,设置P = 1;

1 个答案:

答案 0 :(得分:0)

Buddy你有一些不好的代码,

  • 不要使用always block inside always
  • 使变量名称意味着完整,即cnt而不是n
  • 使用重置,并在声明

    时避免赋值
    module make_counter(h, clk, P);
    input wire h;
    input wire clk;
    output wire P;
    wire r;
    reg[9:0] n=0;
    
    
    always @ (posedge clk or posedge h)
    begin
      if(h & (n < 10'd600)) begin
        n <= n + 1'd1;
      end else begin
        n <= n;
      end
    end
    
    assign r = (n == 10'd105) ? 1'b0 : ( (n == 10'd517) ? 1'b1 : 1'bx );
    assign P = r;
    
    endmodule
    

你没有提到,如果r介于0到104和106到516之间,那么n的值应该是什么?&gt; 517?

我以为它会成为任何东西。

检查并说它适合你