updated code
diff --git a/verilog/rtl/gps_engine/codectrllogic.v b/verilog/rtl/gps_engine/codectrllogic.v
index 293ddd8..3f07daa 100644
--- a/verilog/rtl/gps_engine/codectrllogic.v
+++ b/verilog/rtl/gps_engine/codectrllogic.v
@@ -53,7 +53,9 @@
pnl,
epochrx,
code_sel,
-epoch
+epoch,
+irnss_sel,
+irnss_code
);
input res, nco_cod_clk1p0m, nco_cod_clk2p0m, acq;
@@ -63,6 +65,8 @@
output epochrx;
input [4:0] code_sel;
input epoch;
+input irnss_sel;
+input [10:1] irnss_code;
wire res;
wire nco_cod_clk1p0m;
@@ -92,7 +96,9 @@
code_sel,
pne,
pnp,
- pnl);
+ pnl,
+ irnss_sel,
+ irnss_code);
assign epoch1 = ~((epoch));
always @(negedge res or posedge nco_cod_clk2p0m) begin
diff --git a/verilog/rtl/gps_engine/codegen.v b/verilog/rtl/gps_engine/codegen.v
index c2f8bca..2dae782 100644
--- a/verilog/rtl/gps_engine/codegen.v
+++ b/verilog/rtl/gps_engine/codegen.v
@@ -42,7 +42,9 @@
code_sel,
pne,
pnp,
-pnl
+pnl,
+irnss_sel,
+irnss_code
);
input res, ncoclk, codeclk;
@@ -50,6 +52,8 @@
output epochrx;
input [4:0] code_sel;
output pne, pnp, pnl;
+input irnss_sel;
+input [10:1] irnss_code;
wire res;
wire ncoclk;
@@ -80,7 +84,9 @@
.car_change(car_change),
.epochrx(epochrx),
.code_sel(code_sel),
- .goldcode(prncode));
+ .goldcode(prncode),
+ .irnss_sel(irnss_sel),
+ .irnss_code(irnss_code));
always @(negedge res or posedge codeclk) begin
if(res == 1'b 0) begin
diff --git a/verilog/rtl/gps_engine/defines.v b/verilog/rtl/gps_engine/defines.v
new file mode 100644
index 0000000..9c3120c
--- /dev/null
+++ b/verilog/rtl/gps_engine/defines.v
@@ -0,0 +1,62 @@
+// SPDX-FileCopyrightText: 2020 Efabless Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+
+`default_nettype none
+
+`ifndef __GLOBAL_DEFINE_H
+// Global parameters
+`define __GLOBAL_DEFINE_H
+
+`define MPRJ_IO_PADS_1 19 /* number of user GPIO pads on user1 side */
+`define MPRJ_IO_PADS_2 19 /* number of user GPIO pads on user2 side */
+`define MPRJ_IO_PADS (`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2)
+
+`define MPRJ_PWR_PADS_1 2 /* vdda1, vccd1 enable/disable control */
+`define MPRJ_PWR_PADS_2 2 /* vdda2, vccd2 enable/disable control */
+`define MPRJ_PWR_PADS (`MPRJ_PWR_PADS_1 + `MPRJ_PWR_PADS_2)
+
+// Analog pads are only used by the "caravan" module and associated
+// modules such as user_analog_project_wrapper and chip_io_alt.
+
+`define ANALOG_PADS_1 5
+`define ANALOG_PADS_2 6
+
+`define ANALOG_PADS (`ANALOG_PADS_1 + `ANALOG_PADS_2)
+
+// Size of soc_mem_synth
+
+// Type and size of soc_mem
+// `define USE_OPENRAM
+`define USE_CUSTOM_DFFRAM
+// don't change the following without double checking addr widths
+`define MEM_WORDS 256
+
+// Number of columns in the custom memory; takes one of three values:
+// 1 column : 1 KB, 2 column: 2 KB, 4 column: 4KB
+`define DFFRAM_WSIZE 4
+`define DFFRAM_USE_LATCH 0
+
+// not really parameterized but just to easily keep track of the number
+// of ram_block across different modules
+`define RAM_BLOCKS 2
+
+// Clock divisor default value
+`define CLK_DIV 3'b010
+
+// GPIO conrol default mode and enable
+`define DM_INIT 3'b110
+`define OENB_INIT 1'b1
+
+`endif // __GLOBAL_DEFINE_H
diff --git a/verilog/rtl/gps_engine/goldcode.v b/verilog/rtl/gps_engine/goldcode.v
index 2aab9d5..fb7ac19 100644
--- a/verilog/rtl/gps_engine/goldcode.v
+++ b/verilog/rtl/gps_engine/goldcode.v
@@ -39,7 +39,9 @@
code_sel,
goldcode,
gold1,
-gold2
+gold2,
+irnss_sel,
+irnss_code
);
input reset, clk;
@@ -47,6 +49,8 @@
output epochrx;
input [4:0] code_sel;
output goldcode, gold1, gold2;
+input irnss_sel;
+input [10:1] irnss_code;
wire reset;
wire clk;
@@ -84,13 +88,15 @@
epochrx <= 1'b 0;
end
end
+ wire [10:1] code_wire;
+ assign code_wire = irnss_sel==1'b0 ? 10'b 1111111111 : irnss_code;
always @(negedge reset or posedge clk or posedge car_change) begin
if(reset == 1'b 0) begin
- g2codereg <= 10'b 1111111111;
+ g2codereg <= code_wire;
end
else if(car_change == 1'b 1) begin
- g2codereg <= 10'b 1111111111;
+ g2codereg <= code_wire;
end
else begin
g2codereg[1] <= g2codereg[2] ^ g2codereg[3] ^ g2codereg[6] ^ g2codereg[8] ^ g2codereg[9] ^ g2codereg[10];
@@ -106,172 +112,178 @@
end
else begin
// goldcode<='1';
- case(code_sel)
- 5'b 00001 : begin
- g2out <= g2codereg[2] ^ g2codereg[6];
+ if(irnss_sel == 1'b0) begin
+ case(code_sel)
+ 5'b 00001 : begin
+ g2out <= g2codereg[2] ^ g2codereg[6];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 00010 : begin
+ g2out <= g2codereg[3] ^ g2codereg[7];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 00011 : begin
+ g2out <= g2codereg[4] ^ g2codereg[8];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 00100 : begin
+ g2out <= g2codereg[5] ^ g2codereg[9];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 00101 : begin
+ g2out <= g2codereg[1] ^ g2codereg[9];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 00110 : begin
+ g2out <= g2codereg[2] ^ g2codereg[10];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 00111 : begin
+ g2out <= g2codereg[1] ^ g2codereg[8];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 01000 : begin
+ g2out <= g2codereg[2] ^ g2codereg[9];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 01001 : begin
+ g2out <= g2codereg[3] ^ g2codereg[10];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 01010 : begin
+ g2out <= g2codereg[2] ^ g2codereg[3];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 01011 : begin
+ g2out <= g2codereg[3] ^ g2codereg[4];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 01100 : begin
+ g2out <= g2codereg[5] ^ g2codereg[6];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 01101 : begin
+ g2out <= g2codereg[6] ^ g2codereg[7];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 01110 : begin
+ g2out <= g2codereg[7] ^ g2codereg[8];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 01111 : begin
+ g2out <= g2codereg[8] ^ g2codereg[9];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 10000 : begin
+ g2out <= g2codereg[9] ^ g2codereg[10];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 10001 : begin
+ g2out <= g2codereg[1] ^ g2codereg[4];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 10010 : begin
+ g2out <= g2codereg[2] ^ g2codereg[5];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 10011 : begin
+ g2out <= g2codereg[3] ^ g2codereg[6];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 10100 : begin
+ g2out <= g2codereg[4] ^ g2codereg[7];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 10101 : begin
+ g2out <= g2codereg[5] ^ g2codereg[8];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 10110 : begin
+ g2out <= g2codereg[6] ^ g2codereg[9];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 10111 : begin
+ g2out <= g2codereg[1] ^ g2codereg[3];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 11000 : begin
+ g2out <= g2codereg[4] ^ g2codereg[6];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 11001 : begin
+ g2out <= g2codereg[5] ^ g2codereg[7];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 11010 : begin
+ g2out <= g2codereg[6] ^ g2codereg[8];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 11011 : begin
+ g2out <= g2codereg[7] ^ g2codereg[9];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 11100 : begin
+ g2out <= g2codereg[8] ^ g2codereg[10];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 11101 : begin
+ g2out <= g2codereg[1] ^ g2codereg[6];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 11110 : begin
+ g2out <= g2codereg[1] ^ g2codereg[7];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 11111 : begin
+ g2out <= g2codereg[3] ^ g2codereg[8];
+ g1out <= g1codereg[10];
+ goldcode <= g1out ^ g2out;
+ end
+ 5'b 00000 : begin
+ g2out <= g2codereg[4] ^ g2codereg[9];
+ g1out <= g1codereg[10];
+ goldcode <= 1'b 1;
+ end
+ default : begin
+ g2out <= 1'b 1;
+ //edited intially commented originally '0'
+ end
+ endcase
+ end else begin
g1out <= g1codereg[10];
+ g2out <= g2codereg[10];
goldcode <= g1out ^ g2out;
end
- 5'b 00010 : begin
- g2out <= g2codereg[3] ^ g2codereg[7];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 00011 : begin
- g2out <= g2codereg[4] ^ g2codereg[8];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 00100 : begin
- g2out <= g2codereg[5] ^ g2codereg[9];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 00101 : begin
- g2out <= g2codereg[1] ^ g2codereg[9];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 00110 : begin
- g2out <= g2codereg[2] ^ g2codereg[10];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 00111 : begin
- g2out <= g2codereg[1] ^ g2codereg[8];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 01000 : begin
- g2out <= g2codereg[2] ^ g2codereg[9];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 01001 : begin
- g2out <= g2codereg[3] ^ g2codereg[10];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 01010 : begin
- g2out <= g2codereg[2] ^ g2codereg[3];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 01011 : begin
- g2out <= g2codereg[3] ^ g2codereg[4];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 01100 : begin
- g2out <= g2codereg[5] ^ g2codereg[6];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 01101 : begin
- g2out <= g2codereg[6] ^ g2codereg[7];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 01110 : begin
- g2out <= g2codereg[7] ^ g2codereg[8];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 01111 : begin
- g2out <= g2codereg[8] ^ g2codereg[9];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 10000 : begin
- g2out <= g2codereg[9] ^ g2codereg[10];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 10001 : begin
- g2out <= g2codereg[1] ^ g2codereg[4];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 10010 : begin
- g2out <= g2codereg[2] ^ g2codereg[5];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 10011 : begin
- g2out <= g2codereg[3] ^ g2codereg[6];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 10100 : begin
- g2out <= g2codereg[4] ^ g2codereg[7];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 10101 : begin
- g2out <= g2codereg[5] ^ g2codereg[8];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 10110 : begin
- g2out <= g2codereg[6] ^ g2codereg[9];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 10111 : begin
- g2out <= g2codereg[1] ^ g2codereg[3];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 11000 : begin
- g2out <= g2codereg[4] ^ g2codereg[6];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 11001 : begin
- g2out <= g2codereg[5] ^ g2codereg[7];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 11010 : begin
- g2out <= g2codereg[6] ^ g2codereg[8];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 11011 : begin
- g2out <= g2codereg[7] ^ g2codereg[9];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 11100 : begin
- g2out <= g2codereg[8] ^ g2codereg[10];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 11101 : begin
- g2out <= g2codereg[1] ^ g2codereg[6];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 11110 : begin
- g2out <= g2codereg[1] ^ g2codereg[7];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 11111 : begin
- g2out <= g2codereg[3] ^ g2codereg[8];
- g1out <= g1codereg[10];
- goldcode <= g1out ^ g2out;
- end
- 5'b 00000 : begin
- g2out <= g2codereg[4] ^ g2codereg[9];
- g1out <= g1codereg[10];
- goldcode <= 1'b 1;
- end
- default : begin
- g2out <= 1'b 1;
- //edited intially commented originally '0'
- end
- endcase
gold1 <= g1out;
gold2 <= g2out;
end
diff --git a/verilog/rtl/gps_engine/gps_multichannel.v b/verilog/rtl/gps_engine/gps_multichannel.v
index 8cabdfd..4b50c21 100644
--- a/verilog/rtl/gps_engine/gps_multichannel.v
+++ b/verilog/rtl/gps_engine/gps_multichannel.v
@@ -1,35 +1,31 @@
`timescale 1ns / 1ps
module gps_multichannel(
- mclr,
- mclk,
- adc2bit_i,
- adc2bit_q,
- codeout,
- epochrx,
- dll_sel, //Going to be a GPIO
- select_qmaxim,
- wb_clk_i, wb_rst_i, wb_adr_i, wb_dat_i, wb_dat_o,
- wb_we_i, wb_stb_i, wb_cyc_i, wb_ack_o
-);
-input mclr;
-input mclk;
-input [1:0] adc2bit_i;
-input [1:0] adc2bit_q;
-output codeout;
-input dll_sel;
-output epochrx; //Can be given to logic analyzer
-input select_qmaxim;
+ `ifdef USE_POWER_PINS
+ inout vccd1, // User area 1 1.8V supply
+ inout vssd1, // User area 1 digital ground
+ `endif
+
+input mclr,
+input mclk,
+input [1:0] adc2bit_i,
+input [1:0] adc2bit_q,
+output [7:0] codeout,
+input dll_sel,
+output [7:0] epochrx, //Can be given to logic analyzer
+input select_qmaxim,
//wishbone signals
- input wb_clk_i; // master clock input
- input wb_rst_i; // synchronous active high reset
- input [31:0] wb_adr_i; // lower address bits
- input [31:0] wb_dat_i; // databus input
- output [31:0] wb_dat_o; // databus output
- input wb_we_i; // write enable input
- input wb_stb_i; // stobe/core select signal
- input wb_cyc_i; // valid bus cycle input
- output wb_ack_o; // bus cycle acknowledge output
+ input wb_clk_i, // master clock input
+ input wb_rst_i, // synchronous active high reset
+ input [31:0] wb_adr_i, // lower address bits
+ input [31:0] wb_dat_i, // databus input
+ output [31:0] wb_dat_o, // databus output
+ input wb_we_i, // write enable input
+ input wb_stb_i, // stobe/core select signal
+ input wb_cyc_i, // valid bus cycle input
+ output wb_ack_o // bus cycle acknowledge output
+);
+
// Channel 1 GPS signals
@@ -40,26 +36,32 @@
wire dll_sel;
wire fll_enabl = 1'b 1;
wire costas_enabl = 1'b 1;
-wire epochrx;
+wire [7:0] epochrx;
+wire [7:0] codeout;
wire select_qmaxim;
wire ch1_select,ch2_select,ch3_select,ch4_select ;
wire ch5_select,ch6_select,ch7_select,ch8_select ;
+wire all_ch_select ;
wire ch1_wb_stb_i,ch2_wb_stb_i,ch3_wb_stb_i,ch4_wb_stb_i;
wire ch5_wb_stb_i,ch6_wb_stb_i,ch7_wb_stb_i,ch8_wb_stb_i;
wire ch1_wb_ack_o,ch2_wb_ack_o,ch3_wb_ack_o,ch4_wb_ack_o;
wire ch5_wb_ack_o,ch6_wb_ack_o,ch7_wb_ack_o,ch8_wb_ack_o;
+wire [31:0] ch1_wb_dat_o, ch2_wb_dat_o, ch3_wb_dat_o, ch4_wb_dat_o;
+wire [31:0] ch5_wb_dat_o, ch6_wb_dat_o, ch7_wb_dat_o, ch8_wb_dat_o;
// Module Address Select Logic
- assign ch1_select = (wb_adr_i[15:8] == 8'h0A) ;
- assign ch2_select = (wb_adr_i[15:8] == 8'h0B) ;
- assign ch3_select = (wb_adr_i[15:8] == 8'h0C) ;
- assign ch4_select = (wb_adr_i[15:8] == 8'h0D) ;
- assign ch5_select = (wb_adr_i[15:8] == 8'h0E) ;
- assign ch6_select = (wb_adr_i[15:8] == 8'h0F) ;
- assign ch7_select = (wb_adr_i[15:8] == 8'h10) ;
- assign ch8_select = (wb_adr_i[15:8] == 8'h11) ;
+ assign ch1_select = (wb_adr_i[31:8] == 24'h00000A) ;
+ assign ch2_select = (wb_adr_i[31:8] == 24'h00000B) ;
+ assign ch3_select = (wb_adr_i[31:8] == 24'h00000C) ;
+ assign ch4_select = (wb_adr_i[31:8] == 24'h00000D) ;
+ assign ch5_select = (wb_adr_i[31:8] == 24'h00000E) ;
+ assign ch6_select = (wb_adr_i[31:8] == 24'h00000F) ;
+ assign ch7_select = (wb_adr_i[31:8] == 24'h000010) ;
+ assign ch8_select = (wb_adr_i[31:8] == 24'h000011) ;
+
+ assign all_ch_select = {ch8_select,ch7_select,ch6_select,ch5_select,ch4_select,ch3_select,ch2_select,ch1_select};
// Module STROBE Select based on Address Range
assign ch1_wb_stb_i = (wb_stb_i && ch1_select) ;
@@ -78,8 +80,8 @@
.mclk(mclk),
.adc2bit_i(adc2bit_i),
.adc2bit_q(adc2bit_q),
- .epochrx(epochrx),
- .codeout(codeout),
+ .epochrx(epochrx[0]),
+ .codeout(codeout[0]),
.dll_sel1(dll_sel),
.fll_enabl(fll_enabl),
.costas_enabl(costas_enabl),
@@ -88,13 +90,175 @@
.wb_rst_i(wb_rst_i),
.wb_adr_i(wb_adr_i[7:0]),
.wb_dat_i(wb_dat_i),
- .wb_dat_o(wb_dat_o),
+ .wb_dat_o(ch1_wb_dat_o),
.wb_we_i(wb_we_i),
.wb_stb_i(ch1_wb_stb_i),
.wb_cyc_i(wb_cyc_i),
.wb_ack_o(ch1_wb_ack_o)
);
+gps_single_channel ch2(
+ .mclr(mclr),
+ .mclk(mclk),
+ .adc2bit_i(adc2bit_i),
+ .adc2bit_q(adc2bit_q),
+ .epochrx(epochrx[1]),
+ .codeout(codeout[1]),
+ .dll_sel1(dll_sel),
+ .fll_enabl(fll_enabl),
+ .costas_enabl(costas_enabl),
+ .select_qmaxim(select_qmaxim),
+ .wb_clk_i(wb_clk_i),
+ .wb_rst_i(wb_rst_i),
+ .wb_adr_i(wb_adr_i[7:0]),
+ .wb_dat_i(wb_dat_i),
+ .wb_dat_o(ch2_wb_dat_o),
+ .wb_we_i(wb_we_i),
+ .wb_stb_i(ch2_wb_stb_i),
+ .wb_cyc_i(wb_cyc_i),
+ .wb_ack_o(ch2_wb_ack_o)
+);
+gps_single_channel ch3(
+ .mclr(mclr),
+ .mclk(mclk),
+ .adc2bit_i(adc2bit_i),
+ .adc2bit_q(adc2bit_q),
+ .epochrx(epochrx[2]),
+ .codeout(codeout[2]),
+ .dll_sel1(dll_sel),
+ .fll_enabl(fll_enabl),
+ .costas_enabl(costas_enabl),
+ .select_qmaxim(select_qmaxim),
+ .wb_clk_i(wb_clk_i),
+ .wb_rst_i(wb_rst_i),
+ .wb_adr_i(wb_adr_i[7:0]),
+ .wb_dat_i(wb_dat_i),
+ .wb_dat_o(ch3_wb_dat_o),
+ .wb_we_i(wb_we_i),
+ .wb_stb_i(ch3_wb_stb_i),
+ .wb_cyc_i(wb_cyc_i),
+ .wb_ack_o(ch3_wb_ack_o)
+);
+gps_single_channel ch4(
+ .mclr(mclr),
+ .mclk(mclk),
+ .adc2bit_i(adc2bit_i),
+ .adc2bit_q(adc2bit_q),
+ .epochrx(epochrx[3]),
+ .codeout(codeout[3]),
+ .dll_sel1(dll_sel),
+ .fll_enabl(fll_enabl),
+ .costas_enabl(costas_enabl),
+ .select_qmaxim(select_qmaxim),
+ .wb_clk_i(wb_clk_i),
+ .wb_rst_i(wb_rst_i),
+ .wb_adr_i(wb_adr_i[7:0]),
+ .wb_dat_i(wb_dat_i),
+ .wb_dat_o(ch4_wb_dat_o),
+ .wb_we_i(wb_we_i),
+ .wb_stb_i(ch4_wb_stb_i),
+ .wb_cyc_i(wb_cyc_i),
+ .wb_ack_o(ch4_wb_ack_o)
+);
+gps_single_channel ch5(
+ .mclr(mclr),
+ .mclk(mclk),
+ .adc2bit_i(adc2bit_i),
+ .adc2bit_q(adc2bit_q),
+ .epochrx(epochrx[4]),
+ .codeout(codeout[4]),
+ .dll_sel1(dll_sel),
+ .fll_enabl(fll_enabl),
+ .costas_enabl(costas_enabl),
+ .select_qmaxim(select_qmaxim),
+ .wb_clk_i(wb_clk_i),
+ .wb_rst_i(wb_rst_i),
+ .wb_adr_i(wb_adr_i[7:0]),
+ .wb_dat_i(wb_dat_i),
+ .wb_dat_o(ch5_wb_dat_o),
+ .wb_we_i(wb_we_i),
+ .wb_stb_i(ch5_wb_stb_i),
+ .wb_cyc_i(wb_cyc_i),
+ .wb_ack_o(ch5_wb_ack_o)
+);
+gps_single_channel ch6(
+ .mclr(mclr),
+ .mclk(mclk),
+ .adc2bit_i(adc2bit_i),
+ .adc2bit_q(adc2bit_q),
+ .epochrx(epochrx[5]),
+ .codeout(codeout[5]),
+ .dll_sel1(dll_sel),
+ .fll_enabl(fll_enabl),
+ .costas_enabl(costas_enabl),
+ .select_qmaxim(select_qmaxim),
+ .wb_clk_i(wb_clk_i),
+ .wb_rst_i(wb_rst_i),
+ .wb_adr_i(wb_adr_i[7:0]),
+ .wb_dat_i(wb_dat_i),
+ .wb_dat_o(ch6_wb_dat_o),
+ .wb_we_i(wb_we_i),
+ .wb_stb_i(ch6_wb_stb_i),
+ .wb_cyc_i(wb_cyc_i),
+ .wb_ack_o(ch6_wb_ack_o)
+);
+gps_single_channel ch7(
+ .mclr(mclr),
+ .mclk(mclk),
+ .adc2bit_i(adc2bit_i),
+ .adc2bit_q(adc2bit_q),
+ .epochrx(epochrx[6]),
+ .codeout(codeout[6]),
+ .dll_sel1(dll_sel),
+ .fll_enabl(fll_enabl),
+ .costas_enabl(costas_enabl),
+ .select_qmaxim(select_qmaxim),
+ .wb_clk_i(wb_clk_i),
+ .wb_rst_i(wb_rst_i),
+ .wb_adr_i(wb_adr_i[7:0]),
+ .wb_dat_i(wb_dat_i),
+ .wb_dat_o(ch7_wb_dat_o),
+ .wb_we_i(wb_we_i),
+ .wb_stb_i(ch7_wb_stb_i),
+ .wb_cyc_i(wb_cyc_i),
+ .wb_ack_o(ch7_wb_ack_o)
+);
+gps_single_channel ch8(
+ .mclr(mclr),
+ .mclk(mclk),
+ .adc2bit_i(adc2bit_i),
+ .adc2bit_q(adc2bit_q),
+ .epochrx(epochrx[7]),
+ .codeout(codeout[7]),
+ .dll_sel1(dll_sel),
+ .fll_enabl(fll_enabl),
+ .costas_enabl(costas_enabl),
+ .select_qmaxim(select_qmaxim),
+ .wb_clk_i(wb_clk_i),
+ .wb_rst_i(wb_rst_i),
+ .wb_adr_i(wb_adr_i[7:0]),
+ .wb_dat_i(wb_dat_i),
+ .wb_dat_o(ch8_wb_dat_o),
+ .wb_we_i(wb_we_i),
+ .wb_stb_i(ch8_wb_stb_i),
+ .wb_cyc_i(wb_cyc_i),
+ .wb_ack_o(ch8_wb_ack_o)
+);
+always @ (all_ch_select,ch1_wb_dat_o,ch2_wb_dat_o,ch3_wb_dat_o,ch4_wb_dat_o,ch5_wb_dat_o,ch6_wb_dat_o,ch7_wb_dat_o,ch8_wb_dat_o)
+begin
+ case(all_ch_select)
+ 8'b00000001 : wb_dat_o <= ch1_wb_dat_o ;
+ 8'b00000010 : wb_dat_o <= ch2_wb_dat_o ;
+ 8'b00000100 : wb_dat_o <= ch3_wb_dat_o ;
+ 8'b00001000 : wb_dat_o <= ch4_wb_dat_o ;
+ 8'b00010000 : wb_dat_o <= ch5_wb_dat_o ;
+ 8'b00100000 : wb_dat_o <= ch6_wb_dat_o ;
+ 8'b01000000 : wb_dat_o <= ch7_wb_dat_o ;
+ 8'b10000000 : wb_dat_o <= ch8_wb_dat_o ;
+ default : wb_dat_o <= 32'd0 ;
+ endcase
+end
+
endmodule
diff --git a/verilog/rtl/gps_engine/gps_single_channel.v b/verilog/rtl/gps_engine/gps_single_channel.v
index 47b8a66..f90341a 100644
--- a/verilog/rtl/gps_engine/gps_single_channel.v
+++ b/verilog/rtl/gps_engine/gps_single_channel.v
@@ -62,6 +62,8 @@
wire dll_sel1;
wire fll_enabl;
wire costas_enabl;
+wire irnss_sel;
+wire [10:1] irnss_code;
wire [29:0] code_frequency ;
@@ -132,6 +134,7 @@
wire [2:0] adc3bit_qsel;
reg enable = 1'b 0;
+reg sat_change;
wire nco_car_clk1p4m;
wire nco_cod_clk1p0m;
@@ -160,6 +163,8 @@
reg count_reset = 1'b 0;
wire [19:0] integmag;
wire start;
+wire [4:0] satellite_id2;
+wire [4:0] satellite_id1;
assign fll_enable = acq & fll_enabl;
assign dll_enable = dll_sel1 & acq;
@@ -188,7 +193,8 @@
.carr_frequency_offset (carr_frequency_offset),
.acq_threshold (acq_threshold),
.sine_lut (sine_lut),
- .satellite_id (satellite_id),
+ .satellite_id1 (satellite_id1),
+ .satellite_id2 (satellite_id2),
.prompt_idata (prompt_idata),
.prompt_qdata (prompt_qdata),
.late_idata (late_idata),
@@ -196,7 +202,10 @@
.early_idata (early_idata),
.early_qdata (early_qdata),
.intg_ready (tr_len_clk1ms),
- .acq_complete (acq)
+ .acq_complete (acq),
+ .irnss_sel(irnss_sel),
+ .irnss_code(irnss_code),
+ .sat_change(sat_change)
);
// 2 to 3 bit conv for I-channel IF Input
@@ -341,7 +350,9 @@
.pnl(pnl1),
.epochrx(epochrx),
.code_sel(satellite_id), // ----- Declare confg_reg_1 in input
- .epoch(tr_epoclk_clk1ms)
+ .epoch(tr_epoclk_clk1ms),
+ .irnss_sel(irnss_sel), //To be declared as inputs
+ .irnss_code(irnss_code)
);
@@ -453,6 +464,25 @@
end
end
+ integer count_sat = 0;
+
+ always @(posedge tr_epoclk_clk1ms or negedge mclr) begin
+ if(mclr==1'b0) begin
+ count_sat = 0 ;
+ sat_change = 1'b0;
+ end
+ else begin
+ if (acq==1'b0 && count_sat<40920) begin
+ count_sat = count_sat + 1;
+ end else if(acq==1'b0 && count_sat==40920) begin
+ sat_change = ~sat_change ;
+ count_sat = 0;
+ end
+ end
+ end
+
+ assign satellite_id = sat_change == 1'b0 ? satellite_id1 : satellite_id2;
+
diff --git a/verilog/rtl/gps_engine/uprj_netlists.v b/verilog/rtl/gps_engine/uprj_netlists.v
new file mode 100644
index 0000000..3537de8
--- /dev/null
+++ b/verilog/rtl/gps_engine/uprj_netlists.v
@@ -0,0 +1,28 @@
+// SPDX-FileCopyrightText: 2020 Efabless Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+
+// Include caravel global defines for the number of the user project IO pads
+`include "defines.v"
+`define USE_POWER_PINS
+
+`ifdef GL
+ // Assume default net type to be wire because GL netlists don't have the wire definitions
+ `default_nettype wire
+ `include "gl/user_project_wrapper.v"
+ `include "gl/user_proj_example.v"
+`else
+ `include "user_project_wrapper.v"
+ `include "user_proj_example.v"
+`endif
\ No newline at end of file
diff --git a/verilog/rtl/gps_engine/wb_interface.v b/verilog/rtl/gps_engine/wb_interface.v
index 5858b25..8205b62 100644
--- a/verilog/rtl/gps_engine/wb_interface.v
+++ b/verilog/rtl/gps_engine/wb_interface.v
@@ -8,7 +8,8 @@
carr_frequency_offset,
acq_threshold,
sine_lut,
- satellite_id,
+ satellite_id1,
+ satellite_id2,
prompt_idata,
prompt_qdata,
late_idata,
@@ -16,7 +17,10 @@
early_idata,
early_qdata,
intg_ready,
- acq_complete
+ acq_complete,
+ irnss_sel,
+ irnss_code,
+ sat_change
);
@@ -37,7 +41,9 @@
output reg [29:0] carr_frequency_offset;
output reg [14:0] acq_threshold;
output reg [23:0] sine_lut;
-output reg [4:0] satellite_id;
+output reg [4:0] satellite_id1;
+output reg [4:0] satellite_id2;
+input sat_change;
input [19:0] prompt_idata ;
input [19:0] prompt_qdata;
input [19:0] late_idata;
@@ -46,6 +52,8 @@
input [19:0] early_qdata;
input intg_ready;
input acq_complete;
+output reg [10:1] irnss_code;
+output reg irnss_sel;
parameter CODE_FREQUENCY_REG_ADDR = 8'h00 ;
parameter CARR_FREQUENCY_REG_ADDR = 8'h04 ;
@@ -60,6 +68,8 @@
parameter EARLY_IDATA_REG_ADDR = 8'h28;
parameter EARLY_QDATA_REG_ADDR = 8'h2C;
parameter STATUS_REG_ADDR = 8'h30;
+parameter IRNSS_REG_ADDR = 8'h34;
+parameter SAT_REG_ADDR = 8'h38;
reg intg_ready_reg ;
reg intg_ready_ff1 ,intg_ready_ff2 ,intg_ready_ff3 ;
@@ -98,8 +108,11 @@
carr_frequency_offset <= #1 30'h00000000;
acq_threshold <= #1 15'h0000;
sine_lut <= #1 24'h000000;
- satellite_id <= #1 5'h00;
+ satellite_id1 <= #1 5'h00;
+ satellite_id2 <= #1 5'h00;
intg_ready_reg <= #1 1'b0;
+ irnss_sel <= #1 1'b0;
+ irnss_code <= #1 10'h000;
end
else begin
if (wb_wacc) begin
@@ -111,9 +124,14 @@
ACQ_THRESHOLD_REG_ADDR : acq_threshold <= #1 wb_dat_i[14:0];
CONFG_REG_ADDR : begin
sine_lut <= #1 wb_dat_i[23:0];
- satellite_id <= #1 wb_dat_i[28:24];
+ satellite_id1 <= #1 wb_dat_i[28:24];
end
STATUS_REG_ADDR : intg_ready_reg <= #1 wb_dat_i[0];
+ IRNSS_REG_ADDR : begin
+ irnss_sel <= #1 wb_dat_i[0];
+ irnss_code <= #1 wb_dat_i[10:1];
+ end
+ SAT_REG_ADDR : satellite_id2 <= #1 wb_dat_i[4:0];
default: ;
endcase
@@ -139,6 +157,7 @@
EARLY_IDATA_REG_ADDR : wb_dat_o <= { {12{1'b0}},early_idata};
EARLY_QDATA_REG_ADDR : wb_dat_o <= { {12{1'b0}},early_qdata};
STATUS_REG_ADDR : wb_dat_o <= { {30{1'b0}},acq_complete,intg_ready_reg};
+ SAT_REG_ADDR : wb_dat_o <= {{26{1'b0}},sat_change,satellite_id2};
default: ;
endcase
end