AbstractController_Trigger.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using Uestc.Auto6.Dso.ComModel;
  5. using Uestc.Auto6.Dso.Hardware.Calibration.Data.Base;
  6. namespace Uestc.Auto6.Dso.Hardware.Driver
  7. {
  8. internal record TrigSourceParams
  9. {
  10. public UInt32 AcqBd_TrigCtrl_1st_SourceWhichAdcStartWith0;
  11. public UInt32 ProcBd_TrigCtrl_1st_SourceWhichAcqBdStartWith0;
  12. public UInt32 ProcBd_TrigCtrl_2nd_SourceWhichChannelStartWith0;
  13. }
  14. internal abstract class AbstractController_Trigger
  15. {
  16. internal virtual int PrimaryClockPeriodByps => 4000;//当前系统时钟周期4000ps,频率250MHz
  17. public Dictionary<AnaChnlTimebaseIndex, Int32> InterpolationLevelDiscardNumTable = new Dictionary<AnaChnlTimebaseIndex, int>();
  18. protected virtual void ourConfigTriggerSource()
  19. {
  20. uint trigChannel = CurrentTrigSource();
  21. var currTrigSourceParams = Hd.currProduct!.Acquirer_AnalogChannel!.GetTrigSourceParams(trigChannel);
  22. //1.判断触发信号来自于采集板哪个ADC,所有采集板配置相同,所有被选中通道的触发信号都送到处理板做二次选择
  23. //相当于对应一个采集板上的哪个ADC。以触发的物理通道接入的那个ADC为准。ADC1:发0,ADC2:发1,两片:发0
  24. Hd.currProduct?.AcqBd?.WriteToAllFpga(AcqBdReg.W.TrigCtrl_1st_SourceSelect, (uint)currTrigSourceParams.AcqBd_TrigCtrl_1st_SourceWhichAdcStartWith0);
  25. //2.一级触发源:表示来自于那个采集板的信号。用0,1,2,表示。
  26. HdIO.WriteReg(ProcBdReg.W.TrigCtrl_1st_SourceControl, currTrigSourceParams.ProcBd_TrigCtrl_1st_SourceWhichAcqBdStartWith0);
  27. //二级触发,表示对应的物理通道,与DMA中的数据路数一致
  28. HdIO.WriteReg(ProcBdReg.W.TrigCtrl_2nd_SourceSelect, currTrigSourceParams.ProcBd_TrigCtrl_2nd_SourceWhichChannelStartWith0);
  29. //Hd.currProduct?.AcqBd?.WriteToAllFpga(0x92c4, 0);
  30. //Hd.currProduct?.AcqBd?.WriteToAllFpga(0x92b0, 0);
  31. //LA
  32. if (ChannelIdExt.IsDigital((ChannelId)trigChannel))
  33. {
  34. HdIO.WriteReg(ProcBdReg.W.LA_TrigSourceSel, (UInt32)((ChannelId)trigChannel - ChannelId.D1 + 1));
  35. }
  36. HdIO.WriteReg(ProcBdReg.W.LA_TrigEdgeSel, (UInt32)(((Hd.CurrHdMessage!.Trigger!.TrigType == TriggerType.Edge && ChannelIdExt.IsDigital((ChannelId)trigChannel) ? 1 : 0) << 1) | ((Hd.CurrHdMessage!.Trigger!.Edge!.Slope == EdgeSlope.Rise ? 1 : 0))));
  37. }
  38. protected virtual void ourConfigTriggerMode()
  39. {
  40. //触发模式,只能在FPGA端处理,故归入数字触发模块
  41. UInt32 trigMode = Hd.CurrHdMessage?.Trigger?.Mode == TriggerMode.Auto ? 1U : 0;
  42. //Hd.currProduct?.AcqBd?.WriteToAllFpga(AcqBdReg.W.TrigCtrl_AutoModeEnable, trigMode);//一级触发部分移至处理板
  43. HdIO.WriteReg(ProcBdReg.W.TrigCtrl_2nd_AutoModeEnable, trigMode);//2级触发模式
  44. HdIO.WriteReg(ProcBdReg.W.TrigCtrl_1st_AutoModeEnable, (200 << 1) | trigMode); //1级触发模式
  45. Hd.currProduct?.AcqBd?.WriteToAllFpga(AcqBdReg.W.LSCtrl_AutoTrigSet, (trigMode << 15) | 1);
  46. //Hd.currProduct?.AcqBd?.WriteToAllFpga(AcqBdReg.W.TrigCtrl_FindRange, 500);
  47. //HdIO.WriteReg(ProcBdReg.W.TrigCtrl_2nd_SearchRange, 5000);
  48. }
  49. protected virtual void ourConfigTriggerClock()
  50. {
  51. //AdjSource()
  52. }
  53. protected virtual void ourConfigHoldOff()
  54. {
  55. uint holdOfftime = (uint)(Hd.CurrHdMessage?.Trigger?.HoldoffByps ?? Constants.MIN_HOLDOFF_PS) / (UInt32)Hd.currProduct!.Ctrl_Trigger!.PrimaryClockPeriodByps;
  56. uint Eventcnt = (uint)(Hd.CurrHdMessage?.Trigger?.HoldoffByCnt ?? Constants.MIN_HOLDOFF_EVENT);
  57. if (Hd.CurrHdMessage?.Trigger?.HoldoffType == DelayOpt.Time)
  58. {
  59. Hd.currProduct!.AcqBd!.WriteToAllFpga(AcqBdReg.W.TrigCtrl_holdtime_widthL, holdOfftime & 0xffff);
  60. Hd.currProduct!.AcqBd!.WriteToAllFpga(AcqBdReg.W.TrigCtrl_holdtime_widthH, (holdOfftime >> 16) & 0xffff);
  61. Hd.currProduct!.AcqBd!.WriteToAllFpga(AcqBdReg.W.TrigCtrl_holdtime_set, 0);
  62. }
  63. else
  64. {
  65. Hd.currProduct!.AcqBd!.WriteToAllFpga(AcqBdReg.W.TrigCtrl_holdtime_widthL, Eventcnt & 0xffff);
  66. Hd.currProduct!.AcqBd!.WriteToAllFpga(AcqBdReg.W.TrigCtrl_holdtime_widthH, (Eventcnt >> 16) & 0xffff);
  67. Hd.currProduct!.AcqBd!.WriteToAllFpga(AcqBdReg.W.TrigCtrl_holdtime_set, 1);
  68. }
  69. HdIO.WriteReg(ProcBdReg.W.TrigCtrl_1st_HoldOffTimeL, 4 & 0xffff);
  70. HdIO.WriteReg(ProcBdReg.W.TrigCtrl_1st_HoldOffTimeH, (holdOfftime >> 16) & 0xffff);
  71. //原PutTSysHoldOff()
  72. }
  73. /// <summary>
  74. /// 采集Fifo阶段的深度
  75. /// </summary>
  76. protected virtual void ourConfigFifoStageDepth_WithAcqLength()
  77. {
  78. if (Hd.CurrHdMessage?.Timebase?.AcqLength != AnaChnlStorageMode.Long)
  79. {
  80. Int64 xdepth = Hd.currProduct!.Acquirer_AnalogChannel!.GetTrigXDepth();
  81. Int64 hardwareExtractNum = (Int64)(Hd.currProduct?.Acquirer_AnalogChannel?.AcquingParameters.HardwareExtractNum ?? 1);
  82. //xdepth = 1000;
  83. Int64 xdepth_tmp = hardwareExtractNum switch
  84. {
  85. 1 => xdepth / 80 + 19,
  86. 2 => xdepth * 2 / 80 + 19,
  87. _ => (Int64)(xdepth * (Int64)hardwareExtractNum / 80 + hardwareExtractNum * 3),
  88. };
  89. //xdepth_tmp = 500 * 2 / 80;
  90. HdIO.WriteReg(ProcBdReg.W.TrigCtrl_1st_PreDepthSetL, (UInt32)xdepth_tmp & 0xffff);
  91. HdIO.WriteReg(ProcBdReg.W.TrigCtrl_1st_PreDepthSetM, (UInt32)(xdepth_tmp >> 16) & 0xffff);
  92. HdIO.WriteReg(ProcBdReg.W.TrigCtrl_1st_PreDepthSetH, (UInt32)(xdepth_tmp >> 32) & 0xfff);
  93. HdIO.WriteReg(ProcBdReg.W.TrigCtrl_1st_PosDepthSetL, 0);
  94. HdIO.WriteReg(ProcBdReg.W.TrigCtrl_1st_PosDepthSetM, 0);
  95. HdIO.WriteReg(ProcBdReg.W.TrigCtrl_1st_PosDepthSetH, 0);
  96. //Hd.currProduct?.AcqBd?.WriteToAllFpga(AcqBdReg.W.TrigCtrl_PreDepth, (UInt32)xdepth);
  97. }
  98. else
  99. {
  100. // DDR中的数据分辨率已经确定,在此只需要发送抽点数就可以了。
  101. // DDR中触发点的时间已经确定,计算就可得到需要发送的触发位置了。
  102. }
  103. }
  104. internal static Int32 PerYDivAdcSamples = Constants.VIS_ADC_RES / Constants.VIS_YDIVS_NUM;
  105. internal static Int32 AdcCenterValue = Constants.MAX_ADC_RES / 2;
  106. internal virtual uint DefaultTrigSensitivity
  107. {
  108. get => Hd.currProduct!.Acquirer_AnalogChannel!.DefaultTrigSensitivity;
  109. }
  110. internal virtual uint CurrentTrigSource()
  111. {
  112. uint trigSource = (uint)(Hd.CurrHdMessage?.Trigger?.Edge?.Source ?? ChannelId.C1);
  113. switch (Hd.CurrHdMessage?.Trigger?.TrigType)
  114. {
  115. case TriggerType.Edge:
  116. trigSource = (uint)(Hd.CurrHdMessage?.Trigger?.Edge?.Source ?? ChannelId.C1);
  117. break;
  118. case TriggerType.PulseWidth:
  119. trigSource = (uint)(Hd.CurrHdMessage?.Trigger?.Pulse?.Source ?? ChannelId.C1);
  120. break;
  121. case TriggerType.Runt:
  122. trigSource = (uint)(Hd.CurrHdMessage?.Trigger?.Runt?.Source ?? ChannelId.C1);
  123. break;
  124. case TriggerType.Transition:
  125. trigSource = (uint)(Hd.CurrHdMessage?.Trigger?.Transition?.Source ?? ChannelId.C1);
  126. break;
  127. case TriggerType.SetupHold:
  128. trigSource = (uint)(Hd.CurrHdMessage?.Trigger?.SetupHold?.ClkSource ?? ChannelId.C1);//改了
  129. break;
  130. case TriggerType.Glitch:
  131. trigSource = (uint)(Hd.CurrHdMessage?.Trigger?.Glitch?.Source ?? ChannelId.C1);
  132. break;
  133. case TriggerType.Window:
  134. trigSource = (uint)(Hd.CurrHdMessage?.Trigger?.Window?.Source ?? ChannelId.C1);
  135. break;
  136. case TriggerType.TimeOut:
  137. trigSource = (uint)(Hd.CurrHdMessage?.Trigger?.TimeOut?.Source ?? ChannelId.C1);
  138. break;
  139. default:
  140. trigSource = (uint)(Hd.CurrHdMessage?.Trigger?.Edge?.Source ?? ChannelId.C1);
  141. break;
  142. }
  143. //if ((int)trigSource >= ChannelIdExt.AnaChnlNum)
  144. // trigSource = (uint)ChannelId.C1;
  145. return trigSource;
  146. }
  147. /// <summary>
  148. /// 配置数字触发相关参数。如丢点数,搜索宽度等。
  149. /// </summary>
  150. internal virtual void ourConfigDgtParameter()
  151. {
  152. Hd.currProduct?.AcqBd?.WriteToAllFpga(AcqBdReg.W.TrigCtrl_Location_TrigDiscardColumnEn, Hd.CurrDebugVarints!.bEnable_DigitTrigger ? 1U : 0);
  153. //HdIO.WriteReg(ProcBdReg.W.TrigCtrl_2nd_SerialTrigEnable, Hd.CurrDebugVarints!.bEnable_DigitTrigger ? 1U : 0);
  154. if (Hd.CurrHdMessage!.Trigger!.TrigType == TriggerType.Serial)
  155. HdIO.WriteReg(ProcBdReg.W.TrigCtrl_2nd_SerialTrigEnable, 0);
  156. var compVolt = Hd.currProduct!.Acquirer_AnalogChannel!.GetDigitTrigCompVolt();
  157. Hd.currProduct?.AcqBd?.WriteToAllFpga(AcqBdReg.W.TrigCtrl_1st_CompareVoltage1Up, (uint)(compVolt.Up));//0x87e
  158. Hd.currProduct?.AcqBd?.WriteToAllFpga(AcqBdReg.W.TrigCtrl_1st_CompareVoltage1Down, (uint)(compVolt.Dn));//0x74a
  159. Hd.currProduct?.AcqBd?.WriteToAllFpga(AcqBdReg.W.TrigCtrl_1st_EdgeSelect, compVolt.Edge);//compVolt.Edge
  160. HdIO.WriteReg(ProcBdReg.W.TrigCtrl_2nd_EdgeSelect, compVolt.Edge); //处理板二级触发边沿选择
  161. int trigSource = (int)CurrentTrigSource();
  162. if (trigSource < ChannelIdExt.AnaChnlNum)
  163. {
  164. if (Hd.CurrHdMessage!.Analog![trigSource].InputSource != AnaChnlIpnutSource.SMA)
  165. {
  166. HdIO.WriteReg(ProcBdReg.W.TrigCtrl_2nd_CompareVoltage1Up, (uint)(compVolt.Up)); //处理板二级触发迟滞高电平选择
  167. HdIO.WriteReg(ProcBdReg.W.TrigCtrl_2nd_CompareVoltage1Down, (uint)(compVolt.Dn)); //处理板二级触发迟滞低电平选择
  168. }
  169. }
  170. HdIO.WriteReg(ProcBdReg.W.TrigCtrl_1st_CaliTrigDelayEnable, 0);
  171. HdIO.WriteReg(ProcBdReg.W.TrigCtrl_1st_CalibrationNum, 0);
  172. }
  173. /// <summary>
  174. /// 开关数字触发
  175. /// </summary>
  176. /// <param name="bOpen"></param>
  177. protected virtual void ourSwitchDgtStatus(bool bOpen)
  178. {
  179. }
  180. #region TriggerTypeAndParameter
  181. protected virtual void ourConfigTypeAndParameter()
  182. {
  183. if (Hd.CurrHdMessage == null)
  184. return;
  185. TriggerType currType = Hd.CurrHdMessage?.Trigger?.TrigType ?? TriggerType.Edge;
  186. #region Step1 设置类型
  187. #endregion
  188. #region Step2 设置类型需要的参数
  189. if (triggerTypeDefineTable.ContainsKey(currType))
  190. {
  191. if (TriggerTypeDefineTable[currType].Value != null)
  192. TriggerTypeDefineTable[currType].Value.Invoke();
  193. }
  194. #endregion
  195. }
  196. #endregion
  197. //不同产品对改变进行不同的配置
  198. protected virtual Dictionary<TriggerType, KeyValuePair<UInt32/*FPGA Define Code ,see ....寄存器的说明*/, Action/*ConfigFunction*/>> TriggerTypeDefineTable
  199. {
  200. get => triggerTypeDefineTable;
  201. }
  202. private readonly Dictionary<TriggerType, KeyValuePair<UInt32/*FPGA Define Code ,see ....寄存器的说明*/, Action/*ConfigFunction*/>> triggerTypeDefineTable = new Dictionary<TriggerType, KeyValuePair<uint, Action>>();
  203. protected virtual void Init()
  204. {
  205. triggerTypeDefineTable.Clear();
  206. triggerTypeDefineTable.Add(TriggerType.Edge, new(0x01, CtrlTrigger_Standard.Config_Edge));
  207. triggerTypeDefineTable.Add(TriggerType.Glitch, new(0x02, CtrlTrigger_Standard.Config_Glitch));
  208. triggerTypeDefineTable.Add(TriggerType.MultiQulified, new(0x03, CtrlTrigger_Standard.Config_MultiQulified));
  209. triggerTypeDefineTable.Add(TriggerType.Pattern, new(0x04, CtrlTrigger_Standard.Config_Pattern));
  210. triggerTypeDefineTable.Add(TriggerType.PulseWidth, new(0x05, CtrlTrigger_Standard.Config_PulseWidth));
  211. triggerTypeDefineTable.Add(TriggerType.Runt, new(0x06, CtrlTrigger_Standard.Config_Runt));
  212. triggerTypeDefineTable.Add(TriggerType.Serial, new(0x07, CtrlTrigger_Standard.Config_Serial));
  213. triggerTypeDefineTable.Add(TriggerType.SetupHold, new(0x08, CtrlTrigger_Standard.Config_SetupHold));
  214. triggerTypeDefineTable.Add(TriggerType.State, new(0x09, CtrlTrigger_Standard.Config_State));
  215. triggerTypeDefineTable.Add(TriggerType.TimeOut, new(0x0a, CtrlTrigger_Standard.Config_TimeOut));
  216. triggerTypeDefineTable.Add(TriggerType.Transition, new(0x0b, CtrlTrigger_Standard.Config_Transition));
  217. triggerTypeDefineTable.Add(TriggerType.Video, new(0x0c, CtrlTrigger_Standard.Config_Video));
  218. triggerTypeDefineTable.Add(TriggerType.Window, new(0x0d, CtrlTrigger_Standard.Config_Window));
  219. triggerTypeDefineTable.Add(TriggerType.Interval, new(0x0e, CtrlTrigger_Standard.Config_Interval));
  220. }
  221. protected Action? _ConfigTriggerSource;
  222. protected Action? _ConfigTriggerMode;
  223. protected Action? _ConfigTriggerClock;
  224. protected Action? _ConfigHoldOff;
  225. protected Action? _ConfigDgtParameter;
  226. protected Action<bool>? _SwitchDgtStatus;
  227. protected Action? _ConfigTypeAndParameter;
  228. protected Action? _ConfigFifoStageDepth_WithAcqLength;
  229. public static void ConfigTriggerSource() => Hd.currProduct?.Ctrl_Trigger?._ConfigTriggerSource?.Invoke();
  230. public static void ConfigTriggerMode() => Hd.currProduct?.Ctrl_Trigger?._ConfigTriggerMode?.Invoke();
  231. public static void ConfigTriggerClock() => Hd.currProduct?.Ctrl_Trigger?._ConfigTriggerClock?.Invoke();
  232. public static void ConfigHoldOff() => Hd.currProduct?.Ctrl_Trigger?._ConfigHoldOff?.Invoke();
  233. public static void ConfigDgtParameter() => Hd.currProduct?.Ctrl_Trigger?._ConfigDgtParameter?.Invoke();
  234. public static void SwitchDgtStatus(bool bOpen) => Hd.currProduct?.Ctrl_Trigger?._SwitchDgtStatus?.Invoke(bOpen);
  235. public static void ConfigTypeAndParameter() => Hd.currProduct?.Ctrl_Trigger?._ConfigTypeAndParameter?.Invoke();
  236. public static void ConfigFifoStageDepth_WithAcqLength() => Hd.currProduct?.Ctrl_Trigger?._ConfigFifoStageDepth_WithAcqLength?.Invoke();
  237. public static Dictionary<AcqBdNo, int/**/> AcqBdProcBdLoopDelayOf4nsCount = new Dictionary<AcqBdNo, int>();
  238. public static void GetAcqBdProcBdLoopDelayOf4nsCount()
  239. {
  240. //
  241. }
  242. }
  243. }