FPGA SDR(32)ステレオ復調用NCO
パイロット信号を検出するための19kHzのSIN信号と、L-R信号を同期検波するための38kHzのSIN信号を出力するNCOを作ります。38kHzのSIN信号は19kHzのSIN、COSからも作れますが、乗算器を節約するためSINテーブルを読み出すアドレスを1ビットシフトすることでSIN(2X)の信号にします。
SINテーブル用の2ポートROMとMIFファイルは、FPGAラジオ(13)自作NCO と同じです。
SIN(X)用のアドレスを1ビットシフトしてSIN(2X)用のアドレスを作ります。
assign sin2x_addr = addr << 1;
`timescale 1ns/1ns module MyNCO2X #( parameter OUT_WIDTH = 10 ) ( input wire clk, input wire clken, input wire [31:0] phi_inc_i, output wire [OUT_WIDTH-1:0] fsin_o, output wire [OUT_WIDTH-1:0] fsin2x_o, output wire out_valid, input wire reset_n ); wire [17:0] sin2x; wire [17:0] sin; reg [31:0] addr; wire [31:0] sin2x_addr; assign out_valid = 1'b1; always @(posedge clk) begin if (~reset_n) begin addr <= 0; end else if (clken) begin addr <= addr + phi_inc_i; end end assign sin2x_addr = addr << 1; rom2sin rom2sin_inst ( .address_a ( addr[31 -: 12] ), .address_b ( sin2x_addr[31 -: 12] ), .clock ( clk ), .q_a ( sin ), .q_b ( sin2x ) ); assign fsin2x_o = sin2x[17 -: OUT_WIDTH]; assign fsin_o = sin[17 -: OUT_WIDTH]; endmodule