|
共享一个“红芯电子”实现呼吸灯的工程
源码:
//==============================================================================
// File Name : LED_BREATHING.v
// Module Name : LED_BREATHING
// Description : This is a breathing led module
// Author : xsyan1225(红芯电子_飞哥)
// HomePage : http://shop57125352.taobao.com/
// Date : 2012/09/06
// Rev. : 0.1
//==============================================================================
// 呼吸灯
`define UD //#1
module LED_BREATHING
(
SYSCLK_50M,
RST_B,
LED
//TP
);
//==============================================================================
// Input and output declaration
//==============================================================================
input SYSCLK_50M;
input RST_B;
output [5:0] LED;
//output TP;//用于测试
//==============================================================================
// Wire and reg declaration
//==============================================================================
wire SYSCLK_50M;
wire RST_B;
reg [5:0] LED;
//wire TP = LED[0];
//==============================================================================
// Wire and reg in the module
//==============================================================================
reg [26:0] TIME_CNT;
wire [26:0] TIME_CNT_N;
reg [6:0] PWM_WIDTH;
wire [6:0] PWM_WIDTH_N;
reg [5:0] PWM_ADJ;
wire [5:0] PWM_ADJ_N;
wire [5:0] LED_N;
//==============================================================================
// Logic
//==============================================================================
always @(posedge SYSCLK_50M or negedge RST_B)
begin
if(!RST_B)
TIME_CNT <= `UD 27'h0;
else
TIME_CNT <= `UD TIME_CNT_N;
end
// 自由计数器
assign TIME_CNT_N = TIME_CNT + 27'h1;
//------------------------------------------------------------------------------
always @(posedge SYSCLK_50M or negedge RST_B)
begin
if(!RST_B)
PWM_ADJ <= `UD 6'h0;
else
PWM_ADJ <= `UD PWM_ADJ_N;
end
// 第26位用于标识呼和吸的切换点,2^26 = 1.34秒(约等于),完成一次呼吸总时长约2.7秒
assign PWM_ADJ_N = TIME_CNT[26] ? TIME_CNT[25:20] : ~TIME_CNT[25:20] ;
//------------------------------------------------------------------------------
always @(posedge SYSCLK_50M or negedge RST_B)
begin
if(!RST_B)
PWM_WIDTH <= `UD 7'h3f;
else
PWM_WIDTH <= `UD PWM_WIDTH_N;
end
//利用寄存器溢出位产生的占空比不同来驱动 LED 实现呼吸效果
//PWM_ADJ 用于控制脉宽
assign PWM_WIDTH_N = PWM_WIDTH[5:0] + PWM_ADJ;
//------------------------------------------------------------------------------
always @(posedge SYSCLK_50M or negedge RST_B)
begin
if(!RST_B)
LED <= `UD 6'h3f;
else
LED <= `UD LED_N;
end
//6个灯一起呼吸
assign LED_N = {{3{PWM_WIDTH[6]}},{3{~PWM_WIDTH[6]}}};
endmodule
//==============================================================================
// End of file
//==============================================================================
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|