zynq-呼吸灯(仿真)

该代码段展示了如何使用Verilog设计一个脉冲宽度调制(PWM)LED控制器。模块通过输入时钟和复位信号产生PWM信号,通过调节计数器与占空比来控制LED的亮灭比例。在每毫秒周期结束时,占空比会递增或递减,从而改变LED的亮度。
摘要由CSDN通过智能技术生成
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的即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值