⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 agcctrl.v

📁 FPGA verilog
💻 V
字号:

module AGCCtrl
(
	EN, 
	CLK, 
	WR, 
	SetGain,
	Feed_K_Set,
	Feed_B_Set,
	AddrBus, 
	DataBus, 
	InputPwrAD, 
	OutputPwrAD, 
	Input_Samp_Start,
	Output_Samp_Start,
	A,
	B,
	Gain,
	POutsig, 
	Gain_Disp,
	POutsig_Disp,	
	InputPwrAsmW,
	OutputPwrAsmW,
	FeedForwardData);
	
	input 					EN;
	input 					CLK;
	input 					WR;
	input					SetGain;
	input 	[15:0] 			AddrBus;
	input 	[31:0] 			DataBus;
	input 	[11:0] 			InputPwrAD;
	input 	[11:0] 			OutputPwrAD;
	input 	[10:0]			Input_Samp_Start;
	input 	[10:0]			Output_Samp_Start;
	input	[31:0]			Feed_K_Set, 
							Feed_B_Set;

	input 	[31:0]			A;
	input 	[31:0]			B;
	output 	[31:0] 			Gain;
	output 	[31:0] 			POutsig;
	output 	[31:0] 			Gain_Disp;
	output 	[31:0] 			POutsig_Disp;
	output	[31:0]			InputPwrAsmW;
	output	[31:0]			OutputPwrAsmW;
	output 	[11:0] 			FeedForwardData;

	reg 	[31:0] 			POutsig;
	wire 	[31:0] 			Sig;
	wire	[11:0]			OutputDac;
	
	reg		[31:0]			GainReg;
	
	wire	[23:0]			InputPwr;
	wire	[23:0]			OutputPwr;
	wire	[31:0]			GainResult;
	
	reg		[10:0]			InputPwrADReg;
	reg		[10:0]			OutputPwrADReg;
	
	wire	[12:0]			Result0,Result1;
	wire	[48:0]			Result2;
	wire	[31:0]			Result3;
	
	reg		[23:0]			InputPwr0,OutputPwr0;
	reg		[11:0]			OutputDac0;
	
	reg						SetGainReg;
	wire					SetInputPwr,
							SetInputToDac,
							SetOutputPwr,
							SetEN;
	
	wire					FeedDataSet_Clk;
	wire	[10:0]			FeedDataSet_Addr;
	wire	[11:0]			FeedDataSet_Data;
	
	wire	[10:0]			Input_Addr;
	reg		[10:0]			AddrCounter;
	
	
	assign InputPwrAsmW = {8'h00,InputPwr0};
	assign OutputPwrAsmW = {8'h00,OutputPwr0};
	
	lpm_ram_24x2048 InputPwrmW(
				.data(DataBus[23:0]),
				.wren(SetInputPwr),
				.wraddress(AddrBus[12:2]),
				.rdaddress(Input_Addr),
				.wrclock(~WR),
				.rdclock(CLK),
				.q(InputPwr));

	lpm_ram_12x2048 InputToDac(
				.data(FeedDataSet_Data),
				.wren(SetGain|SetInputToDac),
				.wraddress(FeedDataSet_Addr),
				.rdaddress(InputPwrADReg),
				.wrclock(FeedDataSet_Clk),
				.rdclock(CLK),
				.q(OutputDac));

	lpm_ram_24x2048 OutputPwrmW(
				.data(DataBus[23:0]),
				.wren(SetOutputPwr),
				.wraddress(AddrBus[12:2]),
				.rdaddress(OutputPwrADReg),
				.wrclock(~WR),
				.rdclock(CLK),
				.q(OutputPwr));

	 Gain GainCalc(
				.CLK(CLK),
				.Pin(InputPwr),
				.Pout(OutputPwr),
				.A(A),
				.B(B),
				.Result(GainResult));

	//Psig = Pin*Gain
	PSig	PsigCalc(
				.CLK(CLK),
				.Gain(GainReg),
				.InputPwr(InputPwr0),
				.Result(Sig));

	lpm_sub_signed_13 sub0(
				.dataa({1'b0,InputPwrAD}),
				.datab({2'b00,Input_Samp_Start}),
				.result(Result0));

	lpm_sub_signed_13 sub1(
				.dataa({1'b0,OutputPwrAD}),
				.datab({2'b00,Output_Samp_Start}),
				.result(Result1));

	PwrFilter	PsigFilter(
					.CLK(CLK),
					.InputData(POutsig),
					.OutputData(POutsig_Disp));

	PwrFilter	GainFilter(
					.CLK(CLK),
					.InputData(GainReg),
					.OutputData(Gain_Disp));

	lpm_mult_signed_32x32_hard	b2v_inst2(.dataa({8'h00,InputPwr}),
					.datab(Feed_K_Set),
					.result(Result2));
					
	lpm_add_signed_32 add0(
				.dataa(Result2[31:0]),
				.datab(Feed_B_Set),
				.result(Result3));
	
	assign SetEN = (~EN)&(AddrBus[1:0]==2'b11);
	
	assign SetInputPwr = (AddrBus[15:13]==3'b101)&SetEN;

	assign SetInputToDac = (AddrBus[15:13]==3'b110)&SetEN;

	assign SetOutputPwr = (AddrBus[15:13]==3'b111)&SetEN;

	assign Gain = GainReg;
	
	assign FeedForwardData = OutputDac0;

	assign FeedDataSet_Addr = SetGainReg?AddrCounter:AddrBus[12:2];
	assign FeedDataSet_Data = SetGainReg?Result3[20:9]:DataBus[11:0];
	assign FeedDataSet_Clk = SetGainReg?CLK:(~WR);
	assign Input_Addr = SetGainReg?AddrCounter:InputPwrADReg;

	always @(posedge CLK)
	begin
		if (WR)
			SetGainReg <= SetGain;
	end
	
	always @(posedge CLK)
	begin
		if (SetGainReg)
			begin
				if (AddrCounter!=11'b11111111111)
					AddrCounter <= AddrCounter + 1'b1;
			end
		else
			AddrCounter <= 11'b00000000000;
	end
	
	always @(posedge CLK)
	begin
		InputPwr0 <= InputPwr;
		OutputPwr0 <= OutputPwr;
		OutputDac0 <= OutputDac;
		POutsig <= Sig;
		GainReg <= GainResult;
	end
	
	always @(Result0)
	begin
		if (Result0[12]==1)
			InputPwrADReg <= 11'd0;
		else if (Result0[11]==1)
			InputPwrADReg <= 11'd2047;
		else
			InputPwrADReg <= Result0[10:0];
	end

	always @(Result1)
	begin
		if (Result1[12]==1)
			OutputPwrADReg <= 11'd0;
		else if (Result1[11]==1)
			OutputPwrADReg <= 11'd2047;
		else
			OutputPwrADReg <= Result1[10:0];
	end
endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -