【笔记】把计数整合在步骤里的写法
参考<<Verilog那些事儿_整合篇>>
Verilog源代码
module c1b_module ( input CLK, input RSTn, output Q, /******************/ output [4:0]SQ_C1, output [1:0]SQ_i ); /*************************/ reg [1:0]i; reg [4:0]C1; reg rQ; always @ ( posedge CLK or negedge RSTn ) if( !RSTn ) begin i <= 2'd0; C1 <= 5'd0; rQ <= 1'b0; end else case( i ) //步骤0把Q拉高是10个时钟,10 - 1表示步骤0表示消耗是10个时钟,-1表示提前一个时钟更新i的值 //若把c1 == 10 - 1改为c1 == 10的话,那么Q就表示为有11个时钟处于高电平 0: if( C1 == 10 - 1 ) begin C1 <= 5'd0; i <= i + 1'b1; end else begin rQ <= 1'b1; C1 <= C1 + 1'b1; end 1://步骤0把Q拉低是10个时钟 if( C1 == 10 - 1 ) begin C1 <= 5'd0; i <= i + 1'b1; end else begin rQ <= 1'b0; C1 <= C1 + 1'b1; end 2: if( C1 == 10 - 1 ) begin C1 <= 5'd0; i <= i + 1'b1; end else begin rQ <= 1'b1; C1 <= C1 + 1'b1; end 3: if( C1 == 10 -1 ) begin C1 <= 5'd0; i <= i + 1'b1; end else begin rQ <= 1'b0; C1 <= C1 + 1'b1; end endcase /***********************************/ assign Q = rQ; /*****************/ assign SQ_i = i; assign SQ_C1 = C1; /***********************************/ endmodule
仿真源代码
`timescale 1 ps/ 1 ps module c1b_module_simulation(); reg CLK; reg RSTn; wire Q; wire [4:0]SQ_C1; wire [1:0]SQ_i; /***********************/ c1b_module i1 ( .CLK(CLK), .RSTn(RSTn), .Q(Q), .SQ_C1(SQ_C1), .SQ_i(SQ_i) ); /***********************/ initial begin RSTn = 0; #1000 RSTn = 1; CLK = 1; forever #5 CLK = ~CLK; end /***********************/ endmodule
结果
这里的1个时钟周期为10ps