diff options
author | Raptor Engineering Development Team <support@raptorengineering.com> | 2018-01-19 07:09:07 -0600 |
---|---|---|
committer | Raptor Engineering Development Team <support@raptorengineering.com> | 2018-01-19 07:09:07 -0600 |
commit | 080b8788b19cfcfdfd1a5c42b8a23558c3767ee2 (patch) | |
tree | ace2e1aad387e7902f841dd4322f8750785bf955 /main.v | |
parent | 1a342cd81411efb03fc3827ee160ed3fbf06f7ef (diff) | |
download | talos-system-fpga-080b8788b19cfcfdfd1a5c42b8a23558c3767ee2.tar.gz talos-system-fpga-080b8788b19cfcfdfd1a5c42b8a23558c3767ee2.zip |
Add I2C write capability
Add front panel LED override
Diffstat (limited to 'main.v')
-rw-r--r-- | main.v | 58 |
1 files changed, 53 insertions, 5 deletions
@@ -253,6 +253,7 @@ module system_fpga_top wire i2c_read_req; reg [7:0] i2c_data_to_master = 8'b00000000; wire [7:0] i2c_data_from_master; + wire [7:0] i2c_write_cycle_count; wire i2c_data_valid; wire i2c_rst = 1'b0; reg [7:0] i2c_reg_cur = 8'b00000000; @@ -270,8 +271,10 @@ module system_fpga_top parameter i2c_vendor_id_reg_addr2 = i2c_vendor_id_reg_addr1 + 1; parameter i2c_vendor_id_reg_addr3 = i2c_vendor_id_reg_addr1 + 2; parameter i2c_vendor_id_reg_addr4 = i2c_vendor_id_reg_addr1 + 3; + parameter i2c_led_override_reg_addr = 8'b00010000; reg [15:0] i2c_pg_reg = 1'b0; reg i2c_clr_err = 1'b0; + reg [7:0] i2c_write_reg_latch = 0; // Front panel control signals wire panel_nic1_led_cathode_std; @@ -281,6 +284,10 @@ module system_fpga_top reg [2:0] bmc_startup_fader = 3'b000; reg [2:0] bmc_startup_staggered_fader = 3'b000; reg bmc_startup_staggered_fader_common = 1'b0; + reg hostboot_startup_fader_common_low_internal = 1'b0; + reg hostboot_startup_fader_common_low = 1'b0; + reg hostboot_startup_fader_common_high = 1'b0; + reg [7:0] led_override_request = 8'b00000000; // Implement nasty ring oscillator for fallback use when main system clock is offline // Thanks to Clifford Wolf for the idea and basic code! @@ -338,7 +345,8 @@ module system_fpga_top .read_req(i2c_read_req), .data_to_master(i2c_data_to_master), .data_valid(i2c_data_valid), - .data_from_master(i2c_data_from_master) + .data_from_master(i2c_data_from_master), + .write_cycle_count(i2c_write_cycle_count) ); // Generate BMC startup "Knight Rider" display for front panel @@ -414,6 +422,16 @@ module system_fpga_top end else begin bmc_startup_staggered_fader_common = 1'b1; end + if (fader_pwm_counter >= 32) begin + hostboot_startup_fader_common_low_internal = 1'b0; + end else begin + hostboot_startup_fader_common_low_internal = 1'b1; + end + if (fader_pwm_counter >= (fader_pwm_level >> 1) + 32) begin + hostboot_startup_fader_common_high = 1'b0; + end else begin + hostboot_startup_fader_common_high = 1'b1; + end end always @(posedge clk_in) begin @@ -430,6 +448,14 @@ module system_fpga_top bmc_startup_staggered_fader[1] = 1'b0; bmc_startup_staggered_fader[2] = bmc_startup_staggered_fader_common; end + + if (fader_sequence_step == 0) begin + hostboot_startup_fader_common_low = hostboot_startup_fader_common_high; + end else if (fader_sequence_step == 1) begin + hostboot_startup_fader_common_low = hostboot_startup_fader_common_low_internal; + end else begin + hostboot_startup_fader_common_low = hostboot_startup_fader_common_low_internal; + end end // Determine BMC boot phase @@ -451,7 +477,6 @@ module system_fpga_top assign i2c_rst = 1'b0; // Handle I2C - // 2 8-bit registers with PGOOD state on error always @(posedge clk_in) begin i2c_clr_err <= 1'b0; @@ -463,6 +488,17 @@ module system_fpga_top if (((i2c_data_from_master) == i2c_clr_err_addr)) begin i2c_clr_err <= 1'b1; end + + // handle write setup + if (i2c_write_cycle_count == 1) begin + i2c_write_reg_latch <= i2c_data_from_master; + end else if (i2c_write_cycle_count == 2) begin + case (i2c_write_reg_latch) + i2c_led_override_reg_addr: begin + led_override_request <= i2c_data_from_master; + end + endcase + end end else if (i2c_read_req == 1'b1) begin i2c_reg_cur <= i2c_reg_cur + 1; @@ -907,9 +943,21 @@ module system_fpga_top panel_nic2_led_cathode = ~bmc_startup_fader[1]; panel_uid_led = ~bmc_startup_fader[2]; end else if (bmc_boot_phase == 2) begin - panel_nic1_led_cathode = panel_nic1_led_cathode_std; - panel_nic2_led_cathode = panel_nic2_led_cathode_std; - panel_uid_led = panel_uid_led_std; + if (led_override_request != 0) begin + if (led_override_request[3]) begin + panel_nic1_led_cathode = ~(led_override_request[0] & hostboot_startup_fader_common_high); + panel_nic2_led_cathode = ~(led_override_request[1] & hostboot_startup_fader_common_high); + panel_uid_led = ~(led_override_request[2] & hostboot_startup_fader_common_high); + end else begin + panel_nic1_led_cathode = ~(led_override_request[0] & hostboot_startup_fader_common_low); + panel_nic2_led_cathode = ~(led_override_request[1] & hostboot_startup_fader_common_low); + panel_uid_led = ~(led_override_request[2] & hostboot_startup_fader_common_low); + end + end else begin + panel_nic1_led_cathode = panel_nic1_led_cathode_std; + panel_nic2_led_cathode = panel_nic2_led_cathode_std; + panel_uid_led = panel_uid_led_std; + end end else begin panel_nic1_led_cathode = 1'b1; panel_nic2_led_cathode = 1'b1; |