123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- // ==================================================================
- // >>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
- // ------------------------------------------------------------------
- // Copyright (c) 2022 by Ampelsteuerungsgruppe
- //
- // --------------------------------------------------------------------
- //
- // Project: iCE5UP 5K RGB LED Steuerung
- // File: LED_control.sv
- // Title: LED Ampelsteuerung
- // Description: Creates RGB PWM per data input
- //
- //
- // --------------------------------------------------------------------
- //
- //------------------------------------------------------------
- // Notes:
- //
- //
- //------------------------------------------------------------
- // Development History:
- //
- // __DATE__ _BY_ _____REV_ _DESCRIPTION___________________________
- // 17.02.22 AmpelGr 1.0 Initial design for Lattice Radiant Ampelsteuerung
- //
- //------------------------------------------------------------
- // Dependencies:
- //
- //
- //
- //------------------------------------------------------------
-
-
- module LED_control1 (
- // inputs
- input wire clk12M, // 12M clock
- input wire enable, // Asynchronous enable/disable wire
- input wire [7:0] data_input, // for selecting color using sensor data
- input wire data_valid, // Data on Parallelport is valid on posedge
- //outputs
- output reg red_pwm, // Red LED
- output reg grn_pwm, // Green LED
- output reg alarm // Alarmmeldung
- );
-
-
- //------------------------------
- // INTERNAL SIGNAL DECLARATIONS:
- //------------------------------
- // parameters (constants)
- parameter on_hi = 2'b10;
- parameter on_lo = 2'b01;
- parameter off = 2'b00;
- parameter Brightness=4'b0111; //50% Brightness
-
- // wires (assigns)
- wire [4:0] red_intensity;
- wire [4:0] grn_intensity;
- wire clk24M;
- wire LOCK;
-
- // regs (always)
- reg [1:0] RGB_color_s; // selected Color
- reg [3:0] Brightness_s;
-
- reg [1:0] red_set; // hi/lo/off
- reg [1:0] grn_set;
-
- reg [17:0] red_peak; // LED 'on' peak intensity (high precision)
- reg [17:0] grn_peak;
-
- reg [17:0] curr_red; // current LED intensity ( /256 = PWM duty cycle)
- reg [17:0] curr_grn;
-
- reg [17:0] pwm_count; // PWM counter
- reg [7:0] count = 8'b0;
-
- //------------------------------
- // PLL Instantiation
- //------------------------------
- //Block to reset the PLL initially
-
- pll_24M __(.ref_clk_i(clk12M ), .rst_n_i(~enable), .lock_o(LOCK), .outcore_o( ), .outglobal_o(clk24M));
-
-
- // Capture stable parameters in local clock domain
- always @ (posedge clk24M or posedge enable)
- if (enable) begin
- RGB_color_s <= 2'b00; //turn off
- Brightness_s <= 4'b0000;
- alarm <= 0;
- end else if(!alarm) begin
- if(data_valid) begin
- if(data_input <100) begin
- RGB_color_s <= 2'b10; // set green
- Brightness_s <= Brightness;
- end else if(data_input >168) begin
- alarm <=1'b1;
- end else begin
- RGB_color_s <= 2'b11; // set yellow
- Brightness_s <= Brightness;
- end
- end
- end else begin
- RGB_color_s <= 2'b01; // set Color red
- Brightness_s <= Brightness;
- end
-
-
- // interpret 'brightness' setting
- assign red_intensity = Brightness_s + 1'b1;
- assign grn_intensity = Brightness_s + 1'b1;
-
-
- // interpret 'color' setting
- always @ (RGB_color_s)
- case (RGB_color_s)
- 2'b01: begin red_set <= on_hi; grn_set <= off; end //Red
- 4'b10: begin red_set <= off; grn_set <= on_hi; end //Green
- 4'b11: begin red_set <= on_hi; grn_set <= on_hi; end //Yellow
- default: begin red_set <= off; grn_set <= off; end //2'b00 off
- endcase
-
- // set peak values per 'brightness' and 'color'
- // when color setting is 'on_lo', then peak intensity is divided by 2
- always @ (posedge clk24M or posedge enable)
- if (enable) begin
- red_peak <= 18'b0;
- end else begin
- case (red_set)
- on_hi: red_peak <= {red_intensity, 13'h000}; // 100%
- on_lo: red_peak <= {1'b0,red_intensity, 12'h000}; // 50%
- default: red_peak <= 18'h00000;
- endcase
- end
-
- always @ (posedge clk24M or posedge enable)
- if (enable) begin
- grn_peak <= 32'b0;
- end else begin
- case (grn_set)
- on_hi: grn_peak <= {grn_intensity, 13'h000}; // 100%
- on_lo: grn_peak <= {1'b0,grn_intensity, 12'h000}; // 50%
- default: grn_peak <= 18'h00000;
- endcase
- //$monitor("grn_peak=%d",grn_peak);
- end
-
- // set PWM duty cycle. 8-bit resolution 0x100 is 100% on
- always @ (posedge clk24M or posedge enable)
- if (enable) begin
- curr_red <= 18'b0;
- curr_grn <= 18'b0;
- end else begin
- curr_red <= red_peak;
- curr_grn <= grn_peak;
- end
-
- // generate PWM outputs
- always @ (posedge clk24M or posedge enable)
- if (enable) begin
- pwm_count <= 18'b0;
- red_pwm <= 0;
- grn_pwm <= 0;
- end else begin
- if(pwm_count < 131071)
- pwm_count <= pwm_count + 1;
- else
- pwm_count <= 0;
-
- if(pwm_count < curr_red)
- red_pwm <= 1;
- else
- red_pwm <= 0;
-
- if(pwm_count < curr_grn)
- grn_pwm <= 1;
- else
- grn_pwm <= 0;
-
- end
-
-
- endmodule // LED_control
|