FPGA调节LED亮度

这篇博客详细介绍了如何通过Verilog编程在FPGA上实现LED亮度的多周期调节,包括恒最大值计数的显示电路设计,以及根据计算器输出值动态调整亮度的方法。内容涵盖手绘RLT图、生成的RLT图、源代码和SignalTap II图的展示。
摘要由CSDN通过智能技术生成

2-1多周期-恒最大值计数-显示电路

手绘RLT图

这里写图片描述

生成的RLT图

这里写图片描述

源代码

包括用到的所有module:

module counterNdisplay(
		input clk,
		input rst,
		output wire [7:0] c_out );
		wire w1;
		wire [3:0] w2;
		divide_50000000_1 I_divide_50000000_1(.clk(clk),.rst(rst),.c_out(w1));
		counter_10 I_counter_10(.clk(w1),.rst(rst),.c_out(w2));
		four2eight I_four2eight(.c_in(w2),.rst(rst),.clk(w1),.c_out(c_out) );
endmodule


/**
*50Mhz to 1hz
*/
module divide_50000000_1(
		input clk,
		input rst,
		output reg c_out);
		integer k;
		always @(posedge rst,posedge clk)
		begin
			if(rst)
			begin
			k<=0;
			c_out<=0;
			end
			else
			begin
			if(k==25000000)
			begin
			c_out<=~c_out;
			k<=0;
			end
			else
			begin
			k<=k+1;
			end
			end
		end
endmodule
module counter_10(
		input clk,
		input rst,
		output reg [3:0] c_out);
		always @(posedge rst,posedge clk)
		begin
			if(rst)
			begin
				c_out<=4'b0000;
			end
			else
			begin 
				if(c_out==4'b1001)
			begin
				c_out<=4'b0000;
			end
			else
			begin
				c_out<=c_out+4'b0001;
			end
			end
		end
endmodule

/**
*4 bits number to 7-segment display
*/
module four2eight(
	input wire [3:0] c_in,
	input rst,
	input clk,
	output reg [7:0] c_out );
	always @(posedge rst,posedge clk) 
	begin
		if(rst)
		begin
			c_out<=8'b0100_0000;
		end
		else
		case(c_in)
			4'b0000:c_out<=8'b0100_0000;
			4'b0001:c_out<=8'b0111_1001;
			4'b0010:c_out<=8'b0010_0100;
			4'b0011:c_out<=8'b0011_0000;
			4'b0100:c_out<=8'b0001_1001;
			4'b0101:c_out<=8'b0001_0010;
			4'b0110:c_out<=8'b0000_0010;
			4'b0111:c_out<=8'b0111_1000;
			4'b1000:c_out<=8'b0000_0000;
			4'b1001:c_out<=8'b0001_0000;
		default:c_out<=8'b0100_0000;
		endcase
	end
endmodule






  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nrf51822并没有PWM模块,但是如果巧妙的结合PPI模块,并加上一个定断就可以轻松的实现了PWM,思路是这样的: 定器使用三个比较器 cc0、cc1和cc2,当三个比较器任何一产生比较事件的候都会通过PPI去翻转GPIO的引脚,在初始化的候这样设置这三个比较器: NRF_TIMER2->CC[0] = MAX_SAMPLE_LEVELS + next_sample_get(); NRF_TIMER2->CC[1] = MAX_SAMPLE_LEVELS; // CC2 will be set on the first CC1 interrupt. NRF_TIMER2->CC[2] = 0; 这是初始化的配置,到这里会有一个思考,这样的话计数器技术到cc0的候依然会继续的往下计数,那这样的话他的再溢出的值就将回到cc2的候也就是归零的候,那这样的波形就分为了三段了,这不是我们所需要的,那这样要实现PWM就要把cc2的比较值往后挪,让他超过cc0,并且cc2到之前的一个比较值是固定的,这样就需要从新设置cc2的值,还有一个办法就是当计数器到cc0的候请求断重置计数器,但是这样做有一个问题就是进入断是需要间的,而当计数器到达cc0的候就需要重置,同计数器的下一个值就是cc2,这样就会造成冲突,所以我们使用了第一种方案。 具体实现是这样的,使能cc1比较断,在第一次重新设置cc1,让他的值变成了两倍,同从新设置cc2,让他的值变成了cc1+N,N就是占空比参数,在第二次,也是从新设置cc1,但是和上一次断不同的是这候设置的是cc0,而不是cc2 这样造成的计数器溢出值是这样的:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值