TopSbTmsg.v 12 KB

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