summaryrefslogtreecommitdiffstats
path: root/fpga/serial/lattice/eb85/main.v
diff options
context:
space:
mode:
Diffstat (limited to 'fpga/serial/lattice/eb85/main.v')
-rw-r--r--fpga/serial/lattice/eb85/main.v98
1 files changed, 98 insertions, 0 deletions
diff --git a/fpga/serial/lattice/eb85/main.v b/fpga/serial/lattice/eb85/main.v
new file mode 100644
index 0000000..e736781
--- /dev/null
+++ b/fpga/serial/lattice/eb85/main.v
@@ -0,0 +1,98 @@
+// This file is part of the Universal Laboratory (uLab)
+//
+// © 2017 - 2019 Raptor Engineering, LLC
+// All Rights Reserved
+//
+// Licensed under the terms of the AGPL v3
+
+module control_fpga_top
+ (
+ // Input clock
+ input wire main_12_mhz_clock,
+
+ // Guest FPGA interface
+ input wire [3:0] four_bit_output, // Output from the user program to the remote access module
+ output wire [3:0] four_bit_input, // Input to the user program from the remote access module
+ input wire [7:0] eight_bit_output, // Output from the user program to the remote access module
+ output wire [7:0] eight_bit_input, // Input to the user program from the remote access module
+
+ input wire [7:0] led_segment_bus,
+ input wire [3:0] led_digit_select,
+
+ // Serial interface
+ input wire serial_input,
+ output wire serial_output,
+
+ // On-board diagnostic LEDs
+ output wire [7:0] led_bank
+ );
+
+ parameter RAM_ADDR_BITS = 0;
+
+ // Synthesize 50MHz clock from 12MHz clock
+ wire main_50_mhz_clock;
+ wire pll_locked;
+
+ SB_PLL40_CORE #(
+ .FEEDBACK_PATH("SIMPLE"),
+ .DIVR(4'b0000), // DIVR = 0
+ .DIVF(7'b1000010), // DIVF = 66
+ .DIVQ(3'b100), // DIVQ = 4
+ .FILTER_RANGE(3'b001) // FILTER_RANGE = 1
+ ) system_pll (
+ .LOCK(pll_locked),
+ .RESETB(1'b1),
+ .BYPASS(1'b0),
+ .REFERENCECLK(main_12_mhz_clock),
+ .PLLOUTCORE(main_50_mhz_clock)
+ );
+
+ reg [7:0] diagnostic_led_data = 8'b0;
+
+ wire [15:0] sixteen_bit_output; // Output from the user program to the remote access module
+ wire [15:0] sixteen_bit_input; // Input to the user program from the remote access module
+
+ wire [5:0] lcd_data_in_address;
+ wire [7:0] lcd_data_in_data;
+ wire lcd_data_in_enable;
+
+ assign sixteen_bit_output = 16'b0; // Diable 16 bit input for now
+ //assign led_bank = eight_bit_input; // Mirror input to the LEDs
+ assign led_bank = diagnostic_led_data; // Show diagnostic data on LEDs
+
+ reg [22:0] slow_clock_divider = 23'b0;
+ wire slow_clock;
+ reg [1:0] kr_state = 2'b0;
+ always @(posedge main_12_mhz_clock) begin
+ slow_clock_divider <= slow_clock_divider + 1;
+ end
+ assign slow_clock = slow_clock_divider[22];
+
+ always @(posedge slow_clock) begin
+ kr_state <= kr_state + 1;
+ if (pll_locked) begin
+ case (kr_state)
+ 0: diagnostic_led_data <= 8'b00011000;
+ 1: diagnostic_led_data <= 8'b00100100;
+ 2: diagnostic_led_data <= 8'b01000010;
+ 3: diagnostic_led_data <= 8'b10000001;
+ endcase
+ end else begin
+ diagnostic_led_data <= 8'b0;
+ end
+ end
+
+ assign lcd_data_in_enable = 1'b0; // Disable LCD I/O for now
+ assign lcd_data_in_address = 6'b0; // Disable LCD I/O for now
+ assign lcd_data_in_data = 8'b0; // Disable LCD I/O for now
+
+ // Instantiate main remote access module
+ remote_access #(RAM_ADDR_BITS) remote_access(.main_fifty_clock(main_50_mhz_clock), .remote_access_4_bit_output(four_bit_output),
+ .remote_access_4_bit_input(four_bit_input), .remote_access_8_bit_output(eight_bit_output),
+ .remote_access_8_bit_input(eight_bit_input), .remote_access_16_bit_output(sixteen_bit_output),
+ .remote_access_16_bit_input(sixteen_bit_input),
+ .serial_port_receiver(serial_input), .serial_port_transmitter(serial_output), .remote_access_input_enable(1'b0),
+ .local_input(8'b0), .seize_serial_tx(1'b0), .serial_tx_data(8'b0), .serial_tx_strobe(1'b0),
+ .lcd_data_in_address(lcd_data_in_address), .lcd_data_in_data(lcd_data_in_data), .lcd_data_in_enable(lcd_data_in_enable),
+ .led_segment_bus(led_segment_bus), .led_digit_select(led_digit_select));
+endmodule