差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
三色灯颜色和亮度控制 [2016/06/22 17:58]
anran [相关文档]
三色灯颜色和亮度控制 [2016/06/29 16:34] (当前版本)
anran [仿真结果]
行 13: 行 13:
 ====工作原理==== ====工作原理====
 ------ ------
-这里三色灯是由光学三基色(红绿)三种颜色的LED灯组合而成+这里三色灯是在一个物理封装里面,有R(红)、G(绿)、B(兰)三种颜色的LED灯,这三个灯非常靠近,从远处看可以当作一个三色的发光点
  
 {{ :​三基色合成.jpg |三基色合成}} {{ :​三基色合成.jpg |三基色合成}}
  
-根据红绿蓝三色的不同组合可以合成不同颜色的光,例如红色和绿色组合可以产生黄色的光,绿色和蓝色组合可以产生青色的光,相同颜色不同亮度组合也会产生不同的光等等,如图。+根据红绿蓝三色的不同组合可以合成不同颜色的光,例如红色和绿色组合可以产生黄色的光,绿色和蓝色组合可以产生青色的光,相同颜色不同亮度组合也会产生不同的光等等,如图。
  
 本实验中我们实现三基色的固定组合,最终输出产生图中的红色、绿色、蓝色、黄色、青色、品红、白色7中颜色,然后根据PWM的原理调节LED灯颜色的亮度,使用PWM,给LED灯上施加数字信号,通过调整数字信号的占空比(调整占空比 = 调整有效值)来控制LED灯的亮度。 本实验中我们实现三基色的固定组合,最终输出产生图中的红色、绿色、蓝色、黄色、青色、品红、白色7中颜色,然后根据PWM的原理调节LED灯颜色的亮度,使用PWM,给LED灯上施加数字信号,通过调整数字信号的占空比(调整占空比 = 调整有效值)来控制LED灯的亮度。
行 34: 行 34:
  
 {{ ::​rgb_led.jpg |RGB三色灯硬件连接}} {{ ::​rgb_led.jpg |RGB三色灯硬件连接}}
 +
 +注意:R、G、B三种颜色的LED的限流电阻的阻值是不同的,主要是因为达到同样的亮度,每种颜色的LED灯所需要的电流是不同的。
 +
 +小脚丫开发板上有两组RGB三色灯,在本实验中我们采用其中的一组做实验。
  
 ====代码设计==== ====代码设计====
行 57: 行 61:
  
 <code verilog> <code verilog>
-//Debounce for key_color +//Debounce for key 
-Debounce Debounce_color(.clk(clk_in),​.rst_n(rst_n_in),​.key_n(key_color),​.key_pulse(color_pulse)); +wire [2:0] key_pulse;​ 
 +Debounce1 Debounce_uut 
 +( 
 +.clk(clk_in),​ 
 +.rst_n(rst_n_in),​ 
 +.key_n({key_color,​key_up,​key_down}), 
 +.key_pulse(key_pulse) 
 +); 
  
-//Debounce for key_up +wire color_pulse = key_pulse[2]
-Debounce Debounce_up(.clk(clk_in),​.rst_n(rst_n_in),​.key_n(key_up),​.key_pulse(up_pulse));  +wire up_pulse = key_pulse[1]; 
- +wire down_pulse ​= key_pulse[0];
-//Debounce for key_down +
-Debounce Debounce_down(.clk(clk_in),​.rst_n(rst_n_in),​.key_n(key_down),​.key_pulse(down_pulse))+
 </​code>​ </​code>​
  
行 91: 行 100:
 </​code>​ </​code>​
  
-调用PWM功能模块,实现亮度的调节,具体原理见[[脉冲发生器]]和[呼吸灯]]实验,产生PWM信号Lightness_out,然后根据PWM控制亮度,如下:+调用PWM功能模块,实现亮度的调节,具体原理见[[脉冲发生器]]和[[呼吸灯]]实验,为了保证三色灯在单色(红、绿、蓝)、双色合成(黄、青、品红)和三色合成(白)之间切换时亮度相同,单色切换为双色合成色时,需要将双色合成时每种基色的亮度减半,单色切换为三色合成色时需要将三色合成时每种基色亮度降为33%,亮度与占空比相关。例如红色时我们调节控制信号占空比为60%,输出黄色时其中的红色和绿色的控制信号占空比都为30%,输出白色时其中的红绿蓝三色的控制信号占空比都为20%,使用脉宽不变,改变脉冲周期的方法实现 
 + 
 +<code verilog>​ 
 +localparam CYCLE_ONE = 5; 
 +localparam CYCLE_TWO = 10; 
 +localparam CYCLE_THREE = 15; 
 + 
 +reg [3:0] cycle; 
 +//Control duty cycle 
 +always @(color) begin  
 + case(color) 
 + 3'​b110:​ cycle = CYCLE_ONE;​ 
 + 3'​b101:​ cycle = CYCLE_ONE;​ 
 + 3'​b011:​ cycle = CYCLE_ONE;​ 
 + 3'​b100:​ cycle = CYCLE_TWO;​ 
 + 3'​b010:​ cycle = CYCLE_TWO;​ 
 + 3'​b001:​ cycle = CYCLE_TWO;​ 
 + 3'​b000:​ cycle = CYCLE_THREE;​ 
 + 3'​b111:​ cycle = CYCLE_THREE;​ 
 + default: cycle = CYCLE_ONE;​ 
 + endcase 
 +end  
 +</​code>​ 
 + 
 +我们采用产生PWM信号Lightness_out,然后根据PWM控制亮度,如下:
  
 <code verilog> <code verilog>
行 105: 行 138:
 ====仿真结果==== ====仿真结果====
  
 +{{:​红色.jpg?​180 |红色}}
  
 +{{:​绿色.jpg?​180 |绿色}}
 +
 +{{:​蓝色.jpg?​180 |蓝色}}
 +
 +{{:​黄色.jpg?​180 |黄色}}
 +
 +{{:​青色.jpg?​180 |青色}}
 +
 +{{:​品红.jpg?​180 |品红}}
 +
 +{{:​白色.jpg?​180|白色}}
 ====资源报告==== ====资源报告====
  
 ^ 资源 | 数量 ​ | 比例 ​ | 说明 ​ | ^ 资源 | 数量 ​ | 比例 ​ | 说明 ​ |
-^ LUTs | 59   | 3%   ​| ​  |  +^ LUTs | 77   | 2%   ​| ​  |  
-^ 寄存器 | 78    ​| ​2% |   |+^ 寄存器 | 43    ​| ​1% |   |
 ^ 存储器 | 0  | 0%   ​| ​   | ^ 存储器 | 0  | 0%   ​| ​   |
 ^ IO管脚 ​  | 8 |   ​| ​   | ^ IO管脚 ​  | 8 |   ​| ​   |
行 131: 行 176:
  
 ^ **文件名称** ​ | **功能** | ^ **文件名称** ​ | **功能** |
- +^ **[[Color_led.v]]** | **三色灯,顶层模块** | 
 +^ **[[Debounce1.v]]** | **按键消抖模块** | 
 +^ **[[Lightness.v]]** | **PWM亮度调节模块** |