TopSbTmsg.v 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636
  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company: Tair
  4. // Engineer: Churbanov S.
  5. //
  6. // Create Date:
  7. // Design Name:
  8. // Module Name: TopSbtmsg
  9. // Project Name:
  10. // Target Devices:
  11. // Tool versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. // Clk_i - is 24MHz.
  20. //
  21. //////////////////////////////////////////////////////////////////////////////////
  22. module TopSbTmsg
  23. #(
  24. parameter DEVNUM = 8,
  25. parameter WORDWIDTH = 24,
  26. parameter SSPIWORDWIDTH = 24
  27. )
  28. (
  29. input Clk_i,
  30. input Rst_i,
  31. input Sck_i,
  32. input Ss_i,
  33. input Mosi0_i,
  34. inout Mosi1_io,
  35. input Mosi2_i,
  36. input Mosi3_i,
  37. input MisoLdLmx_i,
  38. input MisoDds_i,
  39. input MisoLdMax2870_i,
  40. output I2cScl_o,
  41. inout I2cSda_io,
  42. output RfLd_o,
  43. output AnyFlag_o,
  44. //GPIO
  45. output RfSw1_o,
  46. output RfSw2_o,
  47. output CtrlAmSw3_o,
  48. output DdsSyncCtrlFpga_o,
  49. output DdsResetFpga_o,
  50. output DdsSyncFpga_o,
  51. output LrCtrlFpga_o,
  52. output AmAlcSw_o,
  53. output FpgaAlcDetSet_o,
  54. output SwCap2_o,
  55. output SwCap1_o,
  56. output AmAlc1Fix_o,
  57. output PllVtuneCtrl_o,
  58. output PllSyncCtrl_o,
  59. output PllSync_o,
  60. output PllLoopCtrl_o,
  61. output DdsX2Fpga_o,
  62. output DdsSaw2Fpga_o,
  63. output RefOffsetCtrlFpga_o,
  64. output GpioAdRfV1_o,
  65. output GpioAdRfV2_o,
  66. output DdsSaw1Fpga_o,
  67. output FpgaAmCtrl_o,
  68. output HrCtrlFpga_o,
  69. //Output SPI devices
  70. output reg CsLmx94_o,
  71. output reg ClkLmx94_o,
  72. output reg DataLmx94_o,
  73. output reg CsAd9912Fpga_o,
  74. output reg ClkAd9912Fpga_o,
  75. output reg MosiAd9912Fpga_o,
  76. output reg CsPot_o,
  77. output reg ClkPot_o,
  78. output reg MosiPot_o,
  79. output reg AmDac2Cs_o,
  80. output reg AmDac2Clk_o,
  81. output reg AmDac2_mosi_o,
  82. output reg FpgaCsAtt_o,
  83. output reg FpgaClkAtt_o,
  84. output reg FpgaMosiAtt_o,
  85. output reg CsRegRf2_o,
  86. output reg ClkRegRf2_o,
  87. output reg DataRegRf2_o,
  88. output reg CsMax2870MixRf2_o,
  89. output reg ClkMax2870MixRf2_o,
  90. output reg DataMax2870MixRf2_o,
  91. /* Led */
  92. output FpgaLed_o
  93. );
  94. //================================================================================
  95. // LOCALPARAM
  96. localparam [11:0] BOARD_VER = 12'h2;
  97. localparam [11:0] FIRMWARE_VER = 12'h1;
  98. localparam LED_TICK_RATE = 48000000;//0.5Hz 24MHz
  99. //================================================================================
  100. // REG/WIRE
  101. wire clk24;
  102. wire gclk100;
  103. wire clk5;
  104. wire clk20;
  105. wire clk50;
  106. wire clk26dot25;
  107. wire clk60;
  108. wire spiDataVal;
  109. wire spiDataValSync;
  110. wire [WORDWIDTH-1:0] spiData;
  111. wire [23:0] gpio1CtrlData;
  112. wire busyMosi1;
  113. wire busyMosi4;
  114. wire valLmxDataToFifo;
  115. wire valDdsDataToFifo;
  116. wire valPotDataToFifo;
  117. wire valDacDataToFifo;
  118. wire valAttDataToFifo;
  119. wire valShRegDataToFifo;
  120. wire valMaxDataToFifo;
  121. wire valGpioDataToFifo;
  122. wire flagDirectLmx;
  123. wire flagDirectDds;
  124. wire flagDirectPot;
  125. wire flagDirectDac;
  126. wire flagDirectAtt;
  127. wire flagDirectShReg;
  128. wire flagDirectMax;
  129. wire flagDirectGpio1;
  130. wire flagDirectGpio2;
  131. wire flagDirectTemp;
  132. wire flagDirectServInfo;
  133. wire misoTemp;
  134. wire misoGpio2;
  135. wire misoServInfo;
  136. wire anyFlag;
  137. //Output SpiM wires
  138. wire lmxCsSpiM;
  139. wire lmxClkSpiM;
  140. wire lmxMosiSpiM;
  141. wire ddsCsSpiM;
  142. wire ddsClkSpiM;
  143. wire ddsMosiSpiM;
  144. wire potCsSpiM;
  145. wire potClkSpiM;
  146. wire potMosiSpiM;
  147. wire dacCsSpiM;
  148. wire dacClkSpiM;
  149. wire dacMosiSpiM;
  150. wire attCsSpiM;
  151. wire attClkSpiM;
  152. wire attMosiSpiM;
  153. wire shRegCsSpiM;
  154. wire shRegClkSpiM;
  155. wire shRegMosiSpiM;
  156. wire maxCsSpiM;
  157. wire maxClkSpiM;
  158. wire maxMosiSpiM;
  159. wire [3:0] lmxWordNum;
  160. wire [2:0] ddsWordNum;
  161. wire [2:0] ddsWordNumReg;
  162. wire valWordNum;
  163. wire testTrig;
  164. //InitRst
  165. wire initRst;
  166. reg misoReg;
  167. wire [23:0] servInfo;
  168. /* LedCnt*/
  169. reg [31:0] ledCnt;
  170. /* LedReg */
  171. reg ledReg;
  172. //================================================================================
  173. // ASSIGNMENTS
  174. //================================================================================
  175. assign HrCtrlFpga_o = gpio1CtrlData[23];
  176. assign FpgaAmCtrl_o = gpio1CtrlData[22];
  177. assign DdsSaw1Fpga_o = gpio1CtrlData[21];
  178. assign GpioAdRfV2_o = gpio1CtrlData[20];
  179. assign GpioAdRfV1_o = gpio1CtrlData[19];
  180. assign RefOffsetCtrlFpga_o = gpio1CtrlData[18];
  181. assign DdsSaw2Fpga_o = gpio1CtrlData[17];
  182. assign DdsX2Fpga_o = gpio1CtrlData[16];
  183. assign PllLoopCtrl_o = gpio1CtrlData[15];
  184. assign PllSync_o = gpio1CtrlData[14];
  185. assign PllSyncCtrl_o = gpio1CtrlData[13];
  186. assign AmAlc1Fix_o = gpio1CtrlData[11];
  187. assign SwCap1_o = gpio1CtrlData[10];
  188. assign SwCap2_o = gpio1CtrlData[9];
  189. assign FpgaAlcDetSet_o = gpio1CtrlData[8];
  190. assign AmAlcSw_o = gpio1CtrlData[7];
  191. assign LrCtrlFpga_o = gpio1CtrlData[6];
  192. assign DdsResetFpga_o = gpio1CtrlData[4];
  193. assign DdsSyncCtrlFpga_o = gpio1CtrlData[3];
  194. assign CtrlAmSw3_o = gpio1CtrlData[2];
  195. assign RfSw2_o = gpio1CtrlData[1];
  196. assign RfSw1_o = gpio1CtrlData[0];
  197. assign anyFlag = flagDirectTemp | flagDirectMax | flagDirectDds | flagDirectLmx | flagDirectGpio2;//Debug-only
  198. assign RfLd_o = MisoLdLmx_i;
  199. assign Mosi1_io = misoReg;
  200. assign AnyFlag_o = anyFlag;//Debug-only
  201. assign servInfo = {BOARD_VER, FIRMWARE_VER};
  202. assign FpgaLed_o = ledReg;
  203. //================================================================================
  204. // CODING
  205. /* Blink Led */
  206. always @(posedge Clk_i) begin
  207. if (initRst) begin
  208. ledCnt <= 0;
  209. ledReg <= 1'b1;
  210. end
  211. else begin
  212. if (ledCnt == LED_TICK_RATE) begin
  213. ledReg <= ~ledReg;
  214. ledCnt <= 0;
  215. end
  216. else begin
  217. ledCnt <= ledCnt + 1;
  218. end
  219. end
  220. end
  221. always @(*) begin
  222. if (Rst_i) begin
  223. misoReg = 1'b0;
  224. end
  225. else begin
  226. if (flagDirectLmx) begin
  227. misoReg = MisoLdLmx_i;
  228. end
  229. else if (flagDirectDds) begin
  230. misoReg = MisoDds_i;
  231. end
  232. else if (flagDirectMax) begin
  233. misoReg = MisoLdMax2870_i;
  234. end
  235. else if (flagDirectTemp) begin
  236. misoReg = misoTemp;
  237. end
  238. else if (flagDirectGpio2) begin
  239. misoReg = misoGpio2;
  240. end
  241. else if (flagDirectServInfo) begin
  242. misoReg = misoServInfo;
  243. end
  244. else begin
  245. misoReg = 1'bz;
  246. end
  247. end
  248. end
  249. //====================================
  250. // MUX SpiM devices
  251. //====================================
  252. always @(*) begin
  253. if (flagDirectLmx) begin //LMX
  254. CsLmx94_o = Ss_i;
  255. ClkLmx94_o = Sck_i;
  256. DataLmx94_o = Mosi0_i;
  257. end
  258. else begin
  259. CsLmx94_o = lmxCsSpiM;
  260. ClkLmx94_o = lmxClkSpiM;
  261. DataLmx94_o = lmxMosiSpiM;
  262. end
  263. if (flagDirectDds) begin //DDS
  264. CsAd9912Fpga_o = Ss_i;
  265. ClkAd9912Fpga_o = Sck_i;
  266. MosiAd9912Fpga_o = Mosi0_i;
  267. end
  268. else begin
  269. CsAd9912Fpga_o = ddsCsSpiM;
  270. ClkAd9912Fpga_o = ddsClkSpiM;
  271. MosiAd9912Fpga_o = ddsMosiSpiM;
  272. end
  273. if (flagDirectPot) begin //POT
  274. CsPot_o = Ss_i;
  275. ClkPot_o = Sck_i;
  276. MosiPot_o = Mosi0_i;
  277. end
  278. else begin
  279. CsPot_o = potCsSpiM;
  280. ClkPot_o = potClkSpiM;
  281. MosiPot_o = potMosiSpiM;
  282. end
  283. if (flagDirectDac) begin //DAC
  284. AmDac2Cs_o = Ss_i;
  285. AmDac2Clk_o = Sck_i;
  286. AmDac2_mosi_o = Mosi0_i;
  287. end
  288. else begin
  289. AmDac2Cs_o = dacCsSpiM;
  290. AmDac2Clk_o = dacClkSpiM;
  291. AmDac2_mosi_o = dacMosiSpiM;
  292. end
  293. if (flagDirectAtt) begin //ATT
  294. FpgaCsAtt_o = Ss_i;
  295. FpgaClkAtt_o = Sck_i;
  296. FpgaMosiAtt_o = Mosi0_i;
  297. end
  298. else begin
  299. FpgaCsAtt_o = attCsSpiM;
  300. FpgaClkAtt_o = attClkSpiM;
  301. FpgaMosiAtt_o = attMosiSpiM;
  302. end
  303. if (flagDirectShReg) begin //ShReg
  304. CsRegRf2_o = Ss_i;
  305. ClkRegRf2_o = Sck_i;
  306. DataRegRf2_o = Mosi0_i;
  307. end
  308. else begin
  309. CsRegRf2_o = shRegCsSpiM;
  310. ClkRegRf2_o = shRegClkSpiM;
  311. DataRegRf2_o = shRegMosiSpiM;
  312. end
  313. if (flagDirectMax) begin //MAX
  314. CsMax2870MixRf2_o = Ss_i;
  315. ClkMax2870MixRf2_o = Sck_i;
  316. DataMax2870MixRf2_o = Mosi0_i;
  317. end
  318. else begin
  319. CsMax2870MixRf2_o = maxCsSpiM;
  320. ClkMax2870MixRf2_o = maxClkSpiM;
  321. DataMax2870MixRf2_o = maxMosiSpiM;
  322. end
  323. end
  324. ClkGen ClkGen
  325. (
  326. .Clk24Mhz_i (Clk_i),
  327. .Clk24Mhz_o (clk24),
  328. .Clk100Mhz_o (gclk100),
  329. .Clk5Mhz_o (clk5),
  330. .Clk20Mhz_o (clk20),
  331. .Clk50Mhz_o (clk50),
  332. .Clk26dot25Mhz_o (clk26dot25),
  333. .Clk60Mhz_o (clk60)
  334. );
  335. InitRst InitRst (
  336. .clk_i (clk24),
  337. .signal_o (initRst)
  338. );
  339. InterfaceArbiter
  340. #(
  341. .OUTWORDWIDTH (WORDWIDTH),
  342. .SSPIWORDWIDTH (SSPIWORDWIDTH)
  343. )
  344. SpiSlaveArbiter
  345. (
  346. .Rst_i (Rst_i),
  347. .Clk_i (clk60),
  348. .Sck_i (Sck_i),
  349. .Ss_i (Ss_i),
  350. .Mosi0_i (Mosi0_i),
  351. .Mosi1_i (Mosi1_io),
  352. .Mosi2_i (Mosi2_i),
  353. .Mosi3_i (Mosi3_i),
  354. .DataVal_o (spiDataVal),
  355. .TestTrig_o (testTrig),
  356. .Data_o (spiData)
  357. );
  358. // Sync1bit SyncPulse(
  359. // .ClkFast_i (gclk100),
  360. // .ClkSlow_i (clk60),
  361. // .Signal_i (spiDataVal),
  362. // .Ss_i (Ss_i),
  363. // .Rst_i (initRst),
  364. // .Signal_o (spiDataValSync)
  365. // );
  366. PacketAnalyzer4Mosi PacketAnalyzer4Mosi
  367. (
  368. .Clk_i (clk60),
  369. .Rst_i (Rst_i),
  370. .DataFromSpi_i (spiData),
  371. .ValDataFromSpi_i (spiDataVal),
  372. .BusyMosi1_i (busyMosi1),
  373. .LmxWordNum_o (lmxWordNum),
  374. .DdsWordNum_o (ddsWordNum),
  375. .ValWordNum_o (valWordNum),
  376. .ValLmxDataToFifo_o (valLmxDataToFifo),
  377. .ValDdsDataToFifo_o (valDdsDataToFifo),
  378. .ValPotDataToFifo_o (valPotDataToFifo),
  379. .ValDacDataToFifo_o (valDacDataToFifo),
  380. .ValAttDataToFifo_o (valAttDataToFifo),
  381. .ValShRegDataToFifo_o (valShRegDataToFifo),
  382. .ValMaxDataToFifo_o (valMaxDataToFifo),
  383. .ValGpioDataToFifo_o (valGpioDataToFifo),
  384. .Busy_o (busyMosi4)
  385. );
  386. PacketAnalyzer1Mosi PacketAnalyzer1Mosi
  387. (
  388. .Clk_i (clk60),
  389. .Rst_i (Rst_i),
  390. .DataFromSpi_i (spiData),
  391. .ValDataFromSpi_i (spiDataVal),
  392. .BusyMosi4_i (busyMosi4),
  393. .FlagDirectLmx_o (flagDirectLmx),
  394. .FlagDirectDds_o (flagDirectDds),
  395. .FlagDirectPot_o (flagDirectPot),
  396. .FlagDirectDac_o (flagDirectDac),
  397. .FlagDirectAtt_o (flagDirectAtt),
  398. .FlagDirectShReg_o (flagDirectShReg),
  399. .FlagDirectMax_o (flagDirectMax),
  400. .FlagDirectGpio1_o (flagDirectGpio1),
  401. .FlagDirectTemp_o (flagDirectTemp),
  402. .FlagDirectGpio2_o (flagDirectGpio2),
  403. .FlagDirectServInfo_o (flagDirectServInfo),
  404. .Busy_o (busyMosi1)
  405. );
  406. LmxWrapper #(
  407. .IN_WIDTH (24),
  408. .WR_NUM (1),
  409. .OUT_WIDTH (24),
  410. .DATA_WIDTH (24)
  411. ) LmxWrapper(
  412. .WrClk_i (clk60),
  413. .RdClk_i (clk60),
  414. .Rst_i (initRst),
  415. .Data_i (spiData),
  416. .Val_i (valLmxDataToFifo),
  417. .LmxWordNum_i (lmxWordNum),
  418. .LmxWordNumVal_i (valWordNum),
  419. .DdsWordNumReg_i (ddsWordNumReg),
  420. .DdsCs_i (ddsCsSpiM),
  421. .LmxDirectFlag_i (flagDirectLmx),
  422. .PllVtuneCtrl_o (PllVtuneCtrl_o),
  423. .Ss_o (lmxCsSpiM),
  424. .Sck_o (lmxClkSpiM),
  425. .Mosi_o (lmxMosiSpiM)
  426. );
  427. DDSWrapper #(
  428. .IN_WIDTH (24),
  429. .WR_NUM (4),
  430. .OUT_WIDTH (80),
  431. .DATA_WIDTH (80)
  432. ) DDSWrapper(
  433. .WrClk_i (clk60),
  434. .RdClk_i (clk50),
  435. .Rst_i (initRst),
  436. .DdsWordNum_i (ddsWordNum),
  437. .DdsWordNumVal_i (valWordNum),
  438. .DdsDirectFlag_i (flagDirectDds),
  439. .Data_i (spiData),
  440. .Val_i (valDdsDataToFifo),
  441. .DdsWordNumReg_o (ddsWordNumReg),
  442. .DdsSyncFpga_o (DdsSyncFpga_o),
  443. .Ss_o (ddsCsSpiM),
  444. .Sck_o (ddsClkSpiM),
  445. .Mosi_o (ddsMosiSpiM)
  446. );
  447. PotWrapper #(
  448. .IN_WIDTH (24),
  449. .WR_NUM (1),
  450. .OUT_WIDTH (16),
  451. .DATA_WIDTH (16)
  452. ) PotWrapper(
  453. .WrClk_i (clk60),
  454. .RdClk_i (clk5),
  455. .Rst_i (initRst),
  456. .Data_i (spiData),
  457. .Val_i (valPotDataToFifo),
  458. .Ss_o (potCsSpiM),
  459. .Sck_o (potClkSpiM),
  460. .Mosi_o (potMosiSpiM)
  461. );
  462. DacWrapper #(
  463. .IN_WIDTH (24),
  464. .WR_NUM (1),
  465. .OUT_WIDTH (16),
  466. .DATA_WIDTH (16)
  467. ) DacWrapper(
  468. .WrClk_i (clk60),
  469. .RdClk_i (clk50),
  470. .Rst_i (initRst),
  471. .Data_i (spiData),
  472. .Val_i (valDacDataToFifo),
  473. .Ss_o (dacCsSpiM),
  474. .Sck_o (dacClkSpiM),
  475. .Mosi_o (dacMosiSpiM)
  476. );
  477. AttenuatorWrapper #(
  478. .IN_WIDTH (24),
  479. .WR_NUM (1),
  480. .OUT_WIDTH (16),
  481. .DATA_WIDTH (16)
  482. ) AttenuatorWrapper(
  483. .WrClk_i (clk60),
  484. .RdClk_i (clk50),
  485. .Rst_i (initRst),
  486. .Data_i (spiData),
  487. .Val_i (valAttDataToFifo),
  488. .Ss_o (attCsSpiM),
  489. .Sck_o (attClkSpiM),
  490. .Mosi_o (attMosiSpiM)
  491. );
  492. ShiftRegWrapper #(
  493. .IN_WIDTH (24),
  494. .WR_NUM (1),
  495. .OUT_WIDTH (8),
  496. .DATA_WIDTH (8)
  497. ) ShiftRegWrapper(
  498. .WrClk_i (clk60),
  499. .RdClk_i (clk26dot25),
  500. .Rst_i (initRst),
  501. .Data_i (spiData),
  502. .Val_i (valShRegDataToFifo),
  503. .Ss_o (shRegCsSpiM),
  504. .Sck_o (shRegClkSpiM),
  505. .Mosi_o (shRegMosiSpiM)
  506. );
  507. Max2870Wrapper #(
  508. .IN_WIDTH (24),
  509. .WR_NUM (2),
  510. .OUT_WIDTH (32),
  511. .DATA_WIDTH (32)
  512. ) Max2870Wrapper(
  513. .WrClk_i (clk60),
  514. .RdClk_i (clk20),
  515. .Rst_i (initRst),
  516. .Data_i (spiData),
  517. .Val_i (valMaxDataToFifo),
  518. .Ss_o (maxCsSpiM),
  519. .Sck_o (maxClkSpiM),
  520. .Mosi_o (maxMosiSpiM)
  521. );
  522. TempRead TempRead (
  523. .Clk24Mhz_i (clk24),
  524. .Rst_i (initRst),
  525. .ClkSpi_i (Sck_i),
  526. .FlagDirectTempRead_i (flagDirectTemp),
  527. .I2cScl_o (I2cScl_o),
  528. .I2cSda_io (I2cSda_io),
  529. .MisoTemp_o (misoTemp)
  530. );
  531. Gpio1Ctrl Gpio1Ctrl
  532. (
  533. .Clk_i (clk60),
  534. .ValGpioDataToFifo_i (valGpioDataToFifo),
  535. .ValDataFromSpi_i (spiDataVal),
  536. .FlagDirectGpio1_i (flagDirectGpio1),
  537. .Data_i (spiData),
  538. .GpioReg_o (gpio1CtrlData)
  539. );
  540. Gpio2Read Gpio2Read (
  541. .Clk_i (clk60),
  542. .Rst_i (initRst),
  543. .ClkSpi_i (Sck_i),
  544. .LdMax_i (MisoLdMax2870_i),
  545. .LdLmx_i (MisoLdLmx_i),
  546. .FlagDirectGpio2_i (flagDirectGpio2),
  547. .MisoGpio2_o (misoGpio2)
  548. );
  549. SpiReadback ServInfoReadback (
  550. .ClkSpi_i (Sck_i),
  551. .Rst_i (initRst),
  552. .RegData_i (servInfo),
  553. .FlagDirect_i (flagDirectServInfo),
  554. .Miso_o (misoServInfo)
  555. );
  556. endmodule