Преглед на файлове

Проект актуализирован до 4х портовой версии. Ведется доработка в части запуска от внешнего триггера.

ChStepan преди 1 година
родител
ревизия
646fc0cbe5

Файловите разлики са ограничени, защото са твърде много
+ 48 - 12
src/constrs/S5243Top.xdc


+ 4 - 4
src/src/InternalDsp/CordicNco.v

@@ -90,10 +90,10 @@ module CordicNco
 	assign precompAngle[11] = 32'd333772;
 	assign precompAngle[12] = 32'd166886;
 	assign precompAngle[13] = 32'd83443;
-	assign precompAngle[14] = 32'd41722;
-	assign precompAngle[15] = 32'd20861;
-	assign precompAngle[16] = 32'd10430;
-	assign precompAngle[17] = 32'd5215;
+	// assign precompAngle[14] = 32'd41722;
+	// assign precompAngle[15] = 32'd20861;
+	// assign precompAngle[16] = 32'd10430;
+	// assign precompAngle[17] = 32'd5215;
 	//assign precompAngle[18] = 32'd2608;
 
 	assign	Sin_o	=	WindVal_i	?	sin_o	:	14'h0;

+ 53 - 0
src/src/InternalDsp/Description.txt

@@ -0,0 +1,53 @@
+1. Модуль InternalDsp обертка в котором подключатся модули ЦОС системы.
+   Структура модуля следующая:
+		InternalDsp
+			MeasCtrlModule
+			WinParameters
+			Win_Calc
+			CordicNco
+				CordicRotation
+			ComplPrng
+			DspPipeline
+				SimpleMult
+				SummAcc
+				MyIntToFp
+				FpCustomMultipliter
+			AdcDataCalibration	
+
+2. Модуль ComplPrng генерирует случайную составляющую для подмешивания к полезному сигналу.
+3. Модуль CordicNco генерирует отсчеты Sin и Cos для реализации квадратурного демодулятора. Модуль реализован по алгоритму Cordic (см. в интернете).
+4. Модуль CordicRotation осуществляет поворот фазы при работе модуля CordicNco. 
+
+5. Модуль DspPipeline обертка для основных модулей ЦОС.
+   Модуль реализован в соответствии с документом Блок схема DSP S5435v4port.vsd.
+
+6. Модуль MeasCtrlModule - осуществляет контроль за запуском и остановкой измерений. Определяет режим работы системы из пришедших настроек.
+   
+7. Модуль NcoRstGen генерирует сигнал сброса для CordicNco. Каждый раз когда происходит переключение частоты ПЧ и приходит новое FreuencyTuningWord (FTW) для CordicNco, модуль отслеживает это, и послее переключеня ПЧ генерирует сброс NCO.
+8. Модуль Win_Calc генерирует цифровой фильтр для ЦОСа.
+   
+   Расчет фильтра реализован на основе приближения функции синуса полиномом 4 степени (про приближение полиномом искать в интернете).
+   Модуль может генерировать 3 вида фильтров:
+		1. Прямоугольное окно.
+		2. Sin^2 окно.
+		3. Окно Тьюки.
+   Исходя из выбранного фильтра определяется какое окно будет использоваться ЦОСом.
+   Фильтры 1Гц-300Кгц - окно Тьюки.
+   Фильтры 500КГц-2МГц - Sin^2 окно.
+   Фильтры 3МГц - 10МГц - прямоугольные окна. Прямоугольные окна подобраны по колличеству точек так, чтобы удвоенная составляющая сигнала, попадала строго в полосу подавления фильтра.
+   
+
+      
+9. Модуль WinParameters содержит таблицу с набором фильтров от 1Гц до 10МГц. Модуль выставляет на выходные линии параметры для расчета цифрового фильтра исходя из пришедшей команды.
+   Модуль выдает следующие параметры:
+		1. Фазовый инкремент.
+		2. Стартовый аргумент.
+		3. Колличество точек фильтра.
+		4. Нормировочный коэффициент фильтра.
+		5. Средний шум трассы цифрового фильтра.
+		
+10. Модуль AdcDataCalibration расчитывает постоянную составляющую в пришедшем сигнале. 
+	Алгоритм работы модуля:
+		1. Модуль накапливает в аккумуляторе выборку данных с АЦП.
+		2. Как только выборка накоплена, берется среднее значение по выборке. 
+		3. Значение выдается на выход модуля, чтобы в последствии вычесть её из полезного сигнала от АЦП.

