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

How to modify the Verilog code to avoid syntax error?

功能是:当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):文本 "always" 附近 main.v(115) 处的 Verilog HDL 语法错误;期待“;”

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



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

伙计,你有一些错误的代码,

  • 不要在 always 块中使用 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
    

你没有提到,如果 n 在 0 到 104 和 106 到 516 和 > 517 之间,r 的值应该是多少?

我以为它会是任何东西。

检查它并说它适合你