|
- module delay_clk( //状态机时钟延时模块
- input clk, //时钟输入
- input [31:0] delay, //延时时钟数 1Mhz延时1us 50Mhz延时20ns 以此类推
- input start, //上升沿 开始执行延时
- output reg stop //延时结束 发出上升沿 并将start拉低
- );
- reg [31:0] timer = 32'd0;
- reg [1:0] state = 2'd0;
- initial stop = 1'b0;
- always @(posedge clk) begin
- case(state)
- 2'd0:begin //状态0
- stop <= 1'b0;
- if(start) begin
- timer <= delay;
- state <= 2'd1;
- end else begin
- state <= 2'd0;
- end
- end
-
- 2'd1:begin //状态1
- if(|timer) begin
- timer = timer - 32'd1;
- state <= 2'd1;
- end else begin
- state <= 2'd2;
- end
- end
-
- 2'd2:begin //状态2
- stop <= 1'b1;
- state <= start ? 2'd2 : 2'd0;
- end
-
- default:begin //其他状态
- state <= 2'd0;
- end
- endcase
- end
- endmodule
- module main(
- input clk, //50Mhz Pin17
- output reg led //LED(低电平点亮) Pin3
- );
- reg start = 1'b0;
- wire stop;
- reg [31:0] delay;
- delay_clk delay_clk(
- .clk(clk),
- .delay(delay),
- .start(start),
- .stop(stop)
- );
- reg [1:0] state = 2'd0;
- always @(posedge clk) begin
- case(state)
- 2'd0:begin //状态0
- delay <= 25000000;
- state <= 3'd1;
- end
-
- 2'd1:begin //状态1
- start <= 1'b1;
- state <= 3'd2;
- end
-
- 2'd2:begin //状态2
- state <= stop ? 3'd3 : 3'd2;
- end
-
- 2'd3:begin //状态3
- start <= 1'b0;
- led <= !led;
- state <= 3'd0;
- end
- endcase
- end
- endmodule
复制代码 |
|