using System; using System.Collections.Generic; using System.Linq; using System.Threading; using Uestc.Auto6.Dso.ComModel; using Uestc.Auto6.Dso.MathExt; using System.IO; namespace Uestc.Auto6.Dso.Hardware.Driver { internal class AWG { #region 寄存器定义 public const UInt32 PLL_SYNC = 0x0835;//835?? private const UInt32 PLL_EN_7044 = 0x084A;// private const UInt32 PLL_DATA_7044L = 0x084B;// private const UInt32 PLL_DATA_7044H = 0x084C;// private const UInt32 Awg_awg_addr_ctrl = 0X8800 | (((0XED & 0XFF) << 2) | ((0XED & 0X100) << 6));// public const UInt32 DAC_SEND_EN = 0x0066; public const UInt32 DAC_DATA_L = 0x0067; public const UInt32 DAC_DATA_H = 0x0068; public const UInt32 DAC_RESET = 0x0069; public const UInt32 tx_reset = 0x006a; public const UInt32 axi_aresetn = 0x006b; public const UInt32 axi_txn_write = 0x006c; public const UInt32 tx_enable = 0x006d; public const UInt32 RST_N = 0x006e;//任意波功能整体复位信号(低有效) public const UInt32 CLK_RST = 0x008f;//FPGA内部pll复位信号 public const UInt32 AWG_RST = 0x008C;//幅度超界后复位信号(1→0) public const UInt32 AWG_EN = 0x008E;//输出使能信号,幅度未超界时高有效 public const UInt32 SCPD_BACK = 0x0309;// 回读判断幅度是否超界(0为超界) public const UInt32 pinit = 0x006f;//初始相位 public const UInt32 ftw_modu_L = 0x0070;//调制信号频率 public const UInt32 ftw_modu_M = 0x0071; public const UInt32 ftw_modu_H_3bits = 0x0072; public const UInt32 modu_type = 0x0073;//调制类型 1:AM 2:FM 3:FSK public const UInt32 am_depth = 0x0074;//调制深度 public const UInt32 FTWH_L = 0x0075;//载波频率 public const UInt32 FTWH_M = 0x0076; public const UInt32 FTWH_H_2bits = 0x0077; public const UInt32 Fdelt_L = 0x0078;//频偏 public const UInt32 Fdelt_M = 0x0079; public const UInt32 Fdelt_H_2bits = 0x007a; public const UInt32 ALEN = 0x007b; public const UInt32 SCLR = 0x007c; public const UInt32 WAVE_DATA_ADDR = 0x007d; public const UInt32 WAVE_DATA = 0x007e; public const UInt32 DAC5668_send_req = 0x007f; public const UInt32 DAC5668_DATA_L = 0x0080; public const UInt32 DAC5668_DATA_H = 0x0081; public const UInt32 CH_CTRL = 0x0082; //参考IO&辅助输出 public const UInt32 CLK_10M_SEL = 0X008B; public const UInt32 CLK_SRC_SEL = 0X008A; //DAC private const UInt32 DAC_CONFIG_L = 0x0004; private const UInt32 DAC_CONFIG_H = 0x0005; private const UInt32 DAC_START = 0x0003; private const UInt32 DAC_ENABLE_CS = 0x0607; private const UInt32 DAC_SEL = 0x0006; #endregion public static IDriver? CurrUsb30Driver = null; //private bool bFirst = true; private static void WriteAwgBySpi(UInt16 regAddr, UInt16 data) { HdIO.WriteReg(ProcBdReg.W.Awg_awg_wr_ctrl, 0x04); HdIO.WriteReg(ProcBdReg.W.Awg_awg_data_in, data); // 低8位地址 UInt16 addrCtrl = (UInt16)(regAddr & 0xffff); // cs为0时,发送一次,赋初值 HdIO.WriteReg(ProcBdReg.W.Awg_awg_addr_ctrl, addrCtrl); // cs置1,再发送一次 addrCtrl = (UInt16)(regAddr | (0x0001 << 8)); HdIO.WriteReg(ProcBdReg.W.Awg_awg_addr_ctrl, addrCtrl); //HdIO.Sleep(1); HdIO.WriteReg(ProcBdReg.W.Awg_awg_wr_ctrl, 0x05); } private static void WriteUsbReg(UInt32 regAddr, UInt32 data) { if (CurrUsb30Driver == null) { CurrUsb30Driver = new Driver_CyUsb3_0("ES7336"); } if (CurrUsb30Driver?.bOpen ?? false) CurrUsb30Driver?.WriterRegister(regAddr, data); } internal static bool DMAWrite(byte[] data, UInt32 byteCount) { if (CurrUsb30Driver?.bOpen ?? false) return CurrUsb30Driver.DMAWrite(data, byteCount); else return false; } private static void SendDataTo5668(short DAC_Select, UInt32 Port, UInt32 Data) { UInt32 ConfigWord = 0x00030000u | (Port << 12); ConfigWord <<= 8; ConfigWord |= Data << 4; WriteUsbReg(DAC_SEL, (UInt16)DAC_Select); WriteUsbReg(DAC_CONFIG_L, ConfigWord); WriteUsbReg(DAC_CONFIG_H, ConfigWord >> 16); WriteUsbReg(DAC_START, 1); // HdCommand.USB_WriteRegister32(DAC_ENABLE_CS, 1); //DA片选有效,此处1446i数据的传输大概需要24US的时间(以1MHZ) Thread.Sleep(2); // HdCommand.PCIX_WriteRegister32(DAC_START, 1); //Thread.Sleep(1); //HdCommand.USB_WriteRegister32(DAC_ENABLE_CS, 0); WriteUsbReg(DAC_START, 0); } internal static void Init() { if (!Hd.currProduct!.HardwareConfig!.bExistAWGModule) return; string readFileName = AppDomain.CurrentDomain.BaseDirectory + $@".\CaliData\AWGCaliData.txt"; if (File.Exists(readFileName)) { string[] allLines = File.ReadAllLines(readFileName); foreach (string s in allLines) { string ss = s.Trim(); if (ss != "" && ss.Length > 2 && !ss.StartsWith(@"//")) { string[] keyvalue = ss.Split(','); if (keyvalue.Length >= 2) { double data = double.Parse(keyvalue[1].Trim()); if (!CaliKeyValues.ContainsKey(keyvalue[0].Trim())) CaliKeyValues.Add(keyvalue[0].Trim(),data ); else CaliKeyValues[keyvalue[0].Trim()] = data; } } } } InitHMC7044_2700_board(1); Thread.Sleep(100); WriteUsbReg(PLL_SYNC, 0x00000000); WriteUsbReg(PLL_SYNC, 0x00000001); WriteUsbReg(PLL_SYNC, 0x00000000); Thread.Sleep(100); PllWrite(1, 0x010E, 0xB3); // SCLKOUT7 //ADC_DEVCLK PllWrite(1, 0x0122, 0xB3); // SCLKOUT9 //FPGA_REFCLK0 PllWrite(1, 0x0140, 0xB3); // DCLKOUT12 //FPGA_GLBCLK Thread.Sleep(100); InitDAC(); Modulation_config(); AWG_CH_CTRL(); SendDataTo5668(1, 3, 1700 * 16); SendDataTo5668(2, 3, 1700 * 16); } #region AWG参数 const int constDataDeep = 8192; //8K const int moduDataDeep = 4096; //4K public static uint[] aM = new uint[4]; public static uint[] newoffset = new uint[4]; public static double[] pointData = new double[16 * 1024]; public static double[] sendData = new double[16 * 1024]; #endregion #region 参数设置及发送方法 internal static void AmplitudeSet(uint AmpmVpp, double Fre, ref uint fineGain) { //粗调控制字 if (AmpmVpp >= 20 && AmpmVpp < 150) { aM[2] = 0b1101; fineGain = (uint)(13107 * (2 - ((Math.Log10((double)(AmpmVpp / 12.0)) * 20 - 12.65) / 19.7))); } if (AmpmVpp >= 150 && AmpmVpp < 350) { aM[2] = 0b1001; fineGain = (uint)(13107 * (2 - ((Math.Log10((double)(AmpmVpp / 60.0)) * 20 - 12.65) / 19.7))); } else if (AmpmVpp >= 350 && AmpmVpp < 600) { aM[2] = 0b1001; fineGain = (uint)(13107 * (2 - ((Math.Log10((double)(AmpmVpp / 60.0)) * 20 - 12.65) / 19.7))); } else if (AmpmVpp >= 600 && AmpmVpp < 1600) { aM[2] = 0b0101; fineGain = (uint)(13107 * (2 - ((Math.Log10((double)(AmpmVpp / 300.0)) * 20 - 12.45) / 19.7))); } else if (AmpmVpp >= 1600 && AmpmVpp <= 5000) { aM[2] = 0b0001; fineGain = (uint)(13107 * (2 - ((Math.Log10((double)(AmpmVpp / 1500.0)) * 20 - 12.65) / 19.7))); } else if (AmpmVpp > 5000) { aM[2] = 0b0001; fineGain = (uint)(13107 * (2 - ((Math.Log10((double)(5000 / 1500.0)) * 20 - 12.65) / 19.7))); } } internal static void OffsetSet(uint offeset, uint AmpmVpp) { uint offsetflag1 = 0; uint offsetflag2 = 0; uint delt = 0; if (AmpmVpp < 100) { delt = 90; offeset *= 5; } else if (AmpmVpp < 200 && AmpmVpp >= 100) { delt = 85; offeset *= 5; } else if (AmpmVpp <= 700 && AmpmVpp >= 200) delt = 60; else if (AmpmVpp > 700) delt = 50; offeset = 9080 - offeset + delt; if (offeset < 6680) { // offeset = 2270 - offeset; newoffset[0] = (uint)(offeset * 49.9 / 4.0 / 5000.0 * 65535); } else { // offeset = 2270 - offeset; offsetflag1 = offeset % 100; offsetflag2 = offeset - offsetflag1; newoffset[0] = (uint)(offsetflag1 * 49.9 / 4.0 / 5000.0 * 65535); newoffset[1] = (uint)(offsetflag2 * 0.8 / 4.0 / 5000.0 * 65535); } } internal static double[] WaveDataSet(ArbWfmType arbWfmType, int length, double duty, double noise, double phase) { IEnumerable y = arbWfmType switch { ArbWfmType.Sinusoid => Generator.Sine(0.0, 1, 1.0 / length, length, noise, phase), ArbWfmType.Pulse or ArbWfmType.Square => Generator.Rectangular(0.0, 1, 1.0 / length, length, noise, duty, phase), ArbWfmType.Ramp => Generator.Triangular(0.0, 1, 1.0 / length, length, noise, duty, phase), ArbWfmType.Noise => Generator.DirectCurrent(0.0, 1, length, noise), ArbWfmType.DC => Generator.DirectCurrent(0.0, 1, length, 0), ArbWfmType.Sinc => Generator.Sinc(0.0, 1, 1.0 / length, length, noise,/* 0.05*/duty, phase), ArbWfmType.ExpRise => Generator.RiseExp(0.0, 1, 1.0 / length, length, noise, /*0.33*/duty, phase), ArbWfmType.ExpFall => Generator.DecayExp(0.0, 1, 1.0 / length, length, noise, /*0.33*/duty, phase), ArbWfmType.Lorentz => Generator.Lorentz(0.0, 1, 1.0 / length, length, noise, /*0.1*/duty, phase), ArbWfmType.Haversine => Generator.Haversine(0.0, 1, 1.0 / length, length, noise, phase), ArbWfmType.Gaussian => Generator.Gaussian(0.0, 1.0, 1.0 / length, length, noise, /*0.25*/duty, phase), ArbWfmType.ECG => Generator.ECG(0.0, 1.0, 1.0 / length, length, noise, 0, phase), _ => Generator.DirectCurrent(0.0, 1.00, length, 0.00), }; y = y.Select(o => o * -16384.0);//通道板反向,正负转换 return y.ToArray(); } #endregion #region 波形函数 public static void SineWave() //正弦波 { for (uint i = 0; i < constDataDeep; i++) { pointData[i] = Math.Sin((float)(i * 2 * Math.PI / constDataDeep));//生成波形数据 pointData[i] = (double)(pointData[i] * 32768.0); //量化 sendData[i] = (uint)pointData[i]; //整形 WriteAwgBySpi(0x63, (UInt16)(((UInt64)sendData[i] & 0xff))); WriteAwgBySpi(0x64, (UInt16)(((UInt64)sendData[i] >> 8 & 0xff))); } } public const int WAVE_SECTION_VARIABLE = 4; public static void gause_wave(int exponent) { int half_buffer_siez = constDataDeep / 2; double x, temp, tempp; for (int i = 0; i < constDataDeep; i++) { x = 4.0 / 4096.0 * i - 4.0;// temp; pointData[i] = (1.0 / (1.0 * Math.Sqrt(2.0 * Math.PI))) * ((Math.Exp((0.0 - Math.Pow(x, 2.0)) / 2.0 * 1.0))); pointData[i] = (double)(pointData[i] * (-32700.0)); //量化 sendData[i] = (uint)pointData[i]; //整形 WriteAwgBySpi(0x63, (UInt16)(((UInt64)sendData[i] & 0xff))); WriteAwgBySpi(0x64, (UInt16)(((UInt64)sendData[i] >> 8 & 0xff))); } } public static void Lorentz() { int half_buffer_siez = constDataDeep / 2; double x, temp, tempp; //temp = (uint)(Math.PI * Math.Sqrt(exponent)); //tempp = temp * sqrt(M_PI); // uint section = WAVE_SECTION_VARIABLE / half_buffer_siez; //取[-4*pi, 4*pi]范围的波形 //double variable = (double)Math.Pow((WAVE_SECTION_VARIABLE / temp), 2);//? for (int i = 0; i < constDataDeep; i++) { //x = (uint)(((double)i - half_buffer_siez) / section);// temp; // pointData[i] = ((Math.Exp(0 - Math.Pow(x, 2)) - 1 / Math.Exp(variable)) / (1 - 1 / Math.Exp(variable))); //约掉一个tempp x = 4.0 / 4096.0 * i - 4.0;// temp; // pointData[i] = ((Math.Exp(0 - Math.Pow(x, 2)) - 1 / Math.Exp(variable)) / (1 - 1 / Math.Exp(variable))); //约掉一个tempp pointData[i] = (1 / (1 + Math.Pow(x, 2))); pointData[i] = (double)(pointData[i] * (-32700.0)); //量化 sendData[i] = (uint)pointData[i]; //整形 WriteAwgBySpi(0x63, (UInt16)(((UInt64)sendData[i] & 0xff))); WriteAwgBySpi(0x64, (UInt16)(((UInt64)sendData[i] >> 8 & 0xff))); } } //指数上升 public static void expup_wave() { for (uint i = 0; i < constDataDeep; i++) { pointData[i] = (Math.Exp((double)i / constDataDeep) - 1) / (Math.Exp(1) - 1); pointData[i] = (double)(pointData[i] * (-32700.0)); //量化 sendData[i] = (uint)pointData[i]; //整形 WriteAwgBySpi(0x63, (UInt16)(((UInt64)sendData[i] & 0xff))); WriteAwgBySpi(0x64, (UInt16)(((UInt64)sendData[i] >> 8 & 0xff))); } } public static void square_wave() { for (uint i = 0; i < constDataDeep / 2; i++) { pointData[i] = 1; pointData[i] = (double)(pointData[i] * (-32700.0)); //量化 sendData[i] = (uint)pointData[i]; //整形 WriteAwgBySpi(0x63, (UInt16)(((UInt64)sendData[i] & 0xff))); WriteAwgBySpi(0x64, (UInt16)(((UInt64)sendData[i] >> 8 & 0xff))); } for (uint i = constDataDeep / 2; i < constDataDeep; i++) { pointData[i] = -1; pointData[i] = (double)(pointData[i] * (-32700.0)); //量化 sendData[i] = (uint)pointData[i]; //整形 WriteAwgBySpi(0x63, (UInt16)(((UInt64)sendData[i] & 0xff))); WriteAwgBySpi(0x64, (UInt16)(((UInt64)sendData[i] >> 8 & 0xff))); } } //指数下降 public static void expdown_wave() { for (uint i = 0; i < constDataDeep; i++) { pointData[i] = (Math.Exp((double)(constDataDeep - i) / constDataDeep) - 1) / (Math.Exp(1) - 1); pointData[i] = (double)(pointData[i] * (-32700.0)); //量化 sendData[i] = (uint)pointData[i]; //整形 WriteAwgBySpi(0x63, (UInt16)(((UInt64)sendData[i] & 0xff))); WriteAwgBySpi(0x64, (UInt16)(((UInt64)sendData[i] >> 8 & 0xff))); } } public static void sinc_wave(int cycles) //sinc波形数据 { double temp = (int)(cycles / 2.0) * Math.PI; double x; for (int i = 0; i < constDataDeep; ++i) { x = temp * (-1) + temp * 2 / constDataDeep * i; if (x == 0) { pointData[i] = 1; } else { pointData[i] = (Math.Sin(x) / x); } pointData[i] = (double)(pointData[i] * (-32700.0)); //量化 sendData[i] = (uint)pointData[i]; //整形 WriteAwgBySpi(0x63, (UInt16)(((UInt64)sendData[i] & 0xff))); WriteAwgBySpi(0x64, (UInt16)(((UInt64)sendData[i] >> 8 & 0xff))); } } public static void Half_SineWave() //半正弦波 { for (uint i = 0; i < constDataDeep / 2; i++) { pointData[i] = Math.Sin((float)(i * Math.PI * 2 / constDataDeep));//生成波形数据 pointData[i] = (double)(pointData[i] * (-32768.0)); //量化 sendData[i] = (uint)pointData[i]; //整形 WriteAwgBySpi(0x63, (UInt16)(((UInt64)sendData[i] & 0xff))); WriteAwgBySpi(0x64, (UInt16)(((UInt64)sendData[i] >> 8 & 0xff))); } for (uint j = constDataDeep / 2; j < constDataDeep; j++) { WriteAwgBySpi(0x63, 0x00); WriteAwgBySpi(0x64, 0x00); } } //心率波数据 private static int[] cardicdata = { 27,33,37,37,32,25,14,3,-5,-7,-4,5,16,25,30,29,24,16,7,-1,-9,-16,-24,-32,-41,-48,-53,-54,-52,-48,-44,-38,-29,-15,4,26,43,53,53,48,44,48,61,81,99,110,107,92,69,45,29,25,34,51,69,80,80,71,57,46,42,47,58,70,81,90,95,100,102,104,104,102,98,93,86,79,73,68,64,63,63,64,65,63,59,52,45,40,40,47,60,76,91,100,100,90,75,58,45,37,33,33,33,32,29,25,22,22,24,27,29,27,21,13,2,-9,-19,-26,-27,-19,-3,18,38,50,50,38,23,10,5,10,20,30,38,41,40,35,26,13,-3,-19,-32,-40,-44,-46,-47,-48,-45,-38,-26,-14,-6,-4,-11,-23,-37,-49,-55,-56,-52,-45,-36,-29,-24,-20,-16,-10,0,15,37,68,112,168,232,293,337,352,337,299,255,223,215,233,271,318,363,403,436,465,492,516,534,541,529,497,449,392,338,294,261,236,209,172,122,58,-17,-100,-190,-285,-382,-475,-561,-633,-692,-738,-769,-786,-785,-765,-726,-672,-611,-550,-494,-445,-402,-360,-317,-272,-228,-186,-148,-117,-90,-66,-46,-29,-15,-5,3,10,16,20,19,13,1,-13,-27,-37,-44,-47,-50,-51,-53,-55,-57,-60,-63,-64,-62,-53,-39,-24,-12,-10,-18,-34,-51,-61,-63,-57,-48,-43,-43,-45,-46,-43,-38,-36,-42,-57,-73,-83,-79,-63,-43,-30,-31,-46,-69,-91,-108,-119,-126,-129,-125,-111,-86,-58,-37,-32,-45,-68,-90,-102,-102,-94,-85,-79,-74,-64,-49,-31,-20,-23,-42,-72,-101,-119,-124,-117,-105,-94,-87,-81,-76,-70,-60,-46,-24,8,52,106,161,207,234,237,216,181,144,116,105,111,126,138,134,109,62,2,-61,-114,-151,-170,-172,-164,-149,-133,-115,-96,-76,-54,-33,-13,3,13,18,16,10,1,-8,-13,-12,-3,10,24,34,39,39,39,42,49,60,70,73,69,58,47,41,40,43,47,50,49,47,45,43,39,34,28,22,21,23,28,33,35,32,25,17,11,8,11,20,34,48,57,58,51,39,28,22,22,25,27,26,23,20,20,22,22,19,13,8,8,14,25,37,45,47,46,43,40,37,32,21,4,-14,-28,-36,-36,-32,-29,-32,-40,-51,-60,-63,-59,-49,-36,-19,0,23,47,65,74,70,56,37,20,8,1,-6,-17,-34,-51,-64,-67,-59,-44,-27,-13,-4,0,2,4,6,7,4,-3,-14,-27,-41,-54,-64,-71,-74,-75,-72,-70,-72,-78,-87,-90,-78,-46,-2,42,67,62,29,-20,-70,-108,-132,-146,-158,-170,-177,-176,-166,-150,-136,-126,-122,-118,-108,-92,-73,-58,-52,-57,-70,-84,-93,-95,-88,-76,-61,-47,-37,-34,-36,-41,-46,-46,-40,-29,-17,-8,-7,-15,-27,-39,-44,-40,-29,-14,-3,-1,-10,-28,-48,-65,-75,-77,-75,-71,-69,-68,-67,-65,-60,-55,-52,-52,-55,-60,-63,-63,-59,-54,-50,-48,-47,-46,-42,-37,-32,-31,-37,-50,-69,-88,-104,-114,-120,-122,-123,-125,-127,-130,-132,-134,-133,-126,-111,-85,-52,-18,9,24,25,16,4,-7,-15,-20,-25,-29,-33,-33,-30,-24,-18,-14,-13,-14,-15,-17,-18,-20,-20,-20,-19,-18,-18,-22,-30,-39,-47,-52,-54,-56,-60,-67,-74,-78,-77,-72,-64,-54,-44,-33,-21,-11,-7,-9,-18,-32,-47,-60,-72,-84,-96,-106,-112,-109,-98,-81,-62,-43,-27,-14,-7,-9,-22,-44,-71,-96,-112,-118,-116,-110,-102,-94,-85,-75,-65,-56,-49,-43,-38,-35,-36,-42,-54,-68,-79,-83,-79,-68,-53,-39,-27,-19,-15,-14,-17,-23,-31,-40,-47,-50,-46,-35,-17,9,39,71,102,130,156,180,202,225,248,271,293,317,342,370,400,431,460,482,494,491,472,437,388,330,269,212,164,125,95,68,35,-11,-77,-165,-267,-375,-476,-560,-624,-672,-708,-737,-756,-761,-748,-718,-678,-637,-602,-575,-550,-520,-482,-438,-393,-349,-308,-264,-217,-168,-123,-89,-72,-70,-80,-95,-111,-126,-140,-149,-149,-136,-108,-69,-25,12,38,51,57,67,89,122,157,182,183,154,102,41,-11,-41,-46,-29,-4,19,29,23,0,-35,-75,-114,-146,-169,-184,-193,-196,-193,-184,-169,-150,-130,-110,-91,-70,-48,-25,-5,9,17,21,25,31,38,42,39,27,9,-10,-25,-33,-37,-37,-36,-36,-35,-31,-24,-14,-3,3,5,1,-7,-13,-15,-12,-5,2,4,0,-12,-27,-42,-51,-53,-47,-38,-29,-22,-16,-10,-2,7,13,13,9,2,-4,-5,-2,2,4,1,-6,-16,-26,-34,-41,-45,-46,-42,-35,-26,-18,-11,-6,-1,8,21,37,53,64,69,66,57,42,26,14,7,10,20,33,43,46,44,42,46,57,73,84,85,74,57,43,38,43,53,60,60,54,48,47,50,57,63,65,64,63,63,67,72,75,76,70,56,36,11,-14,-33,-40,-35,-20,-3,10,16,20,28,47,77,114,146,164,164,148,127,110,101,100,103,103,98,93,89,90,97,106,115,121,125,127,126,120,109,92,74,60,54,55,63,72,80,86,90,91,89,80,66,48,34,27,28,36,45,49,47,40,30,20,10,1,-7,-9,-4,11,30,47,57,56,48,37,28,24,23,21,16,7,-2,-9,-10,-3,10,26,39,44,43,38,36,45,67,96,120,128,111,70,17,-34,-68,-82,-77,-63,-50,-43,-43,-46,-48,-49,-49,-49,-50,-51,-52,-52,-52,-54,-58,-62,-65,-68,-71,-77,-87,-101,-116,-128,-134,-134,-129,-124,-119,-117,-116,-116,-117,-119,-122,-124,-124,-121,-116,-110,-103,-96,-84,-67,-44,-19,5,21,26,19,3,-17,-36,-49,-52,-48,-37,-25,-16,-11,-11,-14,-20,-26,-34,-45,-58,-70,-80,-84,-81,-74,-67,-62,-63,-70,-81,-96,-112,-129,-146,-160,-168,-166,-153,-127,-91,-50,-12,16,31,32,22,6,-11,-24,-32,-37,-42,-49,-59,-69,-75,-75,-70,-63,-57,-53,-52,-52,-50,-47,-41,-35,-27,-20,-15,-13,-17,-26,-37,-49,-58,-63,-65,-64,-63,-60,-58,-59,-65,-79,-99,-121,-137,-143,-138,-128,-117,-110,-108,-109,-109,-104,-94,-80,-67,-56,-50,-48,-51,-56,-63,-74,-87,-101,-112,-117,-113,-100,-83,-66,-54,-48,-47,-49,-53,-58,-66,-74,-85,-96,-109,-122,-134,-142,-143,-136,-124,-113,-107,-111,-127,-151,-178,-202,-222,-236,-245,-252,-257,-256,-246,-222,-185,-136,-82,-29,19,61,101,141,182,219,248,262,260,242,217,195,185,195,223,260,296,318,322,312,298,293,303,327,357,385,401,404,396,379,358,334,311,288,266,242,210,167,110,38,-48,-148,-263,-388,-515,-632,-727,-793,-832,-851,-858,-860,-854,-836,-805,-763,-717,-672,-628,-584,-534,-478,-419,-363,-316,-277,-243,-209,-171,-132,-96,-71,-57,-53,-54,-52,-45,-35,-25,-19,-19,-23,-30,-36,-42,-47,-52,-56,-59,-60,-60,-62,-69,-79,-89,-96,-95,-89,-82,-77,-76,-76,-74,-69,-64,-65,-73,-88,-102,-107,-101,-84,-63,-46,-36,-33,-35,-40,-45,-49,-52,-53,-52,-47,-41,-36,-34,-37,-44,-52,-58,-60,-58,-54,-52,-56,-63,-70,-73,-69,-61,-53,-49,-50,-51,-49,-41,-27,-13,-5,-4,-10,-18,-27,-33,-39,-42,-45,-46,-46,-43,-38,-31,-25,-19,-18,-23,-37,-58,-82,-103,-115,-115,-106,-94,-82,-72,-59,-39,-10,26,60,85,95,92,82,72,69,74,87,101,114,120,119,108,91,70,48,30,17,12,12,16,20,21,17,9,0,-5,-3,5,17,27,30,29,26,27,33,42,49,49,42,33,28,32,44,57,64,61,48,31,17,13,19,31,44,51,50,44,39,38,43,50,55,54,48,39,34,33,35,35,30,18,4,-6,-7,-1,10,20,24,24,22,22,28,38,50,60,66,70,73,77,79,78,69,54,38,28,27,36,48,53,46,25,-3,-30,-50,-61,-67,-71,-75,-77,-75,-67,-55,-43,-36,-33,-30,-21,-1,26,54,72,76,66,47,26,9,-3,-13,-22,-29,-36,-40,-45,-51,-58,-66,-70,-69,-61,-50,-37,-25,-14,-2,9,18,22,21,14,6,-1,-5,-5,-3,-1,-2,-7,-16,-28,-41,-53,-62,-66,-65,-61,-55,-47,-39,-33,-29,-28,-30,-32,-34,-36,-38,-42,-49,-56,-61,-59,-46,-24,5,33,54,60,49,27,1,-17,-21,-14,-1,7,5,-5,-18,-28,-32,-33,-34,-40,-48,-56,-60,-61,-61,-64,-73,-85,-95,-100,-98,-91,-81,-67,-53,-40,-33,-34,-42,-54,-64,-70,-71,-71,-74,-78,-81,-79,-71,-62,-58,-61,-71,-82,-89,-91,-91,-95,-106,-121,-135,-142,-143,-140,-140,-144,-151,-156,-151,-133,-104,-69,-36,-14,-5,-10,-23,-41,-58,-72,-84,-94,-103,-113,-118,-117,-107,-90,-68,-49,-34,-21,-2,30,79,138,193,227,228,196,142,84,44,31,47,82,119,141,135,97,32,-47,-124,-185,-223,-236,-230,-213,-192,-171,-151,-132,-112,-91,-70,-50,-32,-17,-5,3,5,2,-6,-17,-29,-38,-46,-52,-59,-65,-70,-74,-75,-78,-82,-88,-93,-92,-85,-74,-64,-59,-63,-74,-86,-94,-95,-88,-79,-72,-71,-74,-79,-84,-86,-87,-90,-97,-105,-111,-109,-99,-82,-66,-59,-65,-83,-108,-132,-151,-163,-168,-168,-162,-151,-134,-112,-88,-61,-31,6,53,110,170,224,261,275,271,259,253,264,293,333,373,405,425,438,451,466,483,495,498,488,468,444,418,391,360,322,273,213,142,59,-35,-140,-254,-371,-484,-586,-672,-742,-794,-829,-845,-843,-821,-783,-733,-678,-622,-567,-513,-458,-402,-347,-295,-248,-206,-166,-127,-86,-47,-11,15,31,37,34,28,21,16,15,19,25,32,37,37,31,23,14,7,3,1,-1,-1,0,5,16,30,45,56,62,62,61,62,66,72,78,79,76,70,64,59,59,61,65,68,69,67,65,63,64,68,74,81,89,95,97,95,86,71,54,40,34,37,44,48,43,27,5,-15,-26,-24,-11,8,30,55,85,119,155,187,207,213,205,188,166,145,123,102,81,64,51,46,46,50,53,55,55,52,50,50,52,58,63,66,64,56,45,35,30,33,40,49,58,66,74,81,88,93,95,94,93,91,91,92,93,92,91,92,95,99,102,100,93,82,71,65,67,77,95,118,145,171,193,205,205,192,170,144,119,99,86,79,77,78,82,86,88,89,87,85,85,91,100,113,126,138,150,164,180,196,208,212,205,187,164,142,127,121,123,129,136,142,146,149,151,153,152,149,146,146,150,156,161,165,165,165,166,168,168,165,157,150,147,156,174,198,221,236,245,250,256,263,269,268,255,231,204,180,166,164,172,186,202,217,229,236,235,227,212,194,174,155,140,128,121,116,111,104,93,79,65,55,51,54,63,76,87,95,97,93,83,69,54,42,38,40,47,55,59,56,49,39,29,23,21,21,23,24,24,23,25,30,38,48,55,56,48,33,15,-4,-21,-36,-49,-60,-69,-76,-79,-78,-70,-54,-27,7,44,76,97,109,119,134,162,201,243,273,281,266,231,188,150,123,108,103,99,92,75,48,13,-25,-61,-88,-104,-108,-104,-97,-91,-87,-82,-72,-54,-35,-26,-33,-53,-70,-66,-37,-1,15,-4,-44,-64,-28,66,167,195,96,-119,-370,-543,-562,-426,-211,-19,80,81,30,-15,-21,4,28,29,4,-28,-47,-43,-25,-2,15,26,36,46,55,59,55,45,32,22,18,17,16,12,1,-16,-37,-55,-64,-60,-44,-21,2,20,33,42,49,56,60,61,57,50,44,39,39,42,46,51,55,54,48,37,22,7,-6,-15,-22,-28,-33,-36,-35,-29,-22,-17,-18,-25,-34,-41,-42,-35,-26,-17,-13,-15,-21,-29,-38,-45,-50,-52,-50,-46,-41,-39,-39,-43,-47,-48,-47,-42,-36,-31,-30,-34,-43,-55,-69,-83,-92,-94,-86,-71,-55,-41,-35,-36,-40,-44,-44,-43,-42,-45,-51,-59,-63,-62,-55,-48,-43,-44,-48,-52,-52,-45,-32,-19,-8,-1,3,9,18,33,52,75,100,127,153,178,198,214,225,232,238,246,257,273,296,325,360,399,439,473,496,500,482,443,388,330,277,237,208,182,148,98,27,-61,-161,-265,-370,-470,-561,-639,-696,-731,-745,-743,-734,-722,-710,-694,-672,-641,-603,-563,-524,-484,-444,-400,-353,-306,-263,-226,-194,-163,-132,-100,-70,-45,-30,-23,-21,-23,-26,-30,-38,-48,-60,-70,-76,-76,-74,-71,-69,-69,-69,-68,-64,-58,-51,-44,-39,-37,-40,-47,-56,-65,-69,-68,-60,-49,-39,-35,-38,-45,-54,-58,-56,-48,-38,-30,-25,-22,-23,-25,-32,-43,-58,-72,-79,-75,-62,-45,-32,-29,-34,-41,-43,-40,-35,-37,-48,-68,-88,-99,-95,-77,-52,-28,-11,-2,1,2,3,4,6,6,4,0,-7,-18,-31,-47,-61,-72,-76,-72,-57,-36,-13,9,23,27,21,9,-5,-15,-19,-16,-8,0,5,6,5,6,17,40,72,107,135,150,150,139,122,104,85,67,51,39,33,33,36,38,38,39,44,54,70,85,92,90,81,70,63,62,64,66,66,67,70,77,85,89,84,69,47,27,16,19,34,55,73,82,81,76,71,72,80,90,98,103,103,101,100,97,94,87,78,70,64,62,63,63,61,57,52,49,49,50,50,50,50,52,57,66,80,96,115,135,156,178,202,228,257,289,320,341,346,328,290,243,201,177,176,189,203,201,174,124,64,9,-30,-47,-47,-39,-28,-17,-8,1,10,17,21,25,30,39,53,68,82,90,91,87,83,79,76,74,71,65,56,48,41,36,36,38,40,40,38,33,27,19,12,6,2,-1,-1,1,5,7,4,-6,-20,-36,-48,-52,-49,-41,-30,-19,-8,3,14,23,29,28,21,9,-8,-25,-38,-43,-36,-15,17,52,81,98,100,90,75,61,52,47,43,36,25,13,3,-1,3,13,25,34,35,26,11,-4,-11,-7,5,20,33,40,43,44,46,50,54,54,49,40,31,26,26,30,36,42,46,48,51,54,56,57,56,54,51,49,46,42,35,26,16,8,6,13,28,47,66,78,81,77,70,66,65,67,67,63,55,47,46,53,69,86,99,100,91,76,60,50,45,46,49,54,61,75,95,121,148,169,178,172,154,131,108,91,84,85,91,98,103,104,103,102,104,109,117,124,127,124,117,106,94,81,67,53,40,29,21,17,16,18,22,26,33,43,58,77,100,121,134,135,123,101,76,54,40,32,25,18,8,-1,-8,-8,-2,9,24,44,66,92,119,142,156,161,157,146,133,120,109,101,95,91,88,87,85,82,78,72,68,67,69,73,78,81,82,80,79,77,75,72,65,57,49,46,49,61,77,98,121,147,178,212,247,280,306,324,335,342,351,365,385,413,444,478,510,538,558,567,563,544,511,467,420,376,341,314,292,267,233,187,129,62,-14,-98,-189,-285,-380,-468,-544,-601,-636,-650,-641,-614,-573,-525,-476,-431,-390,-351,-310,-265,-217,-168,-121,-77,-36,6,48,91,130,162,183,194,194,186,175,164,155,151,150,150,149,145,138,131,127,127,130,132,131,125,117,109,105,106,109,110,105,94,77,59,45,41,53,81,121,164,198,213,206,182,150,122,106,102,108,119,131,141,151,161,170,176,179,176,167,155,140,123,107,94,86,86,94,107,119,123,119,107,93,83,82,86,91,93,88,80,71,64,59,53,44,33,26,25,32,44,53,58,59,62,74,96,125,156,187,217,252,293,337,372,385,370,326,266,207,162,140,139,150,162,165,151,119,70,12,-46,-94,-124,-132,-121,-93,-54,-12,29,62,86,100,107,110,113,115,116,115,111,107,106,108,113,122,133,144,153,158,156,145,128,110,97,95,103,117,132,142,145,142,137,133,132,133,136,140,141,140,135,127,117,104,88,70,49,27,6,-10,-19,-22,-19,-13,-7,-1,6,18,42,80,129,180,223,246,249,235,215,197,188,187,188,188,186,181,176,173,172,169,164,156,145,133,122,114,110,110,114,122,132,143,152,160,163,162,156,146,134,122,112,106,104,105,106,105,100,92,84,79,79,84,92,99,102,101,98,94,92,91,91,92,92,89,83,73,60,47,36,29,26,27,32,39,49,60,72,81,85,84,77,67,56,47,41,40,45,55,68,82,92,96,91,79,64,52,46,47,54,60,62,58,48,36,26,20,19,21,23,23,20,14,6,-3,-10,-14,-11,-4,4,10,10,3,-7,-16,-19,-14,-2,16,36,55,72,85,91,88,75,54,31,11,2,6,22,42,61,73,78,78,77,76,75,70,59,43,21,-1,-21,-40,-57,-74,-91,-105,-114,-118,-117,-115,-114,-113,-110,-101,-84,-60,-32,-4,20,38,53,66,78,87,93,95,94,90,84,75,63,47,31,17,8,5,4,3,1,-1,0,5,14,24,33,36,34,28,18,8,-2,-9,-8,3,23,49,71,80,72,48,16,-14,-34,-39,-34,-23,-13,-6,-2,0,0,-2,-5,-8,-8,-6,0,5,5,1,-8,-18,-25,-28,-28,-27,-28,-29,-26,-19,-7,7,19,25,23,16,7,-1,-4,-6,-8,-12,-16,-20,-21,-20,-17,-15,-15,-15,-14,-9,0,10,21,31,39,44,43,35,20,0,-19,-31,-33,-26,-15,-3,8,16,21,23,20,13,5,-2,-5,-2,4,13,23,35,51,71,91,104,109,105,100,101,114,140,176,216,258,303,356,417,479,530,558,553,518,462,400,344,301,270,245,220,189,150,101,39,-36,-124,-219,-315,-403,-478,-541,-596,-643,-684,-712,-725,-718,-693,-657,-616,-573,-527,-475,-416,-350,-283,-220,-164,-115,-69,-23,26,75,120,156,176,179,164,135,102,74,61,66,85,106,112,94,47,-19,-89,-144,-173,-174,-157,-132,-110,-93,-78,-63,-45,-28,-16,-13,-17,-25,-30,-28,-20,-7,4,12,13,9,1,-6,-10,-10,-5,0,3,0,-8,-19,-31,-40,-43,-40,-33,-24,-16,-12,-12,-16,-20,-22,-21,-17,-16,-20,-31,-48,-66,-83,-95,-102,-104,-104,-102,-97,-91,-84,-78,-76,-77,-78,-76,-66,-45,-16,16,43,58,60,53,43,37,36,39,41,38,29,15,0,-13,-22,-26,-25,-20,-8,6,19,26,25,16,4,-2,1,14,32,49,58,58,52,44,37,35,35,37,39,39,35,26,17,11,15,28,48,67,76,75,66,58,55,61,70,76,73,60,43,28,21,22,30,40,48,53,53,51,50,51,55,61,66,68,69,67,63,57,49,40,32,27,26,27,28,28,27,26,30,38,50,62,72,82,92,103,114,122,121,109,88,65,47,38,38,42,45,41,31,16,4,-1,2,12,23,31,34,35,36,38,39,36,25,8,-12,-28,-36,-34,-25,-14,-4,7,18,30,41,47,45,34,17,0,-16,-29,-43,-60,-81,-102,-117,-123,-119,-111,-103,-97,-94,-89,-79,-64,-45,-29,-16,-8,-2,2,4,3,-3,-12,-24,-35,-43,-50,-57,-65,-75,-84,-92,-97,-102,-107,-114,-121,-127,-128,-126,-122,-118,-117,-114,-109,-98,-84,-71,-64,-65,-72,-80,-84,-80,-70,-60,-52,-49,-51,-55,-58,-58,-55,-53,-52,-56,-63,-71,-77,-80,-82,-83,-89,-99,-110,-121,-128,-129,-127,-121,-115,-110,-105,-100,-97,-94,-91,-89,-87,-87,-89,-93,-97,-102,-106,-110,-116,-124,-133,-141,-148,-154,-157,-157,-153,-143,-128,-113,-102,-100,-108,-123,-139,-154,-165,-169,-166,-154,-133,-106,-77,-54,-44,-46,-57,-72,-85,-96,-104,-110,-114,-114,-112,-106,-99,-95,-95,-99,-105,-113,-122,-131,-139,-145,-146,-143,-135,-126,-116,-108,-103,-103,-108,-117,-130,-142,-150,-153,-150,-144,-137,-130,-123,-116,-110,-109,-116,-133,-157,-183,-205,-218,-223,-224,-226,-229,-232,-231,-221,-201,-176,-152,-137,-137,-152,-176,-202,-223,-238,-247,-257,-270,-287,-300,-301,-280,-239,-185,-131,-92,-72,-64,-59,-44,-16,19,48,59,46,13,-30,-71,-98,-106,-97,-78,-60,-57,-77,-123,-189,-262,-325,-367,-383,-378,-363,-348,-335,-323,-307,-282,-252,-223,-204,-200,-209,-223,-232,-231,-220,-206,-194,-188,-187,-185,-177,-159,-134,-105,-80,-61,-50,-45,-44,-43,-37,-23,-1,30,68,111,154,197,235,266,286,292,281,256,218,172,126,83,48,21,-1,-24,-55,-100,-163,-245,-339,-440,-542,-638,-727,-805,-871,-924,-960,-981,-985,-975,-951,-916,-872,-822,-771,-721,-672,-625,-579,-534,-493,-457,-427,-398,-366,-326,-280,-233,-194,-172,-168,-181,-202,-222,-237,-244,-245,-241,-233,-221,-208,-194,-185,-183,-187,-194,-200,-202,-202,-200,-200,-202,-204,-204,-201,-198,-197,-202,-213,-226,-235,-237,-232,-221,-209,-200,-198,-203,-215,-233,-252,-272,-289,-303,-312,-317,-318,-316,-310,-301,-288,-273,-256,-237,-215,-191,-168,-146,-129,-117,-113,-115,-124,-136,-149,-160,-167,-166,-161,-154,-152,-157,-168,-182,-191,-192,-184,-171,-159,-151,-148,-149,-152,-157,-163,-170,-179,-184,-186,-184,-180,-174,-167,-156,-141,-122,-105,-97,-101,-117,-138,-155,-163,-161,-152,-141,-133,-128,-124,-122,-119,-116,-112,-109,-109,-112,-121,-135,-150,-161,-164,-158,-147,-135,-128,-128,-133,-139,-143,-144,-140,-136,-133,-132,-131,-130,-125,-118,-109,-101,-96,-95,-97,-101,-103,-105,-105,-107,-109,-112,-115,-117,-117,-116,-113,-110,-105,-98,-90,-84,-80,-78,-77,-74,-69,-64,-62,-65,-72,-80,-83,-80,-74,-68,-67,-73,-82,-89,-91,-87,-80,-72,-65,-57,-46,-32,-19,-10,-9,-19,-35,-53,-67,-72,-69,-60,-50,-43,-43,-49,-58,-68,-73,-73,-66,-56,-47,-42,-40,-41,-40,-35,-27,-18,-13,-16,-24,-34,-41,-41,-37,-31,-29,-32,-39,-47,-54,-58,-60,-61,-62,-63,-63,-62,-60,-58,-60,-65,-74,-84,-93,-98,-97,-90,-79,-69,-59,-51,-45,-41,-41,-51,-72,-104,-142,-176,-196,-196,-176,-144,-114,-98,-101,-124,-158,-192,-215,-221,-212,-195,-181,-177,-184,-199,-217,-232,-239,-238,-228,-208,-179,-143,-103,-66,-40,-29,-32,-46,-66,-83,-96,-104,-108,-113,-120,-130,-138,-142,-139,-131,-120,-114,-116,-126,-138,-146,-147,-144,-140,-139,-141,-140,-126,-96,-53,-10,22,36,35,30,34,53,84,115,134,134,116,87,58,35,23,21,25,29,26,7,-32,-89,-158,-227,-284,-319,-330,-319,-290,-250,-205,-161,-124,-99,-87,-85,-88,-91,-89,-84,-77,-71,-69,-71,-75,-80,-82,-81,-77,-71,-65,-63,-63,-63,-61,-56,-49,-44,-43,-46,-48,-46,-41,-34,-29,-31,-38,-44,-44,-38,-28,-20,-19,-26,-38,-50,-57,-56,-50,-41,-33,-31,-35,-48,-65,-83,-97,-102,-98,-88,-76,-68,-64,-64,-62,-58,-51,-45,-43,-48,-56,-65,-71,-70,-65,-58,-51,-45,-40,-36,-34,-37,-46,-59,-73,-81,-80,-69,-53,-40,-33,-37,-50,-65,-79,-87,-87,-81,-72,-63,-55,-51,-48,-48,-50,-56,-65,-80,-96,-113,-128,-138,-144,-148,-150,-147,-135,-110,-70,-22,28,67,87,88,73,49,26,8,0,2,16,39,68,99,127,150,165,173,179,185,195,211,232,260,291,324,358,390,421,448,471,484,484,466,431,382,325,270,223,185,153,117,69,4,-79,-175,-275,-373,-463,-542,-609,-660,-697,-719,-730,-733,-728,-717,-697,-666,-623,-572,-516,-459,-402,-348,-297,-251,-209,-173,-141,-113,-85,-59,-34,-14,1,11,16,18,18,16,10,2,-5,-9,-6,3,14,22,24,18,9,1,0,6,16,26,30,26,15,1,-11,-17,-15,-4,11,27,37,39,35,25,15,6,0,-6,-12,-20,-26,-30,-30,-27,-24,-25,-29,-35,-40,-40,-33,-20,-3,15,34,50,63,69,68,59,44,26,11,2,1,8,20,31,37,35,28,19,12,7,4,-2,-12,-25,-40,-52,-59,-62,-63,-66,-72,-78,-80,-75,-60,-33,3,42,78,105,120,125,121,116,113,112,112,111,107,101,96,92,92,92,93,91,88,85,84,87,91,95,97,95,91,86,84,86,94,106,118,125,124,116,103,88,74,63,56,57,66,86,114,142,162,169,161,144,126,115,111,111,109,102,91,81,77,80,88,98,104,104,97,87,78,72,73,79,86,91,93,90,85,82,81,81,80,76,69,61,58,63,76,94,110,119,118,110,100,92,88,88,86,78,62,42,21,4,-6,-8,-2,11,29,51,71,87,97,103,112,130,161,203,250,293,322,334,326,303,272,242,219,207,201,193,175,139,88,27,-31,-79,-112,-128,-133,-130,-120,-104,-84,-60,-35,-10,12,29,41,49,53,53,53,53,55,59,62,61,51,34,14,-2,-8,-5,4,12,13,8,0,-4,-2,4,10,14,14,12,9,6,2,-4,-13,-20,-22,-17,-8,1,5,2,-5,-10,-11,-8,-2,2,3,1,-2,-4,-4,-5,-8,-13,-19,-25,-29,-31,-29,-23,-13,1,14,24,29,28,25,21,18,15,8,-3,-17,-29,-34,-31,-18,1,23,44,61,73,79,78,72,62,52,43,35,28,20,12,6,3,4,6,8,8,6,4,5,12,25,41,55,62,60,51,39,30,26,28,34,43,51,57,59,59,56,52,50,52,56,61,64,65,65,65,69,75,79,80,73,63,52,45,44,46,47,43,35,24,14,11,13,18,22,21,17,11,10,16,29,44,57,62,61,57,54,55,59,63,64,59,51,40,31,23,15,5,-6,-16,-23,-24,-18,-7,7,19,27,31,32,32,32,34,36,34,28,16,2,-11,-18,-17,-9,0,5,4,-3,-12,-18,-17,-11,-3,4,8,9,10,14,21,29,33,30,21,9,-3,-11,-15,-17,-18,-19,-20,-19,-16,-14,-15,-22,-32,-41,-46,-42,-33,-23,-16,-15,-18,-21,-20,-16,-8,0,8,19,34,55,79,103,122,135,145,157,173,196,225,258,293,331,374,422,471,515,546,558,551,526,490,446,399,350,303,262,230,205,183,152,106,39,-46,-144,-244,-341,-430,-507,-571,-622,-660,-684,-694,-692,-677,-650,-613,-568,-518,-466,-412,-358,-304,-251,-201,-155,-115,-80,-49,-21,4,25,40,47,47,43,36,27,18,9,4,4,13,32,56,81,99,107,106,97,85,74,64,54,45,36,29,24,21,17,13,6,-1,-8,-13,-17,-20,-24,-28,-32,-34,-36,-36,-34,-29,-15,8,43,82,120,146,156,148,126,97,69,45,30,22,18,16,14,11,8,6,6,8,12,19,29,43,61,78,92,99,97,87,72,53,34,17,4,0,10,35,74,118,158,186,201,209,219,241,275,312,339,345,325,286,244,211,197,200,213,223,222,201,161,104,39,-22,-68,-91,-93,-79,-61,-44,-32,-21,-7,13,36,55,66,68,65,63,66,76,90,102,110,113,115,118,125,133,138,136,124,106,87,75,75,85,101,116,122,119,111,104,101,106,114,123,129,133,136,141,148,152,152,144,128,109,90,77,73,76,83,88,90,88,84,82,85,96,111,127,138,143,141,135,129,126,128,132,135,134,129,121,113,108,106,105,105,102,96,91,86,86,89,96,105,117,130,145,160,171,176,174,165,152,136,121,109,99,91,86,82,82,84,89,94,95,91,81,67,51,38,31,30,32,35,36,36,37,42,53,69,86,99,105,102,92,78,63,50,38,28,21,17,19,25,33,41,46,48,50,53,59,69,81,94,101,101,91,74,55,39,32,36,48,62,72,75,69,58,47,40,37,39,44,50,57,63,69,73,74,71,65,56,47,40,36,35,33,29,21,11,2,0,5,18,32,42,45,41,33,24,18,13,7,0,-7,-14,-17,-17,-13,-8,-4,-2,-2,-5,-9,-15,-22,-26,-28,-26,-21,-15,-9,-3,3,11,17,21,19,10,-5,-22,-38,-49,-53,-48,-38,-23,-5,12,27,37,41,40,36,30,27,26,27,29,30,28,23,16,7,-2,-9,-15,-18,-19,-16,-12,-8,-8,-12,-22,-34,-43,-47,-44,-36,-27,-21,-20,-21,-20,-15,-4,11,24,32,34,32,30,32,41,54,67,75,75,72,68,65,63,56,40,15,-12,-30,-32,-16,9,31,43,41,31,22,18,19,22,22,18,14,13,18,27,35,39,36,30,24,21,24,30,37,43,45,42,34,22,8,-2,-8,-8,-5,-4,-8,-16,-25,-30,-29,-22,-13,-8,-10,-16,-25,-31,-32,-31,-28,-28,-29,-31,-33,-33,-30,-27,-24,-22,-22,-24,-27,-32,-36,-38,-38,-34,-29,-25,-24,-26,-30,-33,-31,-22,-5,17,42,66,88,107,123,135,146,157,169,184,200,219,239,262,287,315,343,368,386,394,393,386,377,367,356,340,316,286,251,216,183,149,106,45,-41,-154,-284,-417,-534,-619,-666,-681,-679,-675,-684,-708,-739,-765,-773,-760,-729,-685,-635,-579,-518,-449,-376,-303,-237,-184,-141,-105,-73,-44,-18,3,19,32,46,60,71,76,73,62,47,34,25,21,19,17,16,16,18,20,22,21,17,9,-1,-11,-18,-20,-18,-11,-3,4,6,0,-10,-21,-25,-20,-5,15,32,42,43,37,30,25,24,24,22,16,6,-4,-12,-16,-15,-13,-11,-14,-22,-34,-47,-56,-60,-56,-48,-38,-31,-27,-25,-20,-11,3,20,32,35,28,14,-2,-14,-17,-13,-4,3,3,-4,-14,-23,-25,-18,-5,9,17,17,10,-1,-10,-16,-19,-20,-20,-19,-15,-8,1,9,13,12,8,4,5,9,16,21,22,21,18,16,15,13,11,6,-1,-7,-11,-14,-16,-17,-17,-14,-9,-3,4,8,10,10,8,7,6,8,12,17,22,25,22,15,3,-7,-13,-12,-6,3,14,23,32,41,51,60,67,68,63,51,35,19,8,5,10,22,34,42,44,43,44,49,59,71,81,88,91,93,95,97,97,94,90,85,81,79,77,73,67,58,49,43,42,44,47,47,42,33,23,18,22,33,49,62,67,62,51,40,34,35,38,40,37,32,28,27,29,30,30,26,23,23,28,35,38,34,22,5,-9,-19,-22,-22,-20,-20,-22,-24,-26,-27,-27,-26,-23,-20,-19,-22,-31,-44,-56,-64,-65,-59,-49,-41,-36,-37,-40,-46,-52,-60,-67,-72,-73,-70,-63,-57,-52,-50,-47,-40,-29,-16,-7,-7,-18,-38,-59,-78,-90,-96,-97,-94,-88,-79,-68,-57,-46,-39,-36,-38,-44,-51,-59,-64,-66,-64,-59,-52,-47,-46,-49,-55,-59,-60,-56,-49,-42,-39,-40,-45,-49,-53,-55,-56,-58,-58,-55,-48,-38,-29,-28,-36,-51,-66,-74,-73,-67,-61,-61,-67,-75,-80,-80,-75,-72,-74,-83,-95,-104,-102,-88,-66,-44,-31,-31,-42,-60,-75,-85,-88,-88,-90,-94,-99,-102,-103,-105,-109,-118,-127,-131,-123,-105,-83,-67,-64,-73,-88,-97,-96,-84,-67,-53,-45,-43,-44,-49,-58,-72,-92,-114,-134,-146,-147,-136,-114,-85,-53,-21,4,21,29,35,47,70,106,145,177,189,175,139,90,42,4,-18,-24,-21,-14,-14,-27,-57,-102,-155,-205,-245,-267,-274,-269,-257,-241,-224,-205,-186,-168,-150,-133,-116,-99,-86,-80,-83,-92,-101,-104,-98,-84,-69,-63,-68,-82,-99,-110,-111,-102,-91,-82,-82,-87,-95,-102,-105,-107,-109,-113,-117,-118,-112,-100,-84,-71,-64,-65,-72,-81,-86,-86,-82,-79,-79,-84,-93,-102,-110,-115,-119,-121,-122,-118,-109,-94,-73,-47,-17,17,54,90,123,151,171,189,206,225,247,271,297,325,357,390,418,433,425,393,343,288,238,202,180,168,158,141,112,67,4,-77,-173,-278,-384,-482,-567,-635,-688,-730,-762,-784,-792,-782,-751,-704,-647,-590,-542,-504,-472,-441,-405,-363,-317,-272,-232,-198,-168,-142,-116,-91,-70,-53,-45,-43,-47,-53,-59,-63,-63,-62,-59,-55,-52,-50,-52,-57,-64,-69,-70,-66,-60,-59,-66,-83,-103,-118,-122,-113,-95,-76,-62,-56,-56,-57,-55,-49,-41,-36,-36,-43,-56,-70,-83,-91,-93,-91,-84,-74,-64,-54,-47,-42,-40,-41,-45,-50,-55,-58,-59,-55,-49,-44,-42,-44,-49,-54,-57,-60,-63,-69,-77,-83,-84,-80,-71,-61,-54,-54,-59,-67,-75,-79,-79,-73,-66,-61,-61,-66,-74,-79,-77,-68,-54,-43,-40,-45,-55,-65,-72,-74,-73,-73,-76,-81,-84,-82,-73,-57,-39,-22,-12,-9,-12,-18,-26,-32,-35,-36,-34,-32,-32,-36,-45,-57,-67,-69,-64,-54,-47,-48,-59,-75,-88,-90,-80,-62,-43,-31,-28,-35,-45,-54,-57,-53,-44,-33,-24,-19,-19,-24,-33,-42,-48,-51,-49,-46,-44,-46,-51,-56,-59,-57,-52,-47,-44,-46,-50,-52,-48,-38,-24,-11,-1,1,-2,-6,-6,-1,10,22,31,34,32,28,28,34,46,61,72,80,86,91,99,108,115,118,115,109,105,103,103,99,90,76,63,56,59,70,83,92,91,83,72,63,59,61,67,73,76,75,71,65,58,53,53,57,62,65,61,52,39,28,20,17,18,19,19,20,22,23,21,17,8,0,-6,-7,-5,-1,1,1,0,-1,-1,0,-1,-1,0,3,8,11,10,3,-10,-23,-35,-43,-50,-57,-66,-76,-80,-77,-62,-38,-10,15,35,48,62,83,116,159,202,230,232,202,146,79,18,-22,-34,-19,16,57,90,100,79,28,-42,-111,-163,-187,-186,-171,-156,-149,-148,-143,-126,-93,-52,-15,7,10,-1,-16,-24,-22,-10,2,10,10,5,5,12,28,46,60,63,58,49,42,39,40,38,32,24,17,17,23,30,33,26,12,-2,-9,-4,12,32,48,55,53,45,36,32,30,30,30,28,28,32,42,54,63,64,55,40,23,12,10,17,30,45,60,73,83,89,90,87,81,74,68,64,59,54,47,42,39,41,47,56,66,76,85,93,99,102,99,90,76,58,40,27,20,21,27,34,38,36,28,18,9,6,10,18,27,36,45,56,68,78,84,82,70,52,33,17,9,10,19,34,49,60,65,59,47,30,14,4,2,7,16,27,37,45,52,58,63,65,63,58,52,45,41,38,38,37,37,36,37,38,40,40,36,28,18,8,0,-4,-5,-3,3,11,19,26,29,28,25,25,30,43,63,86,110,134,157,182,207,233,258,282,306,331,360,394,434,480,527,572,608,629,631,615,586,550,513,480,450,422,392,355,308,251,184,108,21,-75,-183,-298,-415,-525,-620,-694,-744,-775,-787,-784,-764,-728,-678,-622,-569,-525,-489,-455,-414,-361,-300,-238,-185,-146,-117,-94,-68,-40,-14,4,8,-1,-18,-33,-40,-39,-30,-20,-14,-12,-15,-17,-17,-12,-3,7,15,18,15,9,3,-1,-2,-1,0,-1,-3,-4,-1,6,14,20,20,15,7,1,-1,3,10,20,30,40,49,57,61,60,53,43,32,23,17,13,11,9,5,0,-6,-11,-11,-5,7,24,39,50,53,48,39,29,24,25,30,40,49,56,60,59,56,51,47,45,48,55,62,68,70,69,65,63,62,63,63,60,53,46,43,46,57,72,85,92,92,88,83,77,73,67,61,55,51,51,55,62,72,84,97,110,120,123,119,109,98,90,88,90,93,90,82,71,61,58,62,71,79,82,79,71,64,63,71,85,102,115,122,121,116,110,105,103,102,101,100,96,90,81,67,50,31,16,8,9,19,34,52,70,87,104,123,147,177,215,256,297,329,345,339,314,275,235,206,194,199,214,227,226,205,162,105,43,-11,-48,-64,-61,-45,-23,-2,14,28,39,51,65,79,92,103,111,117,122,126,129,131,132,134,138,144,152,157,155,145,128,109,95,88,89,95,99,100,96,91,87,86,88,89,89,86,81,77,76,79,85,94,104,115,122,126,126,123,119,118,119,121,120,116,109,103,99,99,99,96,90,80,72,68,69,76,85,92,97,98,97,93,90,87,87,88,90,92,92,91,89,88,88,89,91,91,90,88,87,90,97,103,105,101,90,78,69,67,73,82,89,91,89,85,83,85,91,98,104,107,106,103,98,91,86,82,83,88,97,107,115,119,119,117,115,112,110,106,98,87,74,64,58,59,65,73,81,89,99,112,129,145,156,158,151,136,119,103,89,77,69,64,63,65,68,70,71,69,68,68,72,78,85,92,98,102,104,103,101,100,101,105,109,111,109,103,97,94,95,99,103,103,99,92,86,83,82,82,78,71,62,56,59,71,87,103,111,111,105,98,94,93,95,96,94,89,83,78,72,66,59,53,49,51,57,64,70,72,70,68,67,67,66,63,57,50,45,42,43,43,41,33,22,12,6,8,18,31,44,51,54,52,50,48,48,49,50,52,53,55,55,54,53,51,50,49,46,41,33,25,18,14,13,14,15,17,18,19,19,18,15,12,11,11,9,3,-8,-21,-28,-23,-5,22,47,65,71,71,74,88,112,144,175,197,209,213,217,230,256,294,339,385,425,459,487,514,539,557,561,547,516,476,438,411,397,393,388,375,346,301,238,159,62,-50,-174,-303,-425,-533,-620,-686,-731,-759,-770,-765,-741,-701,-646,-584,-521,-463,-413,-368,-327,-286,-245,-204,-163,-123,-87,-55,-30,-10,5,17,26,31,31,25,16,5,-2,-5,-3,1,3,0,-8,-18,-28,-35,-38,-36,-31,-22,-12,0,10,16,16,11,2,-5,-7,-2,7,17,20,16,5,-9,-21,-31,-42,-55,-73,-93,-107,-113,-108,-94,-76,-55,-34,-10,16,40,59,71,79,92,118,158,204,244,263,256,226,186,148,123,113,116,124,130,127,109,75,26,-29,-80,-116,-132,-128,-111,-90,-71,-55,-40,-22,-1,22,41,54,60,61,62,65,73,82,91,94,90,82,71,63,59,60,64,69,70,70,68,67,65,60,53,44,35,31,32,39,48,53,54,52,49,51,57,67,76,81,81,79,75,72,71,71,70,68,67,66,66,67,66,63,57,52,50,53,60,69,76,79,80,83,88,94,97,91,78,62,51,51,62,78,91,94,88,78,71,72,81,92,100,104,104,103,105,110,115,118,118,116,116,120,127,135,139,138,132,125,121,121,122,124,122,119,117,120,129,142,154,158,153,139,124,112,108,110,115,118,117,116,118,128,145,166,182,189,185,173,158,146,138,131,123,111,98,86,78,71,63,51,37,25,21,28,45,67,87,102,111,116,118,118,111,95,70,42,21,12,19,35,53,61,57,42,24,11,5,5,6,4,-2,-11,-21,-28,-31,-28,-21,-12,-5,-1,0,-2,-4,-2,2,6,6,1,-9,-17,-22,-20,-13,-4,1,1,-3,-8,-10,-7,2,13,22,24,18,4,-13,-27,-36,-38,-36,-32,-30,-30,-30,-29,-27,-24,-23,-25,-33,-45,-57,-66,-71,-70,-65,-58,-52,-50,-51,-55,-61,-67,-69,-67,-57,-41,-21,-3,8,11,4,-8,-22,-31,-35,-33,-29,-23,-16,-8,1,10,13,9,-3,-20,-34,-41,-38,-29,-18,-8,-2,1,4,5,5,1,-4,-10,-11,-9,-3,0,-3,-13,-26,-37,-42,-40,-32,-25,-21,-21,-22,-20,-15,-7,1,5,4,1,1,4,11,17,16,3,-19,-42,-57,-54,-35,-8,18,32,33,25,17,16,22,32,38,36,25,8,-7,-18,-23,-24,-22,-20,-19,-20,-22,-24,-24,-24,-22,-20,-21,-24,-31,-37,-41,-40,-35,-30,-30,-39,-54,-73,-89,-98,-97,-86,-68,-42,-10,22,49,63,62,46,19,-10,-34,-50,-58,-60,-57,-52,-47,-44,-46,-54,-65,-78,-87,-90,-89,-84,-79,-76,-75,-77,-79,-82,-83,-84,-84,-84,-84,-85,-87,-91,-95,-102,-111,-119,-126,-128,-125,-117,-104,-85,-56,-15,37,96,151,196,227,249,276,319,383,462,541,604,639,641,617,577,532,490,452,417,381,339,287,224,151,72,-10,-91,-170,-248,-327,-407,-488,-568,-645,-715,-773,-815,-838,-842,-830,-806,-775,-738,-695,-644,-589,-533,-482,-437,-396,-357,-313,-266,-218,-174,-140,-117,-104,-96,-91,-85,-78,-70,-62,-57,-57,-62,-72,-83,-91,-92,-86,-75,-63,-54,-50,-49,-48,-49,-51,-57,-66,-75,-80,-77,-65,-48,-33,-23,-20,-22,-25,-28,-31,-35,-40,-45,-48,-47,-42,-34,-25,-18,-13,-12,-14,-19,-28,-38,-47,-53,-55,-52,-47,-41,-37,-34,-33,-34,-33,-32,-30,-28,-28,-29,-32,-32,-30,-26,-22,-21,-24,-29,-34,-37,-36,-33,-30,-28,-27,-26,-24,-20,-16,-14,-14,-14,-14,-12,-7,1,10,18,23,23,17,7,-3,-10,-11,-7,2,13,23,33,43,51,58,62,63,64,66,68,69,67,59,47,36,30,34,45,59,71,76,76,75,76,80,87,92,93,88,82,77,77,80,85,88,87,80,69,59,51,49,54,64,77,90,100,104,100,90,76,64,57,60,71,87,104,116,120,118,114,111,112,115,118,116,109,98,87,80,77,77,79,82,84,88,92,96,97,92,82,69,59,56,61,73,85,93,93,85,75,68,67,74,85,95,100,98,92,85,82,83,87,88,85,76,64,53,46,43,44,46,48,52,61,75,88,94,87,70,51,38,40,54,71,81,78,64,47,35,32,36,41,43,42,38,35,32,29,26,23,20,19,17,14,9,4,3,5,10,15,17,14,8,2,-1,-1,2,4,3,-1,-7,-12,-14,-15,-17,-23,-33,-47,-59,-67,-69,-68,-70,-78,-93,-110,-121,-120,-108,-87,-62,-39,-22,-12,-11,-19,-33,-49,-61,-64,-59,-48,-40,-38,-43,-49,-52,-49,-40,-31,-26,-25,-26,-27,-27,-26,-25,-24,-22,-18,-10,-2,3,2,-4,-12,-17,-15,-9,-4,-5,-12,-22,-28,-27,-17,-3,6,6,-6,-27,-48,-63,-68,-62,-49,-35,-25,-23,-27,-35,-42,-43,-38,-32,-27,-30,-40,-54,-68,-76,-78,-74,-68,-62,-59,-57,-57,-59,-63,-67,-71,-73,-72,-69,-65,-62,-59,-57,-55,-55,-57,-61,-65,-70,-73,-75,-75,-76,-79,-86,-91,-92,-83,-61,-31,1,25,38,41,44,58,90,137,186,220,227,204,158,104,57,27,19,31,55,78,87,69,21,-52,-134,-202,-244,-254,-239,-212,-183,-156,-127,-96,-62,-33,-17,-15,-24,-38,-50,-58,-66,-74,-83,-91,-92,-88,-82,-79,-82,-90,-96,-95,-87,-75,-66,-65,-72,-84,-96,-100,-96,-82,-64,-45,-32,-27,-29,-36,-42,-45,-43,-37,-31,-28,-29,-33,-37,-39,-38,-35,-31,-28,-26,-25,-23,-20,-16,-13,-13,-14,-15,-11,0,19,45,72,99,124,147,171,194,218,241,264,285,307,330,355,382,412,443,473,498,512,509,486,446,395,345,303,275,259,246,229,197,149,83,3,-88,-185,-286,-385,-478,-562,-632,-687,-727,-751,-762,-759,-742,-713,-671,-618,-556,-491,-427,-371,-326,-290,-261,-232,-199,-162,-123,-88,-60,-40,-26,-17,-10,-7,-9,-15,-21,-24,-21,-11,0,10,16,18,17,17,18,17,12,2,-12,-27,-36,-37,-29,-14,3,17,24,22,13,0,-13,-24,-32,-37,-38,-36,-29,-19,-8,0,2,-1,-7,-11,-10,-4,2,3,-3,-13,-21,-22,-14,-1,12,18,18,13,8,4,3,1,-2,-9,-17,-26,-35,-41,-44,-41,-29,-10,14,37,54,63,66,66,63,57,45,26,3,-19,-33,-37,-33,-25,-19,-18,-20,-22,-20,-14,-5,5,12,14,13,10,9,13,21,29,36,37,36,34,37,44,53,59,58,50,41,36,38,47,57,62,62,55,46,37,31,27,25,25,28,34,45,58,70,79,81,76,67,58,53,54,58,60,58,52,44,41,43,50,57,60,60,58,59,64,75,87,98,105,106,102,93,81,67,54,45,40,35,28,19,8,2,5,19,42,68,90,103,106,100,91,82,78,78,82,89,98,108,118,128,136,139,139,136,133,131,129,128,126,124,123,125,129,133,136,133,127,120,116,118,125,132,137,135,128,122,119,121,126,126,119,105,89,79,78,87,100,107,106,96,81,65,51,39,27,18,12,14,22,36,48,55,53,46,38,31,27,24,19,11,2,-2,0,7,14,15,6,-9,-26,-39,-44,-44,-39,-33,-25,-12,4,22,36,41,37,28,17,9,3,-3,-13,-26,-43,-58,-70,-77,-77,-68,-48,-20,12,40,62,78,94,116,149,188,223,240,234,205,166,128,104,99,109,125,137,133,110,68,13,-44,-94,-130,-151,-158,-158,-153,-145,-133,-116,-94,-69,-45,-27,-16,-13,-15,-19,-23,-27,-28,-28,-24,-18,-9,1,10,17,20,20,16,12,9,9,10,12,14,13,9,1,-9,-19,-24,-25,-19,-10,-1,4,4,-1,-6,-11,-11,-6,1,10,16,19,17,13,9,6,7,11,16,20,23,25,27,30,34,36,34,28,19,8,-2,-11,-20,-27,-33,-37,-36,-33,-28,-25,-25,-28,-33,-36,-33,-21,-4,18,38,55,65,69,68,63,55,44,34,25,21,20,24,29,34,37,37,31,21,8,-4,-10,-7,5,20,34,40,39,34,28,24,21,19,16,14,17,24,34,42,42,34,19,3,-8,-11,-7,3,14,23,29,29,23,11,-5,-23,-37,-43,-38,-22,4,33,60,78,84,81,72,64,60,60,61,60,56,48,39,31,25,22,24,29,39,51,60,62,55,41,26,17,20,33,51,70,85,97,112,133,161,195,231,262,288,309,327,344,364,391,425,467,510,550,577,587,578,552,514,470,426,386,352,326,304,281,249,202,136,50,-52,-164,-279,-390,-491,-577,-646,-697,-732,-755,-769,-772,-761,-735,-693,-639,-578,-519,-464,-415,-372,-332,-293,-254,-215,-176,-138,-104,-76,-57,-45,-41,-42,-44,-45,-43,-38,-32,-26,-22,-20,-20,-22,-24,-23,-21,-16,-9,-3,2,3,0,-4,-8,-8,-3,6,16,25,30,30,26,17,3,-16,-38,-56,-67,-68,-58,-43,-30,-22,-21,-23,-25,-25,-22,-20,-19,-22,-27,-32,-36,-38,-36,-32,-25,-15,-4,8,18,25,28,25,17,7,-2,-5,-1,8,18,23,23,21,22,28,39,50,55,52,41,29,23,26,38,53,63,65,59,47,35,24,15,7,-2,-12,-19,-21,-15,-2,17,39,63,85,105,119,126,122,110,93,77,65,58,53,46,36,28,27,35,50,66,76,77,71,61,54,54,58,65,71,75,76,76,73,70,66,63,62,64,67,70,70,69,65,62,61,61,63,65,64,59,50,38,27,20,17,19,23,27,30,30,30,28,25,20,13,5,-3,-10,-15,-16,-10,7,35,72,110,140,156,158,157,163,183,217,252,273,268,236,188,143,115,114,137,168,193,197,176,133,78,24,-20,-53,-75,-89,-97,-100,-94,-78,-52,-21,12,38,55,62,63,62,64,68,74,78,77,73,66,60,58,60,65,73,79,82,77,63,44,22,3,-9,-14,-17,-19,-22,-24,-21,-11,2,12,14,5,-11,-27,-36,-35,-28,-22,-24,-35,-51,-66,-73,-69,-58,-44,-33,-28,-26,-27,-26,-23,-17,-12,-10,-12,-17,-22,-24,-21,-15,-11,-11,-17,-27,-39,-49,-56,-61,-67,-73,-79,-84,-86,-87,-89,-91,-95,-99,-101,-103,-103,-102,-98,-92,-81,-67,-50,-33,-14,6,29,54,77,93,101,98,87,72,56,40,26,14,5,-2,-6,-10,-14,-18,-23,-26,-24,-18,-9,1,8,12,14,16,19,25,31,38,42,43,42,38,34,32,31,31,30,28,25,24,26,31,38,45,47,45,39,31,22,15,9,4,2,3,6,9,12,12,10,8,9,12,17,20,21,16,10,4,1,3,9,15,21,24,27,29,31,31,30,27,22,17,14,13,15,17,17,15,11,7,4,5,10,18,28,35,38,35,28,18,7,-1,-6,-6,-3,2,7,11,11,7,0,-11,-22,-33,-40,-42,-38,-33,-31,-33,-42,-54,-64,-68,-65,-56,-45,-37,-35,-39,-44,-47,-44,-34,-19,-2,12,18,17,12,7,3,1,0,-5,-12,-19,-23,-18,-7,6,16,16,6,-12,-32,-48,-59,-62,-60,-54,-45,-37,-32,-32,-38,-46,-53,-56,-55,-53,-51,-53,-57,-61,-60,-53,-45,-38,-36,-39,-45,-51,-55,-57,-57,-58,-59,-59,-52,-38,-14,19,56,94,127,152,169,183,196,214,239,268,299,328,356,383,410,439,468,495,516,530,534,527,508,478,441,400,362,328,296,260,212,149,69,-24,-127,-236,-350,-464,-570,-658,-720,-757,-776,-786,-792,-794,-783,-752,-701,-637,-570,-509,-456,-406,-355,-301,-249,-205,-172,-147,-127,-106,-84,-65,-53,-49,-51,-56,-59,-59,-58,-57,-58,-58,-57,-53,-49,-48,-52,-61,-75,-88,-98,-101,-98,-91,-84,-80,-80,-83,-86,-85,-79,-73,-68,-68,-74,-83,-90,-94,-96,-100,-107,-118,-130,-137,-135,-124,-109,-97,-93,-96,-103,-107,-100,-82,-55,-26,2,25,44,61,80,103,129,154,172,177,164,134,92,49,17,5,14,36,58,66,53,19,-31,-86,-138,-181,-213,-232,-237,-230,-211,-183,-153,-126,-104,-89,-76,-63,-48,-32,-20,-16,-21,-33,-46,-56,-61,-62,-61,-61,-61,-60,-55,-47,-37,-28,-23,-22,-22,-20,-14,-3,10,20,25,21,11,-4,-19,-30,-35,-34,-31,-27,-25,-23,-19,-10,4,21,35,40,34,17,-5,-23,-33,-32,-23,-13,-6,-4,-6,-6,-1,8,21,33,38,36,28,17,8,3,4,8,12,14,12,10,9,11,16,22,27,30,30,30,31,33,38,42,46,48,50,52,55,60,65,70,73,75,75,73,69,63,57,53,53,56,59,61,58,54,50,50,55,62,66,63,55,45,41,46,59,76,88,90,82,69,58,56,64,78,92,98,94,81,66,52,44,42,41,42,44,46,50,53,51,41,23,1,-18,-30,-34,-32,-29,-28,-28,-25,-16,1,23,45,61,68,67,60,50,41,33,29,26,24,19,10,-4,-19,-31,-37,-36,-32,-28,-29,-35,-42,-47,-48,-46,-44,-42,-43,-45,-47,-47,-46,-44,-42,-43,-49,-58,-68,-72,-67,-51,-30,-11,-2,-3,-10,-15,-14,-7,0,-1,-12,-30,-48,-58,-57,-47,-34,-24,-20,-23,-31,-41,-50,-55,-57,-56,-54,-55,-57,-61,-62,-58,-49,-37,-28,-23,-24,-28,-31,-34,-36,-41,-47,-53,-56,-54,-50,-46,-46,-50,-55,-57,-53,-44,-34,-27,-25,-27,-33,-38,-43,-45,-46,-44,-40,-35,-32,-33,-38,-43,-43,-35,-20,-2,9,9,-4,-22,-39,-48,-49,-45,-41,-41,-43,-45,-45,-45,-45,-48,-53,-57,-58,-54,-47,-41,-38,-40,-47,-57,-65,-72,-74,-71,-65,-57,-47,-38,-33,-33,-40,-50,-61,-67,-64,-54,-40,-29,-24,-27,-34,-40,-40,-34,-24,-15,-5,4,16,28,38,40,33,18,3,-5,-3,7,17,22,19,9,-2,-10,-14,-14,-12,-10,-9,-7,-7,-9,-13,-17,-20,-21,-22,-24,-28,-33,-36,-36,-31,-26,-23,-24,-30,-38,-43 }; //心率波函数 public static void Cardiac_wave(/*string fileName*/) { for (int i = 0; i < 8192; i++) { pointData[i] = cardicdata[i]; pointData[i] = (uint)(pointData[i] * (-40.0)); //量化 sendData[i] = (uint)pointData[i]; //整形 WriteAwgBySpi(0x63, (UInt16)(((UInt64)sendData[i] & 0xff))); WriteAwgBySpi(0x64, (UInt16)(((UInt64)sendData[i] >> 8 & 0xff))); } //} } public static void Arbitry_wave(/*string fileName*/) { String filePath = (Hd.CurrHdMessage!.ArbWfmGen![0] as HdMessage.ArbWfmGenOptions).FilePath; StreamReader sr = new StreamReader(filePath); List data = new(); while (!sr.EndOfStream) { data.Add(Int16.Parse(sr.ReadLine())); } sr.Close(); for (int i = 0; i < data.Count; i++) { WriteAwgBySpi(0x63, (UInt16)(((UInt64)data[i] & 0xff))); WriteAwgBySpi(0x64, (UInt16)(((UInt64)data[i] >> 8 & 0xff))); } //} } public static void dc_wave(int Flag)//直流波形数据 { for (int i = 0; i < constDataDeep; i++) { pointData[i] = 1; pointData[i] = (double)(pointData[i] * (Flag)); //量化 sendData[i] = (uint)pointData[i]; //整形 WriteAwgBySpi(0x63, (UInt16)(((UInt64)sendData[i] & 0xff))); WriteAwgBySpi(0x64, (UInt16)(((UInt64)sendData[i] >> 8 & 0xff))); } } #endregion internal static Dictionary CaliKeyValues = new Dictionary() { ["Amplitude00"] = 5.855, ["Amplitude_RAMP03"] = 0.03642, ["Amp_Lorentz"] = 5.32, ["Amp_DC"] = 2.91, ["Amp_Noise"] = 2.03, ["Amp_DC2"] = 0.114, ["Amplitude_RAMP00"] = 4.707, ["Amplitude_RAMP01"] = 0.1818, ["Amplitude01"] = 0.2266, ["Amplitude02"] = 1.164, ["Amplitude03"] = 0.0455, ["Offset_00"] = 2051, ["Offset_01"] = 2051, ["Offset_02"] = 2051, ["Offset_03"] = 2054, ["Offset_CtrlWord_0_Ramp00"] = 2048, ["Offset_CtrlWord_0_Ramp01"] = 2048, ["Offset_CtrlWord_0_Ramp03"] = 2050, }; internal static void Config() { if (!Hd.currProduct!.HardwareConfig!.bExistAWGModule) return; uint fineGain = 0; HdMessage.ArbWfmGenOptions arbWfmGenOptions1 = Hd.CurrHdMessage!.ArbWfmGen![0] as HdMessage.ArbWfmGenOptions;//通道1选择 HdMessage.ArbWfmGenOptions arbWfmGenOptions2 = Hd.CurrHdMessage!.ArbWfmGen![1] as HdMessage.ArbWfmGenOptions;//通道2选择 if (arbWfmGenOptions1.Active || !arbWfmGenOptions1.Active) { bool active = arbWfmGenOptions1.Active; //通道开关 if (active) { WriteAwgBySpi(0x40, (ushort)Convert.ToInt32(active));//通道开 WfmGenMode wfmGenMod = arbWfmGenOptions1.Mode;//工作模式 double noise = arbWfmGenOptions1.Noise / 100; double phase = arbWfmGenOptions1.Phase / 100; double duty = (100.0 - arbWfmGenOptions1.Duty / 100.0) * Math.Pow(2.0, 47) / 100; //计算脉宽 double offset = (double)arbWfmGenOptions1.Offset * 2.25; double Amplitude0 = (uint)arbWfmGenOptions1.Amplitude * 20479 / CaliKeyValues["Amplitude00"]; double Amplitude_00 = Amplitude0 / 1000; double Amplitude1 = (uint)arbWfmGenOptions1.Amplitude * 20479 / CaliKeyValues["Amplitude_RAMP03"]; double Amplitude_RAMP_03 = Amplitude1 / 1000; double Amplitude6 = (uint)arbWfmGenOptions1.Amplitude * 20479 / CaliKeyValues["Amplitude_RAMP00"]; double Amplitude_RAMP_00 = Amplitude6 / 1000; double Amplitude7 = (uint)arbWfmGenOptions1.Amplitude * 20479 / CaliKeyValues["Amplitude_RAMP01"]; double Amplitude_RAMP_01 = Amplitude7 / 1000; double Amplitude2 = (uint)arbWfmGenOptions1.Amplitude * 20479 / CaliKeyValues["Amp_Lorentz"]; double Amplitude_Lorentz = Amplitude2 / 1000; //double Amplitude3 = Math.Abs(arbWfmGenOptions1.Offset) * 20479 / CaliKeyValues["Amp_DC"]; //double Amplitude_DCwave = Amplitude3 / 1000; //double Amplitude_DCwave = (double)arbWfmGenOptions1.Offset; double Amplitude4 = (uint)arbWfmGenOptions1.Amplitude * 20479 / CaliKeyValues["Amp_Noise"]; double Amplitude_Noise = Amplitude4 / 1000; //double Amplitude5 = Math.Abs(arbWfmGenOptions1.Offset) * 20479 / CaliKeyValues["Amplitude5"]; //double Amplitude_DCwave2 = Amplitude5 / 1000; //各个幅度档位的幅度计算,0x00档位使用原计算方法Amplitude的值 double Amplitude001 = (uint)arbWfmGenOptions1.Amplitude * 20479 / CaliKeyValues["Amplitude01"]; double Amplitude_01 = Amplitude001 / 1000; double Amplitude002 = (uint)arbWfmGenOptions1.Amplitude * 20479 / CaliKeyValues["Amplitude02"]; double Amplitude_02 = Amplitude002 / 1000; double Amplitude003 = (uint)arbWfmGenOptions1.Amplitude * 20479 / CaliKeyValues["Amplitude03"]; double Amplitude_03 = Amplitude003 / 1000; double Frequency0 = arbWfmGenOptions1.Frequency * Math.Pow(2.0, 47) / 312500000; //计算频率 double Frequency = Frequency0 / 1000000; int ramp_rise_tem = (int)(100 * Math.Pow(2.0, 24) / (100 - arbWfmGenOptions1.Duty / 100) / 1.25);//上升,整形,不要小数点? int ramp_fall_tem = (int)(100 * Math.Pow(2.0, 24) / (arbWfmGenOptions1.Duty / 100) / 1.25);//下降,整形,不要小数点? string valid_ramp_rise_0B_Value = Convert.ToString(ramp_rise_tem, 2);//将计算出来的整形转换为二进制形式 string valid_ramp_fall_0B_Value = Convert.ToString(ramp_fall_tem, 2); string valid_ramp_rise = valid_ramp_rise_0B_Value.TrimStart();//消除开头的非零位,从第一位不是0的位开始 //string valid_ramp_fall = ramp_fall_string.TrimStart(); string valid_ramp_fall = valid_ramp_fall_0B_Value.TrimStart();//消除开头的非零位,从第一位不是0的位开始 //上升 string str1_rise_high = valid_ramp_rise.Substring(0, 8);//取高八位 UInt16 ramp_rise_high = (Convert.ToUInt16(str1_rise_high, 2)); //上升沿计算将字符串型转换为二进制 string str1_rise_mid = valid_ramp_rise.Substring(8, 8);//取中八位 UInt16 ramp_rise_mid = (Convert.ToUInt16(str1_rise_mid, 2)); string str1_rise_low = valid_ramp_rise.Substring(16, 8);//取低八位 UInt16 ramp_rise_low = Convert.ToUInt16(str1_rise_low, 2); string str1_rise_lastString = valid_ramp_rise.Substring(24).TrimStart();//取最后 UInt64 str1_rise_last = (ulong)str1_rise_lastString.Length; //下降 string str1_fall_high = valid_ramp_fall.Substring(0, 8);//取高八位 UInt16 ramp_fall_high = (Convert.ToUInt16(str1_fall_high, 2)); //上升沿计算将字符串型转换为二进制 string str1_fall_mid = valid_ramp_fall.Substring(8, 8);//取中八位 UInt16 ramp_fall_mid = (Convert.ToUInt16(str1_fall_mid, 2)); string str1_fall_low = valid_ramp_fall.Substring(16, 8);//取低八位 UInt16 ramp_fall_low = Convert.ToUInt16(str1_fall_low, 2); string str1_fall_lastString = (valid_ramp_fall.Substring(24)).TrimStart();//取最后 UInt64 str1_fall_last = (ulong)str1_fall_lastString.Length; WfmGenImpedance impedance = arbWfmGenOptions1.Impedance;//阻抗 //if (impedance == WfmGenImpedance.Low50) //{ // Amplitude *= 2; // Amplitude_RAMP *= 2; // offset *= 2; // Amplitude_Lorentz *= 2.215; //} ArbWfmType wfmType = arbWfmGenOptions1.WfmType;//波形选择 int ampDepth = arbWfmGenOptions1.AmpDepth; long freqBias = arbWfmGenOptions1.FreqBias; // CH1 WriteAwgBySpi(0x40, 0x01); WriteAwgBySpi(0x40, 0x00); WriteAwgBySpi(0x40, 0x01); WriteAwgBySpi(0x00, (ushort)wfmGenMod); //工作模式 //偏置分档位,不同的幅度档位下会影响不同的偏置,因此也要分档 double Offset_CtrlWord_0 = CaliKeyValues["Offset_00"]; int Offset_Fade = 1; if (1 <= (arbWfmGenOptions1.Amplitude / 1000.0) && (arbWfmGenOptions1.Amplitude / 1000.0) <= 5) { //temp_3A = 0x00; WriteAwgBySpi(0x3A, 0x00); //幅度挡位选择 直通 WriteAwgBySpi(0x3C, (UInt16)(((UInt64)Amplitude_00) & 0xff)); //幅度细调 WriteAwgBySpi(0x3D, (UInt16)(((UInt64)Amplitude_00) >> 8 & 0xff)); Offset_Fade = 5; } else if (0.2 <= (arbWfmGenOptions1.Amplitude / 1000.0) && (arbWfmGenOptions1.Amplitude / 1000.0) < 1) { //temp_3A = 0x02; WriteAwgBySpi(0x3A, 0x02); //幅度挡位选择 5倍 WriteAwgBySpi(0x3C, (UInt16)(((UInt64)Amplitude_02) & 0xff)); //幅度细调 WriteAwgBySpi(0x3D, (UInt16)(((UInt64)Amplitude_02) >> 8 & 0xff)); Offset_CtrlWord_0 = CaliKeyValues["Offset_02"]; //offset_cs = 5; } else if (0.04 <= (arbWfmGenOptions1.Amplitude / 1000.0) && (arbWfmGenOptions1.Amplitude / 1000.0) < 0.2) { //temp_3A = 0x01; WriteAwgBySpi(0x3A, 0x01); //幅度挡位选择 25倍 WriteAwgBySpi(0x3C, (UInt16)(((UInt64)Amplitude_01) & 0xff)); //幅度细调 WriteAwgBySpi(0x3D, (UInt16)(((UInt64)Amplitude_01) >> 8 & 0xff)); Offset_CtrlWord_0 = CaliKeyValues["Offset_01"]; Offset_Fade = 5; } else if (0 <= (arbWfmGenOptions1.Amplitude / 1000.0) && (arbWfmGenOptions1.Amplitude / 1000.0) < 0.04) { WriteAwgBySpi(0x3A, 0x03); //幅度挡位选择 125倍 WriteAwgBySpi(0x3C, (UInt16)(((UInt64)Amplitude_03) & 0xff)); //幅度细调 WriteAwgBySpi(0x3D, (UInt16)(((UInt64)Amplitude_03) >> 8 & 0xff)); Offset_CtrlWord_0 = CaliKeyValues["Offset_03"]; } //WriteAwgBySpi(0x3C, 0xff); //幅度细调 //WriteAwgBySpi(0x3D, 0x4f); double Offset_CtrlWord = Offset_CtrlWord_0 - ((offset) * 4096 / 1000) / 8.7 / Offset_Fade; //偏置电压计算 WriteAwgBySpi(0x75, (UInt16)(((UInt64)Offset_CtrlWord) & 0xff));//偏置 WriteAwgBySpi(0x76, (UInt16)(((UInt16)Offset_CtrlWord) >> 8 | 0x60)); //波形选择 switch (wfmType) { case ArbWfmType.Sinusoid: //正弦 WriteAwgBySpi(0x01, 0x00); WriteAwgBySpi(0x61, 0x00); WriteAwgBySpi(0x62, 0x01); SineWave(); WriteAwgBySpi(0x62, 0x00); break; case ArbWfmType.Square: //方波 WriteAwgBySpi(0x01, 0x01); duty = 70368744177664;//50%对应的占空比值 break; case ArbWfmType.Pulse: //脉冲 WriteAwgBySpi(0x01, 0x01); break; case ArbWfmType.Ramp: //锯齿波 WriteAwgBySpi(0x01, 0x05); WriteAwgBySpi(0x3A, 0x00); //幅度挡位选择 double Offset_CtrlWord_0_Ramp = 0 ; if (0.2 <= (arbWfmGenOptions1.Amplitude / 1000.0) && (arbWfmGenOptions1.Amplitude / 1000.0) <= 5) { //temp_3A = 0x00; WriteAwgBySpi(0x3A, 0x00); //幅度挡位选择 直通 WriteAwgBySpi(0x3C, (UInt16)(((UInt64)Amplitude_RAMP_00) & 0xff)); //幅度细调 WriteAwgBySpi(0x3D, (UInt16)(((UInt64)Amplitude_RAMP_00) >> 8 & 0xff)); Offset_CtrlWord_0_Ramp = CaliKeyValues["Offset_CtrlWord_0_Ramp00"]-28 * ( arbWfmGenOptions1.Amplitude / 1000.0 ); } else if (0.04 <= (arbWfmGenOptions1.Amplitude / 1000.0) && (arbWfmGenOptions1.Amplitude / 1000.0) < 0.2) { //temp_3A = 0x01; WriteAwgBySpi(0x3A, 0x01); //幅度挡位选择 25倍 WriteAwgBySpi(0x3C, (UInt16)(((UInt64)Amplitude_RAMP_01) & 0xff)); //幅度细调 WriteAwgBySpi(0x3D, (UInt16)(((UInt64)Amplitude_RAMP_01) >> 8 & 0xff)); Offset_CtrlWord_0_Ramp = CaliKeyValues["Offset_CtrlWord_0_Ramp01"]; } else { //temp_3A = 0x03; WriteAwgBySpi(0x3A, 0x03); //幅度挡位选择 125倍 WriteAwgBySpi(0x3C, (UInt16)(((UInt64)Amplitude_RAMP_03) & 0xff)); //幅度细调 WriteAwgBySpi(0x3D, (UInt16)(((UInt64)Amplitude_RAMP_03) >> 8 & 0xff)); Offset_CtrlWord_0_Ramp = CaliKeyValues["Offset_CtrlWord_0_Ramp03"]; } double Offset_CtrlWord_Ramp = Offset_CtrlWord_0_Ramp - ((offset) * 4096 / 1000) / 10; WriteAwgBySpi(0x75, (UInt16)(((UInt64)Offset_CtrlWord_Ramp) & 0xff));//偏置 WriteAwgBySpi(0x76, (UInt16)(((UInt16)Offset_CtrlWord_Ramp) >> 8 | 0x60)); break; case ArbWfmType.Triangular: //三角波 //三角波和锯齿波的设置相同,唯一不同的是Duty占空比为固定50%,在最后已经赋值 double Offset_CtrlWord_0_Triangular = 0; if (0.2 <= (arbWfmGenOptions1.Amplitude / 1000.0) && (arbWfmGenOptions1.Amplitude / 1000.0) <= 5) { //temp_3A = 0x00; WriteAwgBySpi(0x3A, 0x00); //幅度挡位选择 直通 WriteAwgBySpi(0x3C, (UInt16)(((UInt64)Amplitude_RAMP_00) & 0xff)); //幅度细调 WriteAwgBySpi(0x3D, (UInt16)(((UInt64)Amplitude_RAMP_00) >> 8 & 0xff)); Offset_CtrlWord_0_Triangular = CaliKeyValues["Offset_CtrlWord_0_Ramp00"] - 28 * (arbWfmGenOptions1.Amplitude / 1000.0); } else if (0.04 <= (arbWfmGenOptions1.Amplitude / 1000.0) && (arbWfmGenOptions1.Amplitude / 1000.0) < 0.2) { //temp_3A = 0x01; WriteAwgBySpi(0x3A, 0x01); //幅度挡位选择 25倍 WriteAwgBySpi(0x3C, (UInt16)(((UInt64)Amplitude_RAMP_01) & 0xff)); //幅度细调 WriteAwgBySpi(0x3D, (UInt16)(((UInt64)Amplitude_RAMP_01) >> 8 & 0xff)); Offset_CtrlWord_0_Triangular = CaliKeyValues["Offset_CtrlWord_0_Ramp01"] ; } else { //temp_3A = 0x03; WriteAwgBySpi(0x3A, 0x03); //幅度挡位选择 125倍 WriteAwgBySpi(0x3C, (UInt16)(((UInt64)Amplitude_RAMP_03) & 0xff)); //幅度细调 WriteAwgBySpi(0x3D, (UInt16)(((UInt64)Amplitude_RAMP_03) >> 8 & 0xff)); Offset_CtrlWord_0_Triangular = CaliKeyValues["Offset_CtrlWord_0_Ramp03"] ; } double Offset_CtrlWord_Triangular = Offset_CtrlWord_0_Triangular - ((offset) * 4096 / 1000) / 10; WriteAwgBySpi(0x75, (UInt16)(((UInt64)Offset_CtrlWord_Triangular) & 0xff));//偏置 WriteAwgBySpi(0x76, (UInt16)(((UInt16)Offset_CtrlWord_Triangular) >> 8 | 0x60)); //固定占空比 duty = 70368744177664;//50%对应的占空比值 break; case ArbWfmType.Noise: //噪声 WriteAwgBySpi(0x01, 0x02); WriteAwgBySpi(0x3C, (UInt16)(((UInt64)Amplitude_Noise) & 0xff)); //三角波幅度细调 WriteAwgBySpi(0x3D, (UInt16)(((UInt64)Amplitude_Noise) >> 8 & 0xff)); WriteAwgBySpi(0x3A, 0x00); //幅度挡位选择 break; case ArbWfmType.ExpFall://指数下降 WriteAwgBySpi(0x01, 0x00); WriteAwgBySpi(0x61, 0x00); WriteAwgBySpi(0x62, 0x01); expdown_wave();//指数下降 WriteAwgBySpi(0x62, 0x00); break; case ArbWfmType.ExpRise: WriteAwgBySpi(0x01, 0x00); WriteAwgBySpi(0x61, 0x00); WriteAwgBySpi(0x62, 0x01); expup_wave();//指数上升 WriteAwgBySpi(0x62, 0x00); break; case ArbWfmType.Gaussian://高斯波 WriteAwgBySpi(0x01, 0x00); WriteAwgBySpi(0x61, 0x00); WriteAwgBySpi(0x62, 0x01); gause_wave(1);//高斯波 WriteAwgBySpi(0x62, 0x00); break; case ArbWfmType.Haversine://半正弦波 WriteAwgBySpi(0x01, 0x00); WriteAwgBySpi(0x61, 0x00); WriteAwgBySpi(0x62, 0x01); Half_SineWave();//半正弦波 WriteAwgBySpi(0x62, 0x00); break; case ArbWfmType.Sinc://sinc波 WriteAwgBySpi(0x01, 0x00); WriteAwgBySpi(0x61, 0x00); WriteAwgBySpi(0x62, 0x01); sinc_wave(6);//sinc波 WriteAwgBySpi(0x62, 0x00); break; case ArbWfmType.Lorentz://Lorentz波形 WriteAwgBySpi(0x01, 0x00); WriteAwgBySpi(0x61, 0x00); WriteAwgBySpi(0x62, 0x01); Lorentz();//Lorentz波形 WriteAwgBySpi(0x3C, (UInt16)(((UInt64)Amplitude_Lorentz) & 0xff)); //幅度细调 WriteAwgBySpi(0x3D, (UInt16)(((UInt64)Amplitude_Lorentz) >> 8 & 0xff)); //WriteAwgBySpi(0x3C, 0xff); //幅度细调 //WriteAwgBySpi(0x3D, 0x4f); WriteAwgBySpi(0x3A, 0x00); //幅度挡位选择 WriteAwgBySpi(0x62, 0x00); break; case ArbWfmType.ECG://心率波 WriteAwgBySpi(0x01, 0x00); WriteAwgBySpi(0x61, 0x00); WriteAwgBySpi(0x62, 0x01); Cardiac_wave();//心率波 WriteAwgBySpi(0x62, 0x00); break; case ArbWfmType.DC: //int flag = 0; //WriteAwgBySpi(0x01, 0x00); //WriteAwgBySpi(0x61, 0x00); //WriteAwgBySpi(0x62, 0x01); //if (arbWfmGenOptions1.Offset < 0) //{ flag = 32767; } //else //{ flag = -32767; } //dc_wave(flag);//DC //WriteAwgBySpi(0x62, 0x00); //if (0.1 <= (Math.Abs(arbWfmGenOptions1.Offset) / 1000.0) && (Math.Abs(arbWfmGenOptions1.Amplitude) / 1000.0) <= 2.5) //{ // //temp_3A = 0x00; // WriteAwgBySpi(0x3A, 0x00); //幅度挡位选择 直通 // WriteAwgBySpi(0x3C, (UInt16)(((UInt64)Amplitude_DCwave) & 0xff)); //幅度细调 // WriteAwgBySpi(0x3D, (UInt16)(((UInt64)Amplitude_DCwave) >> 8 & 0xff)); //} //else //{ // //temp_3A = 0x02; // WriteAwgBySpi(0x3A, 0x01); //幅度挡位选择 5倍 // WriteAwgBySpi(0x3C, (UInt16)(((UInt64)Amplitude_DCwave2) & 0xff)); //幅度细调 // WriteAwgBySpi(0x3D, (UInt16)(((UInt64)Amplitude_DCwave2) >> 8 & 0xff)); //} //在不同的幅度下,偏置控制字相同,但是因为不同幅度下增益不同,所以偏置的表现不同 WriteAwgBySpi(0x01, 0x04); WriteAwgBySpi(0x3C, 0xee); //固定幅度2.5V WriteAwgBySpi(0x3D, 0x21); WriteAwgBySpi(0x3A, 0x00); //幅度挡位选择 WriteAwgBySpi(0x75, (UInt16)(((UInt64)Offset_CtrlWord) & 0xff));//偏置 WriteAwgBySpi(0x76, (UInt16)(((UInt16)Offset_CtrlWord) >> 8 | 0x60)); break; case ArbWfmType.Arbitrary: WriteAwgBySpi(0x01, 0x00); WriteAwgBySpi(0x61, 0x00); WriteAwgBySpi(0x62, 0x01); Arbitry_wave();//任意波 WriteAwgBySpi(0x62, 0x00); break; } WriteAwgBySpi(0x03, (UInt16)(((UInt64)Frequency) & 0xff)); //计算频率控制字 WriteAwgBySpi(0x04, (UInt16)(((UInt64)Frequency) >> 8 & 0xff)); WriteAwgBySpi(0x05, (UInt16)(((UInt64)Frequency) >> 16 & 0xff)); WriteAwgBySpi(0x06, (UInt16)(((UInt64)Frequency) >> 24 & 0xff)); WriteAwgBySpi(0x07, (UInt16)(((UInt64)Frequency) >> 32 & 0xff)); WriteAwgBySpi(0x08, (UInt16)(((UInt64)Frequency) >> 40 & 0xff)); WriteAwgBySpi(0x41, (UInt16)(((UInt64)duty) & 0xff)); //计算三角波占空比,计算三角波对称性 WriteAwgBySpi(0x42, (UInt16)(((UInt64)duty) >> 8 & 0xff)); WriteAwgBySpi(0x43, (UInt16)(((UInt64)duty) >> 16 & 0xff)); WriteAwgBySpi(0x44, (UInt16)(((UInt64)duty) >> 24 & 0xff)); WriteAwgBySpi(0x45, (UInt16)(((UInt64)duty) >> 32 & 0xff)); WriteAwgBySpi(0x46, (UInt16)(((UInt64)duty) >> 40 & 0xff)); WriteAwgBySpi(0x47, (UInt16)((ramp_rise_low) & 0xff)); //三角波上升沿计算 WriteAwgBySpi(0x48, (UInt16)((ramp_rise_mid) & 0xff)); WriteAwgBySpi(0x49, (UInt16)((ramp_rise_high) & 0xff)); WriteAwgBySpi(0x4A, (UInt16)((ramp_fall_low) & 0xff)); //三角波下降沿计算 WriteAwgBySpi(0x4B, (UInt16)((ramp_fall_mid) & 0xff)); WriteAwgBySpi(0x4C, (UInt16)((ramp_fall_high) & 0xff)); WriteAwgBySpi(0x4D, (UInt16)((str1_rise_last) & 0xff)); WriteAwgBySpi(0x4E, (UInt16)((str1_fall_last) & 0xff)); WriteAwgBySpi(0x25, (UInt16)(((UInt64)duty) & 0xff)); //脉冲波占空比 WriteAwgBySpi(0x26, (UInt16)(((UInt64)duty) >> 8 & 0xff)); WriteAwgBySpi(0x27, (UInt16)(((UInt64)duty) >> 16 & 0xff)); WriteAwgBySpi(0x28, (UInt16)(((UInt64)duty) >> 24 & 0xff)); WriteAwgBySpi(0x29, (UInt16)(((UInt64)duty) >> 32 & 0xff)); WriteAwgBySpi(0x2A, (UInt16)(((UInt64)duty) >> 40 & 0xff)); WriteAwgBySpi(0x2B, 0x00); //脉冲波上升沿 WriteAwgBySpi(0x2C, 0x40); WriteAwgBySpi(0x2D, 0x9C); WriteAwgBySpi(0x2E, 0x00); //脉冲波下降沿 WriteAwgBySpi(0x2F, 0x40); WriteAwgBySpi(0x30, 0x9C); WriteAwgBySpi(0x31, 0x01); WriteAwgBySpi(0x32, 0x01); } else { WriteAwgBySpi(0x40, (ushort)Convert.ToInt32(active)); } //关闭通道 } if (arbWfmGenOptions2.Active || !arbWfmGenOptions2.Active)//CH2通道开关打开 { bool active = arbWfmGenOptions2.Active; //通道开关 if (active) { WfmGenMode wfmGenMod = arbWfmGenOptions2.Mode; double noise = arbWfmGenOptions2.Noise / 100; double phase = arbWfmGenOptions2.Phase / 100; double duty = (100 - arbWfmGenOptions2.Duty / 100) * Math.Pow(2.0, 47) / 100; //计算脉宽 uint offset = (uint)arbWfmGenOptions2.Offset; double Amplitude0 = (uint)arbWfmGenOptions2.Amplitude * 8191 / 10.7; double Amplitude = Amplitude0 / 1000; double Frequency0 = arbWfmGenOptions2.Frequency * Math.Pow(2.0, 47) / 312500000; //计算频率 double Frequency = Frequency0 / 1000000; WfmGenImpedance impedance = arbWfmGenOptions2.Impedance; if (impedance == WfmGenImpedance.HighZ) Amplitude /= 2; ArbWfmType wfmType = arbWfmGenOptions2.WfmType;//波形选择 int ampDepth = arbWfmGenOptions2.AmpDepth; long freqBias = arbWfmGenOptions2.FreqBias; WriteUsbReg(RST_N, 0x00000); WriteUsbReg(AWG_EN, 0x0000); //CH2 WriteAwgBySpi(0xC0, 0x01); WriteAwgBySpi(0x80, (ushort)wfmGenMod); //工作模式 //波形选择 switch (wfmType) { case ArbWfmType.Sinusoid: //正弦 WriteAwgBySpi(0x81, 0x00); WriteAwgBySpi(0x01, 0x00); WriteAwgBySpi(0x61, 0x00); WriteAwgBySpi(0x62, 0x01); break; case ArbWfmType.Square: //脉冲 WriteAwgBySpi(0x81, 0x01); break; } //WriteAwgBySpi(0x40, 0x00); WriteAwgBySpi(0x83, (UInt16)(((UInt64)Frequency) & 0xff)); //计算频率控制字 WriteAwgBySpi(0x84, (UInt16)(((UInt64)Frequency) >> 8 & 0xff)); WriteAwgBySpi(0x85, (UInt16)(((UInt64)Frequency) >> 16 & 0xff)); WriteAwgBySpi(0x86, (UInt16)(((UInt64)Frequency) >> 24 & 0xff)); WriteAwgBySpi(0x87, (UInt16)(((UInt64)Frequency) >> 32 & 0xff)); WriteAwgBySpi(0x88, (UInt16)(((UInt64)Frequency) >> 40 & 0xff)); WriteAwgBySpi(0xC0, 0x01); WriteAwgBySpi(0xC0, 0x01); WriteAwgBySpi(0xA5, (UInt16)(((UInt64)duty) & 0xff)); //脉冲波占空比 WriteAwgBySpi(0xA6, (UInt16)(((UInt64)duty) >> 8 & 0xff)); WriteAwgBySpi(0xA7, (UInt16)(((UInt64)duty) >> 16 & 0xff)); WriteAwgBySpi(0xA8, (UInt16)(((UInt64)duty) >> 24 & 0xff)); WriteAwgBySpi(0xA9, (UInt16)(((UInt64)duty) >> 32 & 0xff)); WriteAwgBySpi(0xAA, (UInt16)(((UInt64)duty) >> 40 & 0xff)); WriteAwgBySpi(0xBC, (UInt16)(((UInt64)Amplitude) & 0xff)); //幅度细调 WriteAwgBySpi(0xBD, (UInt16)(((UInt64)Amplitude) >> 8 & 0xff)); WriteAwgBySpi(0xBA, 0x08); //幅度挡位选择 //WriteAwgBySpi(0x40, 0x01); } else { WriteAwgBySpi(0xC0, 0x00); }//通道2关 } } internal static void SendWaveSamplingData() { } #region PLL配置 internal static void PllWrite(UInt32 number, UInt32 addr, UInt32 data) { // number 1 : PRO HMC7044 // number 2 : PRO HMC7043 // number 3/5 : ACQ HMC7044 UInt32 temp = ((0x000 << 21) | (addr << 8) | data); WriteUsbReg(PLL_EN_7044, 0x00000000); WriteUsbReg(PLL_DATA_7044L, (UInt32)(UInt16)(temp & 0xffff)); WriteUsbReg(PLL_DATA_7044H, (UInt32)(UInt16)((temp >> 16) & 0x00ff)); WriteUsbReg(PLL_EN_7044, 0x00000001); Thread.Sleep(1); } public static void InitHMC7044_2700_board(uint acq) // { /**********register_config***********/ PllWrite(acq, 0x0000, 0x01); PllWrite(acq, 0x0000, 0x00); PllWrite(acq, 0x0001, 0x40); PllWrite(acq, 0x0002, 0x04); PllWrite(acq, 0x0003, 0x37); PllWrite(acq, 0x0004, 0x7F); PllWrite(acq, 0x0005, 0x81); // SYNC MODE (82、58) PllWrite(acq, 0x0006, 0x00); PllWrite(acq, 0x0007, 0x00); PllWrite(acq, 0x0009, 0x01); //-----------------------------// // 保留寄存器 //---------------------------// PllWrite(acq, 0x0096, 0x00); PllWrite(acq, 0x0097, 0x00); PllWrite(acq, 0x0098, 0x00); PllWrite(acq, 0x0099, 0x00); PllWrite(acq, 0x009A, 0x00); PllWrite(acq, 0x009B, 0xAA); PllWrite(acq, 0x009C, 0xAA); PllWrite(acq, 0x009D, 0xAA); PllWrite(acq, 0x009E, 0xAA); PllWrite(acq, 0x009F, 0x4D); PllWrite(acq, 0x00A0, 0xDF); PllWrite(acq, 0x00A1, 0x97); PllWrite(acq, 0x00A2, 0x03); PllWrite(acq, 0x00A3, 0x00); PllWrite(acq, 0x00A4, 0x00); PllWrite(acq, 0x00A5, 0x06); PllWrite(acq, 0x00A6, 0x1C); PllWrite(acq, 0x00A7, 0x00); PllWrite(acq, 0x00A8, 0x06); PllWrite(acq, 0x00A9, 0x00); PllWrite(acq, 0x00AB, 0x00); PllWrite(acq, 0x00AC, 0x20); PllWrite(acq, 0x00AD, 0x00); PllWrite(acq, 0x00AE, 0x08); PllWrite(acq, 0x00AF, 0x50); PllWrite(acq, 0x00B0, 0x04); PllWrite(acq, 0x00B1, 0x0D); PllWrite(acq, 0x00B2, 0x00); PllWrite(acq, 0x00B3, 0x00); PllWrite(acq, 0x00B5, 0x00); PllWrite(acq, 0x00B6, 0x00); PllWrite(acq, 0x00B7, 0x00); PllWrite(acq, 0x00B8, 0x00); //-----------------------------// // PLL2配置 //---------------------------// PllWrite(acq, 0x0031, 0x01); PllWrite(acq, 0x0032, 0x01); // DOUBLE R PllWrite(acq, 0x0033, 0x01); // R2 LSB[7:0] R2=1 PllWrite(acq, 0x0034, 0x00); // R2 MSB[11:8] PllWrite(acq, 0x0035, 0x19); // N2 LSB[7:0] N2=25 PllWrite(acq, 0x0036, 0x00); // N2 MSB[11:8] PllWrite(acq, 0x0037, 0x0F); PllWrite(acq, 0x0038, 0x18); PllWrite(acq, 0x0039, 0x00); PllWrite(acq, 0x003A, 0x00); PllWrite(acq, 0x003B, 0x00); //-----------------------------// // PLL1配置 //---------------------------// PllWrite(acq, 0x0046, 0x00); PllWrite(acq, 0x0047, 0x00); PllWrite(acq, 0x0048, 0x08); PllWrite(acq, 0x0049, 0x10); PllWrite(acq, 0x0050, 0x1F); PllWrite(acq, 0x0051, 0x2B); PllWrite(acq, 0x0052, 0x37); //HMC7044read(acq, 0x0050, 0x7f); //PllWrite(acq, 0x0050, 0x7f);//1F //PllWrite(acq, 0x0051, 0x7f); //PllWrite(acq, 0x0052, 0x7f); PllWrite(acq, 0x0053, 0x33); PllWrite(acq, 0x0054, 0x03); //// significant start //PllWrite(3, 0x005B, 0x00); //PllWrite(3, 0x005C, 0x80); //PllWrite(3, 0x005D, 0x00); //// significant end PllWrite(acq, 0x0064, 0x00); PllWrite(acq, 0x0065, 0x00); PllWrite(acq, 0x0070, 0xE0); // alarm PllWrite(acq, 0x0071, 0x19); PllWrite(acq, 0x0078, 0x00); PllWrite(acq, 0x0079, 0x00); PllWrite(acq, 0x007A, 0x00); PllWrite(acq, 0x007B, 0x00); PllWrite(acq, 0x007C, 0x00); PllWrite(acq, 0x007D, 0x00); PllWrite(acq, 0x007E, 0x00); PllWrite(acq, 0x0082, 0x00); PllWrite(acq, 0x0083, 0x00); PllWrite(acq, 0x0084, 0x00); PllWrite(acq, 0x0085, 0x00); PllWrite(acq, 0x0086, 0x00); PllWrite(acq, 0x008C, 0x00); PllWrite(acq, 0x008D, 0x00); PllWrite(acq, 0x008E, 0x00); PllWrite(acq, 0x008F, 0x00); PllWrite(acq, 0x0091, 0x00); //-----------------------------// // Sysref Timer //---------------------------// PllWrite(acq, 0x005A, 0x01);//07 PllWrite(acq, 0x005B, 0x04); // 04 PllWrite(acq, 0x005C, 0x00); // [7:0]LSB PllWrite(acq, 0x005D, 0x04); // [3:0]MSB //-----------------------------// // Clock Output Channel //---------------------------// // Output Mode Seclect // DCLK Mode : 0xF3 // SYSREF Pluse Mode : 0x5D // Turn Off : 0x00 PllWrite(acq, 0x00C8, 0xF3); // DCLKOUT0 // AWG_DACCLK 500M PllWrite(acq, 0x00D2, 0xF3); // SCLKOUT1 // AWG_SYSREF PllWrite(acq, 0x00DC, 0xF3 - 1); // DCLKOUT2 // PCIE_REFCLK1 PllWrite(acq, 0x00E6, 0xF3 - 1); // SCLKOUT3 // PCIE_REFCLK0 PllWrite(acq, 0x00F0, 0xF3 - 1); // DCLKOUT4 //DDR3_REFCLK PllWrite(acq, 0x00FA, 0xF3 - 1); // SCLKOUT5 //TEST PllWrite(acq, 0x0104, 0x5D); // DCLKOUT6 //ADC_SYSREF PllWrite(acq, 0x010E, 0xF3); // SCLKOUT7 //ADC_DEVCLK PllWrite(acq, 0x0118, 0xF3); // DCLKOUT8 //FPGA_REFCLK3 REFCLK_125M PllWrite(acq, 0x0122, 0xF3); // SCLKOUT9 //FPGA_REFCLK0 ADC_REF 156.25M PllWrite(acq, 0x012C, 0xF3); // DCLKOUT10 //FPGA_REFCLK1 GLBLCLK_125M PllWrite(acq, 0x0136, 0xF3); // SCLKOUT11 //FPGA_REFCLK2 FPGA_SYSREF PllWrite(acq, 0x0140, 0xF3); // DCLKOUT12 //FPGA_GLBCLK PllWrite(acq, 0x014A, 0xF3); // SCLKOUT13 //FPGA_RESERVED // Output divider // Even divide ratios from 2 to 4094 // Odd divide ratios are 1、3、5 PllWrite(acq, 0x00C9, 0x05); // [7:0]LSB PllWrite(acq, 0x00CA, 0x00); // [3:0]MSB DCLKOUT0 @ 500M MAX1.6G PllWrite(acq, 0x00D3, 0x64); // [7:0]LSB PllWrite(acq, 0x00D4, 0x00); // [3:0]MSB SCLKOUT1 @ AWG_SYSREF PllWrite(acq, 0x00DD, 0x0A); // [7:0]LSB PllWrite(acq, 0x00DE, 0x00); // [3:0]MSB DCLKOUT2 @ 250MHz PllWrite(acq, 0x00E7, 0x0A); // [7:0]LSB PllWrite(acq, 0x00E8, 0x00); // [3:0]MSB SCLKOUT3 @ 250MHz PllWrite(acq, 0x00F1, 0x0C); // [7:0]LSB PllWrite(acq, 0x00F2, 0x00); // [3:0]MSB DCLKOUT4 @ 200MHz PllWrite(acq, 0x00FB, 0x19); // [7:0]LSB PllWrite(acq, 0x00FC, 0x00); // [3:0]MSB SCLKOUT5 @ 100MHz PllWrite(acq, 0x0105, 0x00); // [7:0]LSB PllWrite(acq, 0x0106, 0x04); // [3:0]MSB DCLKOUT6 @ ADC_SYSREF 2.5MHz PllWrite(acq, 0x010F, 0x01); // [7:0]LSB PllWrite(acq, 0x0110, 0x00); // [3:0]MSB SCLKOUT7 @ 2.5GHz PllWrite(acq, 0x0119, 0x00); // [7:0]LSB PllWrite(acq, 0x011A, 0x00); // [3:0]MSB DCLKOUT8 @ 125MHz PllWrite(acq, 0x0123, 0x05); // [7:0]LSB PllWrite(acq, 0x0124, 0x00); // [3:0]MSB SCLKOUT9 @ 500MHz PllWrite(acq, 0x012D, 0x14); // [7:0]LSB PllWrite(acq, 0x012E, 0x00); // [3:0]MSB DCLKOUT10 @ 125MHz PllWrite(acq, 0x0137, 0x64); // [7:0]LSB PllWrite(acq, 0x0138, 0x00); // [3:0]MSB SCLKOUT11 @ SYSREF PllWrite(acq, 0x0141, 0x05); // [7:0]LSB PllWrite(acq, 0x0142, 0x00); // [3:0]MSB DCLKOUT12 @ 500MHz PllWrite(acq, 0x014B, 0x0A); // [7:0]LSB PllWrite(acq, 0x014C, 0x00); // [3:0]MSB SCLKOUT13 @ 125MHz // Fine analog delay // Step size 25ps // 0~23 effective PllWrite(acq, 0x00CB, 0x00); // DCLKOUT0 PllWrite(acq, 0x00DF, 0x00); // DCLKOUT2 PllWrite(acq, 0x00F3, 0x00); // DCLKOUT4 PllWrite(acq, 0x0107, 0x00); // DCLKOUT6 PllWrite(acq, 0x011B, 0x00); // DCLKOUT8 PllWrite(acq, 0x012F, 0x00); // DCLKOUT10 PllWrite(acq, 0x0143, 0x00); // DCLKOUT12 PllWrite(acq, 0x00D5, 0x00); // SCLKOUT1 PllWrite(acq, 0x00E9, 0x00); // SCLKOUT3 PllWrite(acq, 0x00FD, 0x00); // SCLKOUT5 PllWrite(acq, 0x0111, 0x00); // SCLKOUT7 PllWrite(acq, 0x0125, 0x00); // SCLKOUT9 PllWrite(acq, 0x0139, 0x00); // SCLKOUT11 PllWrite(acq, 0x014D, 0x00); // SCLKOUT13 // Coarse digital deladelay // Step size 1/2 VCO cyclk // 0~17 effective PllWrite(acq, 0x00CC, 0x00); // DCLKOUT0 PllWrite(acq, 0x00D6, 0x00); // SCLKOUT1 PllWrite(acq, 0x00E0, 0x00); // DCLKOUT2 PllWrite(acq, 0x00EA, 0x00); // SCLKOUT3 PllWrite(acq, 0x00F4, 0x00); // DCLKOUT4 PllWrite(acq, 0x00FE, 0x00); // SCLKOUT5 PllWrite(acq, 0x0108, 0x00); // DCLKOUT6 PllWrite(acq, 0x0112, 0x00); // SCLKOUT7 PllWrite(acq, 0x011C, 0x00); // DCLKOUT8 PllWrite(acq, 0x0126, 0x00); // SCLKOUT9 PllWrite(acq, 0x0130, 0x00); // DCLKOUT10 PllWrite(acq, 0x013A, 0x00); // SCLKOUT11 PllWrite(acq, 0x0144, 0x00); // DCLKOUT12 PllWrite(acq, 0x014E, 0x00); // SCLKOUT13 // Multislip digital delay // Step size : amount * VCO cycles PllWrite(acq, 0x00CD, 0x00); // [7:0]LSB PllWrite(acq, 0x00CE, 0x00); // [3:0]MSB DCLKOUT0 PllWrite(acq, 0x00D7, 0x00); // [7:0]LSB PllWrite(acq, 0x00D8, 0x00); // [3:0]MSB SCLKOUT1 PllWrite(acq, 0x00E1, 0x00); // [7:0]LSB PllWrite(acq, 0x00E2, 0x00); // [3:0]MSB DCLKOUT2 PllWrite(acq, 0x00EB, 0x00); // [7:0]LSB PllWrite(acq, 0x00EC, 0x00); // [3:0]MSB SCLKOUT3 PllWrite(acq, 0x00F5, 0x00); // [7:0]LSB PllWrite(acq, 0x00F6, 0x00); // [3:0]MSB DCLKOUT4 PllWrite(acq, 0x00FF, 0x00); // [7:0]LSB PllWrite(acq, 0x0100, 0x00); // [3:0]MSB SCLKOUT5 PllWrite(acq, 0x0109, 0x00); // [7:0]LSB PllWrite(acq, 0x010A, 0x00); // [3:0]MSB DCLKOUT6 PllWrite(acq, 0x0113, 0x00); // [7:0]LSB PllWrite(acq, 0x0114, 0x00); // [3:0]MSB SCLKOUT7 PllWrite(acq, 0x011D, 0x00); // [7:0]LSB PllWrite(acq, 0x011E, 0x00); // [3:0]MSB DCLKOUT8 PllWrite(acq, 0x0127, 0x00); // [7:0]LSB PllWrite(acq, 0x0128, 0x00); // [3:0]MSB SCLKOUT9 PllWrite(acq, 0x0131, 0x00); // [7:0]LSB PllWrite(acq, 0x0132, 0x00); // [3:0]MSB DCLKOUT10 PllWrite(acq, 0x013B, 0x00); // [7:0]LSB PllWrite(acq, 0x013C, 0x00); // [3:0]MSB SCLKOUT11 PllWrite(acq, 0x0145, 0x00); // [7:0]LSB PllWrite(acq, 0x0146, 0x00); // [3:0]MSB DCLKOUT12 PllWrite(acq, 0x014F, 0x00); // [7:0]LSB PllWrite(acq, 0x0150, 0x00); // [3:0]MSB SCLKOUT13 // Output mux slelction PllWrite(acq, 0x00CF, 0x01); // DCLKOUT0 PllWrite(acq, 0x00D9, 0x01); // SCLKOUT1 PllWrite(acq, 0x00E3, 0x01); // DCLKOUT2 PllWrite(acq, 0x00ED, 0x01); // SCLKOUT3 PllWrite(acq, 0x00F7, 0x01); // DCLKOUT4 PllWrite(acq, 0x0101, 0x01); // SCLKOUT5 PllWrite(acq, 0x010B, 0x01); // DCLKOUT6 PllWrite(acq, 0x0115, 0x01); // SCLKOUT7 PllWrite(acq, 0x011F, 0x01); // DCLKOUT8 PllWrite(acq, 0x0129, 0x01); // SCLKOUT9 PllWrite(acq, 0x0133, 0x01); // DCLKOUT10 PllWrite(acq, 0x013D, 0x01); // SCLKOUT11 PllWrite(acq, 0x0147, 0x01); // DCLKOUT12 PllWrite(acq, 0x0151, 0x01); // SCLKOUT13 // Output driver PllWrite(acq, 0x00D0, 0x08); // DCLKOUT0 LVPECL PllWrite(acq, 0x00DA, 0x88); // SCLKOUT1 LVPECL PllWrite(acq, 0x00E4, 0x10); // DCLKOUT2 LVDS PllWrite(acq, 0x00EE, 0x10); // SCLKOUT3 LVDS PllWrite(acq, 0x00F8, 0x10); // DCLKOUT4 LVDS PllWrite(acq, 0x0102, 0x10); // SCLKOUT5 LVDS PllWrite(acq, 0x010C, 0x88); // DCLKOUT6 LVPECL PllWrite(acq, 0x0116, 0x08); // SCLKOUT7 LVPECL PllWrite(acq, 0x0120, 0x10); // DCLKOUT8 LVDS PllWrite(acq, 0x012A, 0x10); // SCLKOUT9 LVDS PllWrite(acq, 0x0134, 0x10); // DCLKOUT10 LVDS PllWrite(acq, 0x013E, 0x88); // SCLKOUT11 LVPECL PllWrite(acq, 0x0148, 0x10); // DCLKOUT12 LVDS PllWrite(acq, 0x0152, 0x10); // SCLKOUT13 LVPECL //-----------------------------// // Input buffer //---------------------------// PllWrite(acq, 0x000A, 0x09); // CLKIN0/RFSYNCIN PllWrite(acq, 0x000B, 0x07); // CLKIN1 PllWrite(acq, 0x000C, 0x07); // CLKIN2 PllWrite(acq, 0x000D, 0x09); // CLKIN3 PllWrite(acq, 0x000E, 0x07); // OSCIN //-----------------------------// // Other //---------------------------// PllWrite(acq, 0x0001, 0x02); PllWrite(acq, 0x0001, 0x00); PllWrite(acq, 0x0014, 0x27); //clkin_priority PllWrite(acq, 0x0015, 0x03); PllWrite(acq, 0x0016, 0x0C); PllWrite(acq, 0x0017, 0x00); PllWrite(acq, 0x0018, 0x04); PllWrite(acq, 0x0019, 0x03); PllWrite(acq, 0x001A, 0x08); PllWrite(acq, 0x001B, 0x18); PllWrite(acq, 0x001C, 0x01); PllWrite(acq, 0x001D, 0x01); PllWrite(acq, 0x001E, 0x01); PllWrite(acq, 0x001F, 0x01); PllWrite(acq, 0x0020, 0x0A); PllWrite(acq, 0x0021, 0x01);//R1 LSB[7:0] R1=1 PllWrite(acq, 0x0022, 0x00);//R1 MSB[15:8] PllWrite(acq, 0x0026, 0x0A);//N1 LSB[7:0] N1=10 PllWrite(acq, 0x0027, 0x00);//N1 MSB[15:8] PllWrite(acq, 0x0028, 0x13); PllWrite(acq, 0x0029, 0x07); PllWrite(acq, 0x002A, 0x0F); } #endregion #region DAC37J82 public static void SendCmdToDAC37J82(UInt32 Address_7bit, UInt32 Commmand_16bit)//Addres7bit,Commmand 16bit { UInt32 tmp = ((0x000 << 23) | (Address_7bit << 16) | Commmand_16bit);//(0x001 << 23)Instruction R(1b'1)/W(1b'0) WriteUsbReg(DAC_SEND_EN, 0); WriteUsbReg(DAC_DATA_L, (UInt32)((UInt16)(tmp))); //10'h00:ADC_SPI_data[7:0] <= adsp_databus_wr[7:0]; WriteUsbReg(DAC_DATA_H, (UInt32)((UInt16)(tmp >> 16)));//10'h01:ADC_SPI_data[23:8] <= adsp_databus_wr[15:0]; WriteUsbReg(DAC_SEND_EN, 1); } public static void InitDAC() { WriteUsbReg(RST_N, 0x0000); WriteUsbReg(CLK_RST, 0x0000); WriteUsbReg(CLK_RST, 0x0001); WriteUsbReg(CLK_RST, 0x0000); WriteUsbReg(AWG_EN, 0x0000); WriteUsbReg(DAC_RESET, 0x0001); WriteUsbReg(DAC_RESET, 0x0000); WriteUsbReg(DAC_RESET, 0x0001); //SendCmdToDAC37J82_init(); WriteUsbReg(tx_enable, 0x0000); Thread.Sleep(100); WriteUsbReg(tx_reset, 0x0001); Thread.Sleep(100); WriteUsbReg(axi_aresetn, 0x0000); Thread.Sleep(100); WriteUsbReg(tx_reset, 0x0000); Thread.Sleep(100); WriteUsbReg(axi_aresetn, 0x0001); Thread.Sleep(100); WriteUsbReg(axi_txn_write, 0x0001); Thread.Sleep(100); WriteUsbReg(axi_txn_write, 0x0000); Thread.Sleep(100); WriteUsbReg(tx_enable, 0x0001); Thread.Sleep(100); } public static void SendCmdToDAC37J82_init() { SendCmdToDAC37J82(0x03, 0x5300); SendCmdToDAC37J82(0x31, 0x1000); SendCmdToDAC37J82(0x32, 0x0000); SendCmdToDAC37J82(0x33, 0x0000); SendCmdToDAC37J82(0x34, 0x0000); SendCmdToDAC37J82(0x3B, 0x0000); SendCmdToDAC37J82(0x3C, 0x0028);//28 MPY SendCmdToDAC37J82(0x3D, 0x0088); SendCmdToDAC37J82(0x3E, 0x8128);//128 SendCmdToDAC37J82(0x3F, 0x0000); SendCmdToDAC37J82(0x46, 0x398A); SendCmdToDAC37J82(0x47, 0x20C4); SendCmdToDAC37J82(0x48, 0x0803); SendCmdToDAC37J82(0x49, 0x0000); SendCmdToDAC37J82(0x4A, 0xF03F); SendCmdToDAC37J82(0x4B, 0x1200); SendCmdToDAC37J82(0x4C, 0x1303);//K=20 L=4 SendCmdToDAC37J82(0x4D, 0x0100); SendCmdToDAC37J82(0x4E, 0x0F4F);//hd=1 SendCmdToDAC37J82(0x4F, 0x1C41); SendCmdToDAC37J82(0x50, 0x0000); SendCmdToDAC37J82(0x51, 0x00FF); SendCmdToDAC37J82(0x52, 0x00FF); SendCmdToDAC37J82(0x53, 0x0000); SendCmdToDAC37J82(0x54, 0x00FC); SendCmdToDAC37J82(0x55, 0x00FF); SendCmdToDAC37J82(0x56, 0x0000); SendCmdToDAC37J82(0x57, 0x00FF); SendCmdToDAC37J82(0x58, 0x00FF); SendCmdToDAC37J82(0x59, 0x0000); SendCmdToDAC37J82(0x5A, 0x00FF); SendCmdToDAC37J82(0x5B, 0x00FF); SendCmdToDAC37J82(0x5C, 0x1133); //SendCmdToDAC37J82(0x5D, 0x0000); SendCmdToDAC37J82(0x5E, 0x0000); SendCmdToDAC37J82(0x5F, 0x7654); //pass SerDes lane* to JESD lane* SendCmdToDAC37J82(0x60, 0x3210); SendCmdToDAC37J82(0x61, 0x0211); //SendCmdToDAC37J82(0x62, 0x0000); SendCmdToDAC37J82(0x00, 0x0018); SendCmdToDAC37J82(0x01, 0x0003); SendCmdToDAC37J82(0x02, 0x2002); //SendCmdToDAC37J82(0x02, 0x2012);//NCO_enable SendCmdToDAC37J82(0x04, 0xF0F0); SendCmdToDAC37J82(0x05, 0xFF07); SendCmdToDAC37J82(0x06, 0xFFFF); SendCmdToDAC37J82(0x07, 0x3100); SendCmdToDAC37J82(0x08, 0x0000); SendCmdToDAC37J82(0x09, 0x0000); SendCmdToDAC37J82(0x0A, 0x0000); SendCmdToDAC37J82(0x0B, 0x0000); SendCmdToDAC37J82(0x0C, 0x0400); SendCmdToDAC37J82(0x0D, 0x0400); SendCmdToDAC37J82(0x0E, 0x0400); SendCmdToDAC37J82(0x0F, 0x0400); SendCmdToDAC37J82(0x10, 0x0000); SendCmdToDAC37J82(0x11, 0x0000); SendCmdToDAC37J82(0x12, 0x0000); SendCmdToDAC37J82(0x13, 0x0000); SendCmdToDAC37J82(0x14, 0x0000); SendCmdToDAC37J82(0x15, 0x0000); SendCmdToDAC37J82(0x16, 0x0000); SendCmdToDAC37J82(0x17, 0x0000); SendCmdToDAC37J82(0x18, 0x0000); SendCmdToDAC37J82(0x19, 0x0000); SendCmdToDAC37J82(0x1A, 0x0025); SendCmdToDAC37J82(0x1B, 0x0000); SendCmdToDAC37J82(0x22, 0x1B27); SendCmdToDAC37J82(0x23, 0x01FF); SendCmdToDAC37J82(0x26, 0x0000); SendCmdToDAC37J82(0x2D, 0x0001); SendCmdToDAC37J82(0x2E, 0xFFFF); SendCmdToDAC37J82(0x2F, 0x0004); SendCmdToDAC37J82(0x30, 0x0000); SendCmdToDAC37J82(0x1E, 0x9999); SendCmdToDAC37J82(0x1F, 0x9980); SendCmdToDAC37J82(0x20, 0x8008); SendCmdToDAC37J82(0x25, 0x2000);//div2 SendCmdToDAC37J82(0x68, 0x0000); SendCmdToDAC37J82(0x69, 0x0000); SendCmdToDAC37J82(0x6A, 0x0000); SendCmdToDAC37J82(0x6B, 0x0000); SendCmdToDAC37J82(0x6C, 0x0000); SendCmdToDAC37J82(0x6D, 0x0009); SendCmdToDAC37J82(0x6E, 0x0000); SendCmdToDAC37J82(0x6F, 0x0000); SendCmdToDAC37J82(0x70, 0x0000); SendCmdToDAC37J82(0x71, 0x0000); SendCmdToDAC37J82(0x72, 0x0000); SendCmdToDAC37J82(0x73, 0x0000); SendCmdToDAC37J82(0x74, 0x0000); SendCmdToDAC37J82(0x75, 0x0000); SendCmdToDAC37J82(0x76, 0x0000); SendCmdToDAC37J82(0x77, 0x0000); SendCmdToDAC37J82(0x78, 0x0000); SendCmdToDAC37J82(0x79, 0x0000); SendCmdToDAC37J82(0x7A, 0x0000); SendCmdToDAC37J82(0x7B, 0x0000); SendCmdToDAC37J82(0x7C, 0x0000); SendCmdToDAC37J82(0x7D, 0x0000); SendCmdToDAC37J82(0x4A, 0xF03E); SendCmdToDAC37J82(0x24, 0x0020); SendCmdToDAC37J82(0x5C, 0x1133); SendCmdToDAC37J82(0x4A, 0xF03F); SendCmdToDAC37J82(0x4A, 0xF021); SendCmdToDAC37J82(0x4A, 0xF03E); SendCmdToDAC37J82(0x24, 0x0020); SendCmdToDAC37J82(0x5C, 0x1133); SendCmdToDAC37J82(0x4A, 0xF03F); SendCmdToDAC37J82(0x4A, 0xF021); SendCmdToDAC37J82(0x4A, 0xF03E); SendCmdToDAC37J82(0x24, 0x0020); SendCmdToDAC37J82(0x5C, 0x1133); SendCmdToDAC37J82(0x4A, 0xF03F); SendCmdToDAC37J82(0x4A, 0xF021); SendCmdToDAC37J82(0x03, 0x5301); } #endregion #region AWG_ctrl public static void Modulation_config() { WriteUsbReg(pinit, 0x0000); WriteUsbReg(ftw_modu_L, 0x26e9);//100kHz WriteUsbReg(ftw_modu_M, 0x0831); WriteUsbReg(ftw_modu_H_3bits, 0x0000); WriteUsbReg(modu_type, 0x0000);//1:AM 2:FM WriteUsbReg(am_depth, 0x0100);//0100:25% 0200:50% 0400:100% WriteUsbReg(FTWH_L, 0x9D42);//1kHz WriteUsbReg(FTWH_M, 0x0000); WriteUsbReg(FTWH_H_2bits, 0x0000); WriteUsbReg(Fdelt_L, 0x24DD); WriteUsbReg(Fdelt_M, 0x0106); WriteUsbReg(Fdelt_H_2bits, 0x0000); WriteUsbReg(ALEN, 0x0000); WriteUsbReg(SCLR, 0x0001); WriteUsbReg(SCLR, 0x0000); } private static double[] waveData = { }; /// /// 模拟打拍处理批量写入寄存器序列数据方法,每个寄存器写4次同样的值,降低跨时钟域出错概率 /// /// 待写入的波形数据 /// 波形序列地址寄存器 /// 波形序列值寄存器 public static void SendWaveData(double[] waveData, uint dataAddrInFifo, uint waveDataAddr) { int bytesAfterCopy = 32; Byte[] dataQueue = new Byte[waveData.Length * bytesAfterCopy]; int addrDataSize = 4; byte[] addrbuffer = new byte[addrDataSize]; byte[] databuffer = new byte[addrDataSize]; //使用批量发送,每次发送4kB字节,为保证FPGA写入正确,每个寄存器需要连续写入四次。虽然发送数据总数是逐个发送的4倍,但是采用4kB批量发送,实际发送速度比逐个发送高百倍 for (int fromIndex = 0; fromIndex < waveData.Length; fromIndex++) { addrbuffer = BitConverter.GetBytes((uint)((dataAddrInFifo << 16) | ((uint)fromIndex & 0x0000ffff))); databuffer = BitConverter.GetBytes((uint)((waveDataAddr << 16) | ((uint)waveData[fromIndex] & 0x0000ffff))); for (int toIndex = 0; toIndex < addrDataSize; toIndex++) { Array.Copy(addrbuffer, 0, dataQueue, bytesAfterCopy * fromIndex + toIndex * addrDataSize, addrDataSize); Array.Copy(databuffer, 0, dataQueue, bytesAfterCopy * fromIndex + toIndex * addrDataSize + bytesAfterCopy / 2, addrDataSize); } } int transSize = 4096; byte[] tansQueue = new Byte[transSize]; for (int offset = 0; offset <= dataQueue.Length - transSize;) { Buffer.BlockCopy(dataQueue, offset, tansQueue, 0, transSize); DMAWrite(tansQueue, (uint)transSize); offset += transSize; } } public static void SendDataToDAC_CH(UInt32 Port, UInt32 Data) { UInt32 ConfigWord = 0x00030000u | (Port << 12); ConfigWord <<= 8; ConfigWord |= Data << 4; WriteUsbReg(DAC5668_DATA_L, ConfigWord); WriteUsbReg(DAC5668_DATA_H, ConfigWord >> 16); WriteUsbReg(DAC5668_send_req, 1); //DA片选有效,此处1446i数据的传输大概需要24US的时间(以1MHZ) Thread.Sleep(1); WriteUsbReg(DAC5668_send_req, 0); } public static void AWG_CH_CTRL() { WriteUsbReg(DAC5668_DATA_L, 0x0001); WriteUsbReg(DAC5668_DATA_H, 0x0800); WriteUsbReg(DAC5668_send_req, 1); WriteUsbReg(DAC5668_send_req, 0); SendDataToDAC_CH(2, 0x6666);//port2: 2V DATA_RANGE:0-65535 SendDataToDAC_CH(1, 0x5A05);//port1: OFFSET_CU SendDataToDAC_CH(0, 0xCAFF);//port0: OFFSET_XI SendDataToDAC_CH(3, 0x5000);//port3: V_GAIN WriteUsbReg(CH_CTRL, 0x0003);//BIT Description } #endregion } }