| module top( |
| output RGB0, RGB1, RGB2 |
| ); |
| |
| wire clk; |
| |
| SB_HFOSC inthosc ( |
| .CLKHFPU(1'b1), |
| .CLKHFEN(1'b1), |
| .CLKHF(clk) |
| ); |
| |
| localparam counter_width = 32; |
| |
| reg [counter_width-1:0] ctr; |
| |
| always@(posedge clk) |
| begin |
| ctr <= ctr + 1; |
| end |
| |
| localparam pwm_width = 12; |
| |
| localparam pwm_max = (2**pwm_width) - 1; |
| localparam pwm_max_div4 = (2**(pwm_width-2)) - 1; |
| |
| |
| wire [1:0] phase = ctr[counter_width - 1 : counter_width - 2]; |
| wire [pwm_width-1:0] fade = ctr[counter_width - 3 : counter_width - (2 + pwm_width)]; |
| wire [pwm_width-1:0] fade_div4 = ctr[counter_width - 3 : counter_width - (pwm_width)]; |
| |
| wire [pwm_width-1:0] r_val, g_val, b_val; |
| |
| // Fade R->G->B->W-> |
| assign r_val = (phase == 0) ? pwm_max_div4 + (3 * fade_div4) : |
| (phase == 1) ? pwm_max - fade : |
| (phase == 3) ? fade_div4 : |
| 0; |
| |
| assign g_val = (phase == 0) ? pwm_max_div4 - fade_div4: |
| (phase == 1) ? fade : |
| (phase == 2) ? pwm_max - fade : |
| (phase == 3) ? fade_div4 : |
| 0; |
| |
| assign b_val = (phase == 0) ? pwm_max_div4 - fade_div4: |
| (phase == 2) ? fade : |
| (phase == 3) ? pwm_max - (3 * fade_div4) : |
| 0; |
| |
| reg [pwm_width-1:0] pwm_ctr; |
| |
| reg pwm_r, pwm_g, pwm_b; |
| |
| always@(posedge clk) |
| begin |
| pwm_ctr <= pwm_ctr + 1; |
| pwm_r <= (pwm_ctr < r_val) ? 1'b1 : 1'b0; |
| pwm_g <= (pwm_ctr < g_val) ? 1'b1 : 1'b0; |
| pwm_b <= (pwm_ctr < b_val) ? 1'b1 : 1'b0; |
| end |
| |
| SB_RGBA_DRV RGBA_DRIVER ( |
| .CURREN(1'b1), |
| .RGBLEDEN(1'b1), |
| .RGB0PWM(pwm_g), |
| .RGB1PWM(pwm_b), |
| .RGB2PWM(pwm_r), |
| .RGB0(RGB0), |
| .RGB1(RGB1), |
| .RGB2(RGB2) |
| ); |
| |
| |
| defparam RGBA_DRIVER.CURRENT_MODE = "0b1"; |
| defparam RGBA_DRIVER.RGB0_CURRENT = "0b000111"; |
| defparam RGBA_DRIVER.RGB1_CURRENT = "0b000111"; |
| defparam RGBA_DRIVER.RGB2_CURRENT = "0b000111"; |
| |
| |
| endmodule |