+ 15 - 7
src/src/InternalDsp/DspPipeline.v

@@ -11,12 +11,14 @@ module DspPipeline
 	parameter	WindNormCoefWidth	=	32,
 	parameter	WindCorrCoefWidth	=	32,
 	parameter	IntermediateWidth	=	14,
-	parameter	FracWidth			=	51
+	// parameter	FracWidth			=	51
+	parameter	FracWidth			=	32
 )
 (
     input	Clk_i,
     input	Rst_i,
     input	Val_i,
+    input	MeasWindEnd_i,
     input	StartFpConv_i,
 	
 	input	[WindCorrCoefWidth-1:0]	FilterCorrCoef_i,
@@ -35,7 +37,7 @@ module DspPipeline
 //================================================================================
 //  LOCALPARAMS
 	localparam	NormResultWidth	=	AccWidth+WindNormCoefWidth;
-	localparam	AdcWindWidth	=	37;
+	localparam	AdcWindWidth	=	18;
 //================================================================================
 //  REG/WIRE 
 	wire	[AdcWindWidth-1:0]	adcWindResult;
@@ -47,7 +49,9 @@ module DspPipeline
 	wire	adcWindCosResultVal;
 	
 	wire	[AccWidth-1:0]	AccResultI;
+	wire	resultIVal;
 	wire	[AccWidth-1:0]	AccResultQ;
+	wire	resultQVal;
 	
 	wire	[ResultWidth-1:0]	NormResultI;
 	wire	NormResultIVal;
@@ -92,7 +96,7 @@ AdcWindMult
 (
 	.Rst_i		(Rst_i),
 	.Clk_i		(Clk_i),
-	.Val_i		(valRegReg),
+	.Val_i		(Val_i),
 	.FactorA_i	(AdcData_i),
 	.FactorB_i	(Wind_i),
 	.Result_o	(adcWindResult),
@@ -143,10 +147,12 @@ SummAccQ
 (
     .Clk_i		(Clk_i),
     .Rst_i		(Rst_i),
+	.AccZeroing_i		(MeasWindEnd_i),
     .Val_i		(adcWindSinResultVal),
 	
 	.Data_i		(adcWindSinResult[53:0]),
-	.Result_o	(AccResultQ)
+	.Result_o	(AccResultQ),
+	.ResultVal_o	(resultQVal)
 );
 
 SumAcc
@@ -158,10 +164,12 @@ SummAccI
 (
     .Clk_i		(Clk_i),
     .Rst_i		(Rst_i),
+    .AccZeroing_i		(MeasWindEnd_i),
     .Val_i		(adcWindCosResultVal),
 	
 	.Data_i		(adcWindCosResult[53:0]),
-	.Result_o	(AccResultI)
+	.Result_o	(AccResultI),
+	.ResultVal_o	(resultIVal)
 );
 
 //===============================InToFpConv=======================================
@@ -178,7 +186,7 @@ QToFp32
 	.Rst_i				(Rst_i),
 	.InData_i			(AccResultQ),
 	.AverageNoizeLvl_i	(AverageNoizeLvl_i),
-	.InDataVal_i		(StartFpConv_i),
+	.InDataVal_i		(resultQVal),
 	.OutData_o			(qFp32Result),
 	.OutDataVal_o		(qFp32ResultVal)
 );
@@ -196,7 +204,7 @@ IToFp32
 	.Rst_i				(Rst_i),
 	.InData_i			(AccResultI),
 	.AverageNoizeLvl_i	(AverageNoizeLvl_i),
-	.InDataVal_i		(StartFpConv_i),
+	.InDataVal_i		(resultIVal),
 	.OutData_o			(iFp32Result),
 	.OutDataVal_o		(iFp32ResultVal)
 );

+ 7 - 7
src/src/InternalDsp/InternalDsp.v

@@ -35,7 +35,7 @@ module InternalDsp
 	parameter	CmdDataRegWith		=	24,
 	parameter	IntermediateWidth	=	18,
 	parameter	CorrAdcDataWidth	=	20,
