pwm_led.v
module pwm_led(
input clk ,
input rst_n ,
output led
);
reg [15:0] period_cnt ;//10khz=0.1ms--->1_000_000/20=5000(15 bits)
reg [15:0] duty_cycle ;//because duty_cycle
reg inc_dec_flag;//0-inc,1-dec
assign led = (period_cnt >= duty_cycle) ? 1'b1: 1'b0;
always @ (posedge clk or negedge rst_n) begin
if(!rst_n)
period_cnt <= 16'd0;
else if (period_cnt == 16'd5000)
period_cnt <= 16'd0;
else
period_cnt <= period_cnt + 1'b1;
end
always @ (posedge clk or negedge rst_n) begin
if(!rst_n) begin
duty_cycle <= 16'd0 ;
inc_dec_flag <= 1'b0 ;
end else begin
if(period_cnt == 16'd5000) begin//记满1ms
if(inc_dec_flag == 1'b0) begin
if(duty_cycle == 16'd5000)
inc_dec_flag <= 1'b1;//切换递减模式
else
duty_cycle <= duty_cycle + 16'd50;//1%--->5_000/100=50
end else begin
if(duty_cycle == 16'd0)
inc_dec_flag <= 1'b0;//切换递增模式
else
duty_cycle <= duty_cycle - 16'd50;
end
end
end
end
endmodule
仿真
debug.v
`timescale 1ns / 1ps //仿真时间单位/仿真时间精度
module debug();
reg clk ;
reg rst_n ;
wire led ;
initial begin
clk = 1'b0;
rst_n = 1'b0;
#10
rst_n = 1'b1;
end
always #1 clk = ~clk;//生成时钟
pwm_led u_pwm_led(
.clk (clk),
.rst_n (rst_n),
.led (led)
);
endmodule
仿真看led的即可