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