-	parameter	AccWidth			=	80
+	parameter	AccWidth			=	61
 )
 (
 	input	wire	Clk_i,
@@ -117,7 +117,7 @@ module InternalDsp
 	wire	[ChNum-1:0]	resultValBus;
 	
 	wire	measWind;
-	wire	measWindDelayed;
+	wire	measWindEnd;
 	wire	stopMeas;
 	wire	[1:0]	tukeyCtrl;
 	
@@ -228,9 +228,9 @@ MeasCtrlModule
 	.WindPhIncStart_i		(winPhIncStart),
 	.WindArg_o				(windArg),
 		
-	.StartFpConv_o			(StartFpConv),
+	.StartFpConv_o			(),
 	.MeasWind_o				(measWind),
-	.MeasWindDel_o			(measWindDelayed),
+	.MeasWindEnd_o			(measWindEnd),
 	.StopMeas_o				(stopMeas),
 	.MeasEnd_o				(MeasEnd_o),
 	.WinCtrl_o				(winCtrl),
@@ -264,7 +264,6 @@ WinParameters
 Win_calc	WinCalcInst
 (
 	.clk_i			(Clk_i),
-	.wind_clk		(WindCalcClk_i),
 	.filterCmd_i	(measCtrlReg[15-:8]),
 	.reset_i		(Rst_i),
 	.WinCtrl_i		(winCtrl),
@@ -294,7 +293,7 @@ CordicNco
 #(	
 	.ODatWidth	(NcoWidth),
 	.PhIncWidth	(WindNcoPhIncWidth),
-	.IterNum	(15),
+	.IterNum	(13),
 	.EnSinN		(0)
 )
 ncoInst
@@ -368,7 +367,8 @@ generate
 			.Clk_i				(Clk_i),
 			.Rst_i				(Rst_i),
 			.Val_i				(measWind),
-			.StartFpConv_i		(StartFpConv),
+			.MeasWindEnd_i		(measWindEnd),
+			.StartFpConv_i		(measWindEnd),
 			
 			.FilterCorrCoef_i	({filterCorrCoefHReg[0+:WindNcoPhIncWidth-CmdDataRegWith],filterCorrCoefLReg}),
 			// .FilterCorrCoef_i	(32'h3f800000),

+ 7 - 4
src/src/InternalDsp/MeasCtrlModule.v

@@ -44,7 +44,7 @@ module MeasCtrlModule
 	
 	output	StartFpConv_o,
 	output	MeasWind_o,
-	output	MeasWindDel_o,
+	output	MeasWindEnd_o,
 	output	StopMeas_o,
 	output	MeasEnd_o,
 	output	WinCtrl_o,
@@ -105,11 +105,14 @@ module MeasCtrlModule
 	wire	wideFilterFlag	=	(FilterCmd_i>=8'h54	&	FilterCmd_i!=8'h70);
 	
 	reg		sampleStrobeGenRst;
+	
+	wire	measWindOr	=	(measWind|measWindR);
 //================================================================================
 //  ASSIGNMENTS
 	assign	StartFpConv_o			=	startFpConvPipe	[2];
-	assign	MeasWind_o				=	measWind;
-	assign	MeasWindDel_o			=	measWindR;
+	// assign	MeasWind_o				=	measWind;
+	assign	MeasWind_o				=	measWindOr;
+	assign	MeasWindEnd_o			=	measWindEnd;
 	assign	StopMeas_o				=	pMeasEnd;
 	assign	MeasEnd_o				=	stopMeasCmd;
 	assign	WindArg_o				=	windArg;
@@ -173,7 +176,7 @@ module MeasCtrlModule
 	always	@(posedge	Clk_i)	begin
 		if	(!Rst_i)	begin
 			if	(measWindR)	begin
-				if	(pNumCnt	==	WindPointsNum_i-1)	begin
+				if	(pNumCnt	==	WindPointsNum_i-2)	begin
 					measWindEnd	<=	1'b1;
 				end	else	begin
 					measWindEnd	<=	1'b0;

+ 0 - 1
src/src/InternalDsp/Win_calc.v

@@ -21,7 +21,6 @@
 //////////////////////////////////////////////////////////////////////////////////
 module Win_calc	(
 	input			clk_i,
-	input			wind_clk,
 	input	[7:0]	filterCmd_i,
 	input			reset_i,
 	input			WinCtrl_i,

+ 6 - 0
src/src/Math/Description.txt

@@ -0,0 +1,6 @@
+1. Модуль FpCustomMultiplier выполняет перемножение чисел в формате fp32. Работа модуля реализована по стандарту перемножения числе в формате fp32. (читай там как работает). 
+2. Модуль MultModule выполняет умножение данных с текущего канала АЦП с сигналами Sin и Cos сгенерированным CordicNco. Умножение знаковых чисел в формате fixedPoint.
+   По сути это квадратурный демодулятор, на выходе модуля две шины данных - результаты перемножения AdcCos (I) и AdcSin(Q).
+3. Модуль MyIntToFp выполняет преобразование чисел в формат fp32 (вообще имеет перестраиваемые параметры числа бит отводимых под экспоненту и мантиссу).
+4. Модуль SimpleMult выполняет умножие знаковых чисел в формате fixedPoint.
+5. Модуль SumAcc является аккумулятором. Реализован как сумматор входных отсчетов. Суммирование ведется с учетом знаков.

+ 27 - 2
src/src/Math/SumAcc.v

@@ -7,9 +7,11 @@ module SumAcc
     input	Clk_i,
     input	Rst_i,
     input	Val_i,
+    input	AccZeroing_i,
 	input	[IDataWidth-1:0]	Data_i,
 	
-	output	[ODataWidth-1:0]	Result_o
+	output	[ODataWidth-1:0]	Result_o,
+	output	ResultVal_o
 );
 
 //================================================================================
@@ -21,18 +23,41 @@ module SumAcc
 	reg		resultVal;
 	wire	[ODataWidth-1:0]	extData	=	{{(ODataWidth - IDataWidth){Data_i[IDataWidth-1]}}, Data_i};	//sign extension
 	
+	reg		accZeroing;
+	reg		accZeroingR;
+	reg		accZeroingRR;
 //================================================================================
 //  ASSIGNMENTS
 	assign	Result_o	=	dataAcc;
+	assign	ResultVal_o	=	resultVal;
 //================================================================================
 //  CODING
+
+	always	@(posedge	Clk_i)	begin
+		if	(Rst_i)	begin
+			accZeroing		<=	0;
+			accZeroingR		<=	0;
+			accZeroingRR		<=	0;
+		end	else	begin
+			accZeroing		<=	AccZeroing_i;
+			accZeroingR		<=	accZeroing;
+			accZeroingRR	<=	accZeroingR;
+		end
+	end
+	
 	always	@(posedge	Clk_i)	begin
 		if	(Rst_i)	begin
 			dataAcc		<=	{ODataWidth{1'b0}};
 		end	else	if	(Val_i)	begin
-			dataAcc		<=	dataAcc+extData;
+			if	(!accZeroingRR)	begin
+				dataAcc		<=	dataAcc+extData;
+			end	else	begin
+				dataAcc		<=	0+extData;
+			end
+		resultVal	<=	accZeroingR;
 		end	else	begin
 			dataAcc		<=	0;
+			resultVal	<=	0;
 		end
 	end
 

+ 20 - 0
src/src/PulseMeas/Description.txt

@@ -0,0 +1,20 @@
+1. Модуль ActivePortSelector замыкает импульсы выбранного импульсного генератора, как модулирующий сигнал для выбранного порта (или нескольких портов).
+2. Модуль MeasStartEventGen выполняет синхронизацию сигналов запуска и генерирует общий, синхроннизированный сигнал зпуска системы.
+3. Модуль Mux является мультиплексором общего назначения. Благодаря наличию таких мультиплексоров система может гибко переконфигурироваться.
+   Все входные сигналы объединяются в шину, а на выход замыкается сигнал исходя из пришедней на модуль настройки.
+4. Модуль PGenRstGenerator генирирует сбросы для импульсных генераторов. Когда в ПО изменяется настройка импульсного генератора, DSP присылает и новые настройки, и команду в которой находятся биты указывающие на необходимость сброса конкретного(ых) генератора(ов).
+   В ответ на пришедшую команду, модуль генерирует сброс(ы) и перезаписывает команду в RegMap модуле. 
+   
+5. Модуль PulseGen генерирует ипульсы для режима импусльных измерений.
+   Всего у модуля есть 5 возможных режимов работы:
+   0 - Выключен.
+   1 - Шаблон 1 импульс.
+   2 - Шаблон 2 импульса.
+   3 - Шаблон 3 импульса.
+   4 - Burst режим для генерации N импульсов.
+   5 - Continious режим для бесконечной генерации импульсов.
+   
+   Про то как отгружаются и интерпретируются настройки ширины и длительности импульсов, а так же как задается период следования импульсов можно прочитать в протоколе обмена между ПО и DSP.
+   
+6. Модуль SampleStrobeGenRstDemux генерирует сброс конкретно для одного генератора, запускающего измерения. Выбор ведется исходя из настроек пришедших в командах конфигурации системы.
+7. Модуль TrigInt2Mux модуль является мультиплексором, который определяет относительно какого из импульсных генераторов будут синхронизироваться зпуски измерений в определенных режимах измерений.

+ 6 - 7
src/src/PulseMeas/MeasStartEventGen.v

@@ -65,24 +65,24 @@ module	MeasStartEventGen
 		end
 	end
 	
-	always	@(posedge	Clk_i)	begin
+	always	@(*)	begin
 		if	(!Rst_i)	begin
 			if	(StartMeasDsp_i)	begin
 				if	(measTrigPos)	begin
-					startMeasEvent	<=	1'b1;
-				end
+					startMeasEvent	=	MeasTrig_i;
+				end 
 			end	else	begin
-				startMeasEvent	<=	0;
+				startMeasEvent	=	0;
 			end
 		end	else	begin
-			startMeasEvent	<=	0;
+			startMeasEvent	=	0;
 		end
 	end
 	
 	always	@(*)	begin
 		if	(!Rst_i)	begin
 			if	(StartMeasDsp_i)	begin
-				if	(measTrigPos)	begin
+				if	(MeasTrig_i)	begin
 					initTrig	=	1'b1;
 				end	else	begin
 					initTrig	=	1'b0;
@@ -94,7 +94,6 @@ module	MeasStartEventGen
 			initTrig	=	0;
 		end
 	end
-
 endmodule
 
 

+ 51 - 25
src/src/PulseMeas/PulseGen.v

@@ -18,7 +18,7 @@
 // Additional Comments: 
 //
 //////////////////////////////////////////////////////////////////////////////////
-module	PulseGen	
+module	PulseGenNew	
 #(	
 	parameter	CmdRegWidth	=	32
 )
@@ -70,9 +70,12 @@ module	PulseGen
 	reg	[1:0]	nextState;
 	
 	reg		pulseDone;	
-	wire	delayDone	=	(currState	==	DELAY)?	delayCnt==currDelValue-1:1'b0;	
+	reg		delayDone;	
+	// wire	delayDone	=	(currState	==	DELAY)?	delayCnt==currDelValue-1:1'b0;	
 	
+	// wire	zeroDelay	=	(P1Del_i==0||P1Del_i==1);
 	wire	zeroDelay	=	(P1Del_i==0);
+	wire	singleDelay	=	(P1Del_i==1);
 	
 	reg	patternDone;
 
@@ -98,6 +101,19 @@ module	PulseGen
 //================================================================================
 //  CODING
 
+always	@(*)	begin
+	if	(!Rst_i)	begin
+		if	(Mode_i==0)	begin
+			delayDone=1'b0;
+		end	else	if	(Mode_i	>=1 & Mode_i<=3)	begin
+			delayDone=(delayCnt==currDelValue-2);
+		end	else	begin
+			delayDone=(delayCnt==currDelValue-1);
+		end
+	end	else	begin
+		delayDone=1'b0;
+	end
+end
 always	@(posedge	Clk_i)	begin
 	if	(!Rst_i)	begin
 		enPulseR	<=	EnPulse_i;
@@ -128,7 +144,7 @@ end
 
 always	@(posedge	Clk_i)	begin
 	if	(!Rst_i)	begin
-		if	(currState	==	PULSE)	begin
+		if	(pulse)	begin
 			widthCnt	<=	widthCnt+1;
 		end	else	begin
 			widthCnt	<=	0;
@@ -140,7 +156,7 @@ end
 
 always	@(*)	begin
 	if	(!Rst_i)	begin
-		if	(currState	==	PULSE)	begin
+		if	(pulse)	begin
 			if	(widthCnt==currWidthValue-1)	begin
 				pulseDone	=	1'b1;
 			end	else	begin
@@ -168,36 +184,36 @@ always	@(posedge	Clk_i)	begin
 	end
 end
 
-always	@(posedge	Clk_i)	begin
+always	@(*)	begin
 	if	(!Rst_i)	begin
 		if	(Mode_i	==	0)	begin
-				currDelValue	<=	0;
-				currWidthValue	<=	0;
+				currDelValue	=	0;
+				currWidthValue	=	0;
 		end	else	begin
 			if	(Mode_i	>=1 & Mode_i<=3)	begin
-				currDelValue	<=	delArray[pulseCnt];
-				currWidthValue	<=	widthArray[pulseCnt];
+				currDelValue	=	delArray[pulseCnt];
+				currWidthValue	=	widthArray[pulseCnt];
 			end	else	begin
 				if	(Mode_i	==	4|Mode_i	==	5)	begin
-					if	(currState	==	IDLE)	begin
-						currDelValue	<=	delArray[0];
-						currWidthValue	<=	widthArray[0];
-					end	else	if	(currState	==	PULSE	&	pulseDone)	begin
-						currDelValue	<=	delArray[1];
-						currWidthValue	<=	widthArray[0];
+					if	(pulseCnt==0)	begin
+						currDelValue	=	delArray[0];
+						currWidthValue	=	widthArray[0];
+					end	else	begin
+						currDelValue	=	delArray[1];
+						currWidthValue	=	widthArray[0];
 					end	
 				end
 			end
 		end
 	end	else	begin
-		currDelValue	<=	0;
-		currWidthValue	<=	0;
+		currDelValue	=	0;
+		currWidthValue	=	0;
 	end
 end
 
 always	@(*)	begin
 	if	(!Rst_i)	begin
-		if	(currState	!=	IDLE)	begin
+		// if	(currState	!=	IDLE)	begin
 			case(Mode_i)
 				8'd0:	begin
 							patternDone	=	0;
@@ -221,9 +237,9 @@ always	@(*)	begin
 							patternDone	=	0;
 						end
 			endcase
-		end	else	begin
-			patternDone	=	0;
-		end
+		// end	else	begin
+			// patternDone	=	0;
+		// end
 	end	else	begin
 		patternDone	=	0;
 	end
@@ -244,9 +260,15 @@ always	@(*)	begin
 	IDLE	:	begin
 					if (enPulseEn)	begin
 						if	(zeroDelay)	begin
-							nextState = PULSE;
-						end	else begin
-							nextState = DELAY;
+							if	(currWidthValue==1)	begin
+								nextState = DELAY;
+							end	else begin
+								nextState = PULSE;
+							end
+						end	else	if	(singleDelay)	begin
+							nextState	=	PULSE;
+						end	else	begin
+							nextState	=	DELAY;
 						end
 					end	else	begin
 						nextState = IDLE;
@@ -280,7 +302,11 @@ always	@(*)	begin
 		if	(Mode_i	!=	0)	begin
 			case(currState)
 				IDLE:	begin
-							pulse	=	1'b0;
+							if	(zeroDelay&enPulseEn)	begin
+								pulse	=	1'b1;
+							end	else	begin
+								pulse	=	1'b0;
+							end
 						end
 				DELAY:	begin
 							pulse	=	1'b0;

+ 0 - 314
src/src/PulseMeas/PulseGenV2.v

@@ -1,314 +0,0 @@
-//`timescale 1ns / 1ps
-//////////////////////////////////////////////////////////////////////////////////
-// Company: 
-// Engineer: 
-// 
-// Create Date:    10:02:35 04/20/2020 
-// Design Name: 
-// Module Name:    PulseGen 
-// Project Name: 
-// Target Devices: 
-// Tool versions: 
-// Description: 
-//
-// Dependencies: 
-//
-// Revision: 
-// Revision 0.01 - File Created
-// Additional Comments: 
-//
-//////////////////////////////////////////////////////////////////////////////////
-module	PulseGen	
-#(	
-	parameter	CmdRegWidth	=	32
-)
-(
-	input	Rst_i,
-	input	Clk_i,
-	input	EnPulse_i,
-	
-	input	PulsePol_i,
-	input	EnEdge_i,
-	input	[CmdRegWidth-29:0]	Mode_i,
-	input	[CmdRegWidth-1:0]	P1Del_i,
-	input	[CmdRegWidth-1:0]	P2Del_i,
-	input	[CmdRegWidth-1:0]	P3Del_i,
-	input	[CmdRegWidth-1:0]	P1Width_i,
-	input	[CmdRegWidth-1:0]	P2Width_i,
-	input	[CmdRegWidth-1:0]	P3Width_i,
-	
-	output	Pulse_o
-);	
-
-//================================================================================
-//  LOCALPARAM
-
-	localparam	IDLE	=	2'h0;
-	localparam	DELAY	=	2'h1;
-	localparam	PULSE	=	2'h2;
-	
-	localparam	DISABLED	=	8'd0;
-	localparam	SINGLE		=	8'd1;
-	localparam	DOUBLE		=	8'd2;
-	localparam	TRIPPLE		=	8'd3;
-	localparam	BURST		=	8'd4;
-	localparam	CONTINIOUS	=	8'd5;
-	
-//================================================================================
-	reg		pulse;
-	wire	[31:0]	delArray	[2:0];
-	wire	[31:0]	widthArray	[2:0];
-	
-	reg	[31:0]	pulseCnt;
-	reg	[31:0]	delayCnt;
-	reg	[31:0]	widthCnt;
-	
-	reg	[31:0]	currWidthValue;
-	reg	[31:0]	currDelValue;
-
-	reg	[1:0]	currState;
-	reg	[1:0]	nextState;
-	
-	reg		pulseDone;	
-	wire	delayDone	=	(currState	==	DELAY)?	delayCnt==currDelValue-1:1'b0;	
-	
-	wire	zeroDelay	=	(P1Del_i==0);
-	
-	reg	patternDone;
-
-	reg	enPulseR;
-	
-	wire	enPulsePos	=	(!enPulseR&EnPulse_i);
-	wire	enPulseNeg	=	(enPulseR&!EnPulse_i);
-	
-	wire	enPulse		=	(EnEdge_i)?	enPulseNeg:enPulsePos;
-	wire	enPulseEn	=	(Mode_i	!=	0)?	enPulse:1'b0;
-//================================================================================
-//  ASSIGNMENTS
-	assign	delArray	[0]	=	P1Del_i;
-	assign	delArray	[1]	=	P2Del_i;
-	assign	delArray	[2]	=	P3Del_i;
-	
-	assign	widthArray	[0]	=	P1Width_i;
-	assign	widthArray	[1]	=	P2Width_i;
-	assign	widthArray	[2]	=	P3Width_i;
-	
-	assign	Pulse_o	=	(PulsePol_i)?	~pulse:pulse;
-
-//================================================================================
-//  CODING
-
-always	@(posedge	Clk_i)	begin
-	if	(!Rst_i)	begin
-		enPulseR	<=	EnPulse_i;
-	end	else	begin
-		enPulseR	<=	1'b0;
-	end
-end
-
-always	@(posedge	Clk_i)	begin
-	if	(!Rst_i)	begin
-		if	(Mode_i	>=1 & Mode_i<=3)	begin	
-			if	(currState	!=	IDLE)	begin
-				delayCnt	<=	delayCnt+1;
-			end	else	begin
-				delayCnt	<=	0;
-			end
-		end	else	begin
-			if	(currState	==	DELAY)	begin
-				delayCnt	<=	delayCnt+1;
-			end	else	begin
-				delayCnt	<=	0;
-			end
-		end
-	end	else	begin
-		delayCnt	<=	0;
-	end
-end
-
-always	@(posedge	Clk_i)	begin
-	if	(!Rst_i)	begin
-		if	(currState	==	PULSE)	begin
-			widthCnt	<=	widthCnt+1;
-		end	else	begin
-			widthCnt	<=	0;
-		end
-	end	else	begin
-		widthCnt	<=	0;
-	end
-end
-
-always	@(*)	begin
-	if	(!Rst_i)	begin
-		if	(currState	==	PULSE)	begin
-			if	(widthCnt==currWidthValue-1)	begin
-				pulseDone	=	1'b1;
-			end	else	begin
-				pulseDone	=	1'b0;
-			end
-		end	else	begin
-			pulseDone	=	1'b0;
-		end
-	end	else	begin
-		pulseDone	=	1'b0;
-	end
-end
-
-always	@(posedge	Clk_i)	begin
-	if	(!Rst_i)	begin
-		if	(pulseDone)	begin
-			if	(!patternDone)	begin
-				pulseCnt	<=	pulseCnt+1;
-			end	else	begin
-				pulseCnt	<=	0;
-			end
-		end
-	end	else	begin
-		pulseCnt	<=	0;
-	end
-end
-
-always	@(posedge	Clk_i)	begin
-	if	(!Rst_i)	begin
-		if	(Mode_i	==	0)	begin
-				currDelValue	<=	0;
-				currWidthValue	<=	0;
-		end	else	begin
-			if	(Mode_i	>=1 & Mode_i<=3)	begin
-				currDelValue	<=	delArray[pulseCnt];
-				currWidthValue	<=	widthArray[pulseCnt];
-			end	else	begin
-				if	(Mode_i	==	4|Mode_i	==	5)	begin
-					if	(currState	==	IDLE)	begin
-						currDelValue	<=	delArray[0];
-						currWidthValue	<=	widthArray[0];
-					end	else	if	(currState	==	PULSE	&	pulseDone)	begin
-						currDelValue	<=	delArray[1];
-						currWidthValue	<=	widthArray[0];
-					end	
-				end
-			end
-		end
-	end	else	begin
-		currDelValue	<=	0;
-		currWidthValue	<=	0;
-	end
-end
-
-always	@(*)	begin
-	if	(!Rst_i)	begin
-		if	(currState	!=	IDLE)	begin
-			case(Mode_i)
-				8'd0:	begin
-							patternDone	=	0;
-						end
-				8'd1:	begin
-							patternDone	=	((pulseCnt==Mode_i-1)&pulseDone);
-						end
-				8'd2:	begin
-							patternDone	=	((pulseCnt==Mode_i-1)&pulseDone);
-						end
-				8'd3:	begin
-							patternDone	=	((pulseCnt==Mode_i-1)&pulseDone);
-						end
-				8'd4:	begin
-							patternDone	=	((pulseCnt==P2Width_i-1)&pulseDone);
-						end
-				8'd5:	begin
-							patternDone	=	0;
-						end
-				default	:begin
-							patternDone	=	0;
-						end
-			endcase
-		end	else	begin
-			patternDone	=	0;
-		end
-	end	else	begin
-		patternDone	=	0;
-	end
-end
-
-	
-always	@(posedge	Clk_i)	begin
-	if	(!Rst_i)	begin
-		currState	<=	nextState;
-	end	else	begin
-		currState	<=	IDLE;
-	end
-end
-
-always	@(*)	begin
-	nextState	=	IDLE;
-	case(currState)
-	IDLE	:	begin
-					if (enPulseEn)	begin
-						if	(zeroDelay)	begin
-							nextState = PULSE;
-						end	else begin
-							nextState = DELAY;
-						end
-					end	else	begin
-						nextState = IDLE;
-					end
-				end
-				
-	DELAY	:	begin
-					if	(delayDone)	begin
-						nextState = PULSE;
-					end	else begin
-						nextState = DELAY;
-					end
-				end
-
-	PULSE	:	begin
-					if	(pulseDone)	begin
-						if	(!patternDone)	begin
-							nextState  = DELAY;
-						end	else begin
-							nextState  = IDLE;
-						end
-					end	else	begin
-						nextState  = PULSE;
-					end
-				end
-	endcase
-end
-
-always	@(*)	begin
-	if	(!Rst_i)	begin
-		if	(Mode_i	!=	0)	begin
-			case(currState)
-				IDLE:	begin
-							pulse	=	1'b0;
-						end
-				DELAY:	begin
-							pulse	=	1'b0;
-						end
-				PULSE:	begin
-							pulse	=	1'b1;
-						end
-				default:begin
-							pulse	=	1'b0;
-						end
-			endcase
-		end	else	begin
-			pulse	=	1'b0;
-		end	
-	end	else	begin
-		pulse	=	1'b0;
-	end
-end
-
-endmodule
-
-
-
-
-
-
-
-
-
-
-

+ 1 - 1
src/src/Top/S5243Top.v

@@ -1178,7 +1178,7 @@ PulseGenMux
 	.MuxOut_o		(pgMuxedOut[j])
 );	
 
-PulseGen
+PulseGenNew
 #(	
 	.CmdRegWidth	(CmdRegWidth)
 )