Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
b772052b4This file is pinned to the selected release. Download the original to open it in your design tool.
`include "../common.sv"
`include "../chapter4/counter.sv"
`include "../chapter7/fir.sv"
`include "../chapter7/dds.sv"
`include "../chapter7/intp_deci.sv"
`include "../chapter8/man_coding.sv"
`timescale 1ns/100ps
`default_nettype none
module TestBPSK;
import SimSrcGen::*;
logic clk, rst;
initial GenClk(clk, 80, 100);
initial GenRst(clk, rst, 2, 10);
// ====== trans side ======
logic bb_en;
Counter #(4) cntBb(clk, rst, 1'b1, , bb_en);
logic [3:0] cnt_dr;
logic dr_en; // data rate : 2.5 Mbps
Counter #(10) cntDr(clk, rst, bb_en, cnt_dr, dr_en);
wire dr_en180 = bb_en & (cnt_dr == 4);
logic [7:0] lfsr_out;
LFSR #(8, 9'h11d >> 1, 8'hff) lfsrDGen(
clk, rst, dr_en, lfsr_out);
logic dman;
ManchesterEncoder theManEnc(
clk, rst, dr_en, dr_en180, lfsr_out[0], , dman, );
logic signed [11:0] bpsk_if;
BPSKMod #(12, 24) bpskMod(
clk, rst, bb_en, 1'b1, 24'sd3355443, dman, bpsk_if);
// ====== if channel ======
logic signed [11:0] noi = '0, bpsk_if_noi;
integer noi_seed = 2327489;
always_comb begin
noi = $dist_normal(noi_seed, 0, 50);
bpsk_if_noi = (bpsk_if >>> 1) + noi;
end
// ====== recv side ======
logic signed [11:0] bpsk_if_fil;
FIR #(12, 104, '{ // if band pass : 12/14 - 26\28M, @100Msps
-0.0003, 0.0004,-0.0002, 0.0006, 0.0028, 0.0014,-0.0055,-0.0071,
0.0034, 0.0119, 0.0036,-0.0089,-0.0070, 0.0017, 0.0009,-0.0012,
0.0063, 0.0088,-0.0037,-0.0114,-0.0026, 0.0029,-0.0020, 0.0027,
0.0142, 0.0055,-0.0148,-0.0126, 0.0030, 0.0010,-0.0028, 0.0150,
0.0211,-0.0092,-0.0283,-0.0066, 0.0073,-0.0057, 0.0076, 0.0406,
0.0161,-0.0449,-0.0396, 0.0096, 0.0016,-0.0116, 0.0678, 0.1075,
-0.0556,-0.2208,-0.0774, 0.2155, 0.2155,-0.0774,-0.2208,-0.0556,
0.1075, 0.0678,-0.0116, 0.0016, 0.0096,-0.0396,-0.0449, 0.0161,
0.0406, 0.0076,-0.0057, 0.0073,-0.0066,-0.0283,-0.0092, 0.0211,
0.0150,-0.0028, 0.0010, 0.0030,-0.0126,-0.0148, 0.0055, 0.0142,
0.0027,-0.0020, 0.0029,-0.0026,-0.0114,-0.0037, 0.0088, 0.0063,
-0.0012, 0.0009, 0.0017,-0.0070,-0.0089, 0.0036, 0.0119, 0.0034,
-0.0071,-0.0055, 0.0014, 0.0028, 0.0006,-0.0002, 0.0004,-0.0003
}) regAmIfFilter(clk, rst, 1'b1, bpsk_if_noi, bpsk_if_fil);
logic signed [11:0] locar;
DDS #(24, 12, 14) localCar(
clk, rst, 1'b1, 24'sd3355443, 24'(int'(-0.5*2**24)), locar);
logic dman_recv;
BPSKDemod #(12) bpskDemod(
clk, rst, 1'b1, bb_en, bpsk_if_fil, locar, dman_recv);
logic bs_recv, bs_valid;
DiffManDecoder #(10) dmanDec(
clk, rst, bb_en, dman_recv, bs_recv, bs_valid);
endmodule
module BPSKMod #( parameter DW=12, PW=24 )(
input wire clk, rst, bb_en, if_en, // bb sr = 1/4 if sr
input wire signed [PW-1:0] carr_freq, // freq / fs * 2^PW
input wire bin, // m[n], Q1.W-1
output logic signed [DW-1:0] modout // s_BPSK Q1.W-1
);
logic signed [DW-1:0] phase, ph_fil, ph_intp, ph_if;
always_ff@(posedge clk) begin
// pi/2 -pi/2
phase <= bin ? DW'(1) <<< (DW-2) : DW'(-1) <<< (DW-2);
end
FIR #(DW, 56, '{ // base band pass: 0/1-5\6 MHz @ 25MHz
-0.0001, 0.0037, 0.0096, 0.0116, 0.0056,-0.0025,-0.0021, 0.0062,
0.0084,-0.0029,-0.0140,-0.0088, 0.0038,-0.0010,-0.0246,-0.0361,
-0.0179,-0.0002,-0.0214,-0.0621,-0.0617,-0.0125, 0.0076,-0.0589,
-0.1366,-0.0790, 0.1393, 0.3473, 0.3473, 0.1393,-0.0790,-0.1366,
-0.0589, 0.0076,-0.0125,-0.0617,-0.0621,-0.0214,-0.0002,-0.0179,
-0.0361,-0.0246,-0.0010, 0.0038,-0.0088,-0.0140,-0.0029, 0.0084,
0.0062,-0.0021,-0.0025, 0.0056, 0.0116, 0.0096, 0.0037,-0.0001
}) bbFilter(clk, rst, bb_en, phase, ph_fil);
InterpDeci #(DW) intp4x(clk, rst, bb_en, if_en, ph_fil, ph_intp);
FIR #(DW, 23, '{ // low pass: 6\19 MHz @ 100MHz
0.0005, 0.0021, 0.0033, 0.0000,-0.0105,-0.0240,-0.0263, 0.0000,
0.0623, 0.1467, 0.2208, 0.2503, 0.2208, 0.1467, 0.0623, 0.0000,
-0.0263,-0.0240,-0.0105, 0.0000, 0.0033, 0.0021, 0.0005
}) intpFilter(clk, rst, if_en, ph_intp, ph_if);
logic signed [PW-1:0] dds_phase;
always_ff@(posedge clk) begin
// comp intp attn, align to PW,+ pi/2
dds_phase <= ((PW'(ph_if)<<<2)<<<(PW-DW))+(PW'(1)<<<(PW-2));
end
DDS #(PW, DW, DW+2) carrierDDS(
clk, rst, if_en, carr_freq, dds_phase, modout);
endmodule
module BPSKDemod #( parameter W = 12 )(
input wire clk, rst, if_en, bb_en,
input wire signed [W-1:0] in, locar,
output logic out
);
logic signed [W-1:0] mix;
always_ff@(posedge clk) begin
mix <= ((2*W)'(in) * locar) >>> (W-1);
end
logic signed [W-1:0] deci_fil;
FIR #(W, 23, '{ // low pass: 6\19 MHz @ 100MHz
0.0005, 0.0021, 0.0033, 0.0000,-0.0105,-0.0240,-0.0263, 0.0000,
0.0623, 0.1467, 0.2208, 0.2503, 0.2208, 0.1467, 0.0623, 0.0000,
-0.0263,-0.0240,-0.0105, 0.0000, 0.0033, 0.0021, 0.0005
}) deciFilter(clk, rst, if_en, mix, deci_fil);
logic signed [W-1:0] bb_ana;
FIR #(W, 56, '{ // base band pass: 0/1-5\6 MHz @ 25MHz
-0.0001, 0.0037, 0.0096, 0.0116, 0.0056,-0.0025,-0.0021, 0.0062,
0.0084,-0.0029,-0.0140,-0.0088, 0.0038,-0.0010,-0.0246,-0.0361,
-0.0179,-0.0002,-0.0214,-0.0621,-0.0617,-0.0125, 0.0076,-0.0589,
-0.1366,-0.0790, 0.1393, 0.3473, 0.3473, 0.1393,-0.0790,-0.1366,
-0.0589, 0.0076,-0.0125,-0.0617,-0.0621,-0.0214,-0.0002,-0.0179,
-0.0361,-0.0246,-0.0010, 0.0038,-0.0088,-0.0140,-0.0029, 0.0084,
0.0062,-0.0021,-0.0025, 0.0056, 0.0116, 0.0096, 0.0037,-0.0001
}) bbFilter(clk, rst, bb_en, deci_fil, bb_ana);
HystComp #(12, 0.1) hystComp(clk, rst, bb_en, bb_ana, out);
endmodule