Advertisement
Killy728

nisetroi.v

May 3rd, 2025
1,346
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VeriLog 13.82 KB | None | 0 0
  1. //`define DEBUG //デバッグ時にコメントアウト
  2.  
  3. module nisetroi(FX2_SLOE, FX2_SLRD, FX2_SLWR, FX2_FD, FX2_FIFOADR, FX2_PKTEND,
  4.         FX2_FLAGA, FX2_FLAGB, FX2_FLAGC, FX2_IFCLK,
  5.  
  6.         MODE, ADDR, RESET, DIR,
  7.         CLK,Vsync, Hsync, LCDR1, LCDG1, LCDB1, LCDR2, LCDG2, LCDB2,   // 液晶データ
  8.         SND_MCLK, SND_WS, SND_SDO, SOUT,                              // オーディオデータ
  9.         );
  10.  
  11. //FX2信号定義
  12. output FX2_SLOE;
  13. output FX2_SLRD;
  14. output FX2_SLWR;
  15. inout  [7:0] FX2_FD;
  16. output [1:0] FX2_FIFOADR;
  17. output FX2_PKTEND;
  18. input  FX2_FLAGA;
  19. input  FX2_FLAGB;
  20. input  FX2_FLAGC;
  21. input  FX2_IFCLK;
  22.  
  23. `define MODE_START  0   //サンプリング状態
  24. `define MODE_REGR   1   //レジスタ読み出し
  25. `define MODE_REGW   2   //レジスタ書き込み
  26. `define MODE_IDLE   3   //停止状態
  27.  
  28. `define DIR_FX2PC 0
  29. `define DIR_PC2FX 1
  30. input   DIR;
  31.  
  32. input  [1:0] MODE;      //モード設定信号
  33. input  [2:0] ADDR;      //レジスタ選択信号
  34. input  RESET;           //リセット信号
  35.  
  36. input  CLK;             //dotクロック
  37. input  [5:0] LCDR1;     //
  38. input  [5:0] LCDG1;     //
  39. input  [5:0] LCDB1;     //
  40. input  [5:0] LCDR2;     //
  41. input  [5:0] LCDG2;     //
  42. input  [5:0] LCDB2;     //
  43. input  Vsync, Hsync;
  44.  
  45. input  SND_MCLK;
  46. input  SND_WS;
  47. input  SND_SDO;
  48. output SOUT;
  49.  
  50. wire  [7:0] reg_data;       //レジスタ読み出し信号
  51. reg   [23:0] all_cnt;       //サンプリング数カウンタ
  52. reg         screen;
  53. reg         scboth;
  54. reg   [1:0] f_skip;
  55. reg         flip;
  56.  
  57. //レジスタ書き込み処理
  58. always @(posedge FX2_IFCLK)
  59. begin
  60.     if((MODE == `MODE_REGW)&&(ADDR == 0)) begin
  61.         screen   <= FX2_FD[2];
  62.         scboth   <= FX2_FD[3];
  63.         f_skip   <= FX2_FD[1:0];
  64.     end
  65. end
  66.  
  67. //レジスタ読み出し処理
  68. assign reg_data = ((ADDR == 0)&&(DIR == `DIR_FX2PC)) ? all_cnt[7:0] :
  69.                   ((ADDR == 1)&&(DIR == `DIR_FX2PC)) ? all_cnt[15:8] :
  70.                   ((ADDR == 2)&&(DIR == `DIR_FX2PC)) ? all_cnt[23:16] :
  71.                   ((ADDR == 3)&&(DIR == `DIR_FX2PC)) ? 0 :
  72.                   ((ADDR == 4)&&(DIR == `DIR_FX2PC)) ? 0 :
  73.                   ((ADDR == 5)&&(DIR == `DIR_FX2PC)) ? 0 :
  74.                   ((ADDR == 6)&&(DIR == `DIR_FX2PC)) ? 0 :
  75.                   ((ADDR == 7)&&(DIR == `DIR_FX2PC)) ? 0 :
  76.                                                        0;
  77.  
  78. reg  [7:0] byte_data;
  79.  
  80. //サンプリングクロックとFX2クロック(48MHz)の間でデータを変換するために
  81. //14セットのバッファを使用
  82. reg  [5:0] datR [0:13], datG [0:13], datB [0:13];
  83. reg  [1:0] sync [0:13];
  84.  
  85. wire lVsync;
  86. reg  dVsync;
  87. reg  [3:0] sw1;     //バッファ切り替えスイッチ
  88. reg  [8:0] Pcnt;
  89. reg  [4:0] Dcnt;
  90. reg  [7:0] Lcnt;
  91. reg  [1:0] Fcnt;
  92. reg  Initskip;
  93. reg  Hactive, Vactive, Factive;
  94. wire Active;
  95. reg  Vflag;
  96. wire DCLK;
  97. reg  [3:0] CLKDELAY;
  98. reg  [3:0] VSYNCDELAY;
  99. wire [3:0] sw1_0;
  100. wire [3:0] sw1_1;
  101.  
  102.  
  103. // Vsyncが長すぎるので短く切る
  104. assign lVsync = (~Vsync) & (~VSYNCDELAY[3]);
  105. always @( posedge DCLK ) begin
  106.     VSYNCDELAY <= VSYNCDELAY << 1;
  107.     VSYNCDELAY[0] <= Hactive;
  108. end
  109.  
  110. // 48MHzのFX2_IFCLKを使用してCLKの周波数を2倍にする。
  111. assign DCLK = CLK ^ CLKDELAY[3];
  112. always @( posedge FX2_IFCLK ) begin
  113.     CLKDELAY <= CLKDELAY << 1;
  114.     CLKDELAY[0] <= CLK;
  115. end
  116.  
  117. // 一発目のVsyncが来るまでデータを出力しない
  118. always @( posedge lVsync or posedge RESET) begin
  119.     if( RESET == 1 ) begin
  120.         Initskip <= 0;
  121.     end else begin
  122.         Initskip <= 1;
  123.     end
  124. end
  125.  
  126. // 1ライン(300ドット)の内、27~283ドットのデータのみ有効
  127. always @( posedge DCLK or posedge Hsync ) begin
  128.  
  129.     if( Hsync == 1 ) begin
  130.         Pcnt <= 0;
  131.         Hactive <= 0;
  132.     end else begin
  133.         if( Initskip == 1) begin
  134.             Pcnt <= Pcnt + 1'b1;
  135.         end
  136.         if( Pcnt == 27 ) begin
  137.             Hactive <= 1;
  138.         end else begin
  139.             if( Pcnt == 283 ) begin
  140.                 Hactive <= 0;
  141.             end
  142.         end
  143.     end
  144.  
  145. end
  146.  
  147. // 1フレームの内、192ライン以降は無効
  148. always @( posedge Hsync or posedge lVsync) begin
  149.     if( lVsync == 1 ) begin
  150.         Lcnt <= 0;
  151.         Vactive <= 1;
  152.     end else begin
  153.         Lcnt <= Lcnt + 1'b1;
  154.         if( Lcnt == 0 ) begin
  155.             Vactive <= 1;
  156.         end else begin
  157.             if( Lcnt == 191 ) begin
  158.                 Vactive <= 0;
  159.             end
  160.         end
  161.     end
  162. end
  163.  
  164. // フレーム数カウントとフレームスキップ処理
  165. always @( posedge lVsync or posedge RESET ) begin
  166.     if( RESET == 1 ) begin  //RESET
  167.         all_cnt <= 0;
  168.         Factive <= 0;
  169.     end else begin
  170.         flip <= 1;
  171.         all_cnt <= all_cnt + 1; //
  172.  
  173.         if( Fcnt == 0 ) begin
  174.             Factive <= 1;
  175.         end else begin
  176.             Factive <= 0;
  177.         end
  178.  
  179.         if( Fcnt == f_skip ) begin
  180.             Fcnt <= 0;
  181.         end else begin
  182.             Fcnt <= Fcnt + 1;      
  183.         end
  184.     end
  185. end
  186.  
  187. assign Active = Hactive & Vactive & Factive & Initskip;
  188.  
  189. assign sw1_0 = { sw1[3:1], 1'b0 };
  190. assign sw1_1 = { sw1[3:1], 1'b1 };
  191.  
  192. always @( posedge DCLK or posedge RESET) begin
  193.     if( RESET == 1 ) begin
  194.         sw1 <= 0;
  195.     end else begin
  196.         if(DIR == `DIR_FX2PC) begin
  197.             if( ( MODE == `MODE_START ) && Active ) begin
  198.                 if ( scboth == 0 ) begin
  199.                     if ( screen == 0 ) begin
  200.                         begin               //バッファに格納
  201.                             datR[sw1] <= LCDR2;
  202.                             datG[sw1] <= LCDG2;
  203.                             datB[sw1] <= LCDB2;
  204.                             sync[sw1][1] <= lVsync;
  205.                             sync[sw1][0] <= 0;
  206.                         end
  207.  
  208.                         if(sw1 ==  4'b1101)
  209.                             sw1 <= 0;
  210.                         else
  211.                             sw1 <= sw1 + 1;             //バッファスイッチ切り替え
  212.                     end else begin
  213.                         begin               //バッファに格納
  214.                             datR[sw1] <= LCDR1;
  215.                             datG[sw1] <= LCDG1;
  216.                             datB[sw1] <= LCDB1;
  217.                             sync[sw1][1] <= lVsync;
  218.                             sync[sw1][0] <= 1;
  219.                         end
  220.  
  221.                         if(sw1 ==  4'b1101)
  222.                             sw1 <= 0;
  223.                         else
  224.                             sw1 <= sw1 + 1;             //バッファスイッチ切り替え
  225.                     end
  226.                 end else begin
  227.                     begin               //バッファに格納
  228.                         datR[sw1_0] <= LCDR2;
  229.                         datG[sw1_0] <= LCDG2;
  230.                         datB[sw1_0] <= LCDB2;
  231.                         sync[sw1_0][1] <= lVsync;
  232.                         sync[sw1_0][0] <= 0;
  233.  
  234.                         datR[sw1_1] <= LCDR1;
  235.                         datG[sw1_1] <= LCDG1;
  236.                         datB[sw1_1] <= LCDB1;
  237.                         sync[sw1_1][1] <= lVsync;
  238.                         sync[sw1_1][0] <= 1;
  239.                     end
  240.  
  241.                     begin
  242.                         if(sw1 >=  4'b1100)
  243.                             sw1 <= 0;
  244.                         else
  245.                             sw1 <= sw1 + 2;             //バッファスイッチ切り替え
  246.                     end
  247.                 end
  248.             end
  249.         end
  250.     end
  251. end
  252.  
  253. reg slwr;
  254.  
  255. reg [1:0] tcnt;         //1byteづつUSB転送するためのカウンタ
  256. reg [3:0] tsw;          //USB転送するバッファスイッチ
  257. reg [3:0] _sw;          //FX2クロックに同期させた、サンプルバッファスイッチ(SW)
  258. reg [7:0] fifo_data;    //USB転送するデータ
  259.  
  260. //FX2メイン処理
  261. always@ (posedge FX2_IFCLK or posedge RESET) begin
  262.     if(RESET == 1) begin    //RESET信号による初期化
  263.         tsw <= 0;
  264.         tcnt <= 0;
  265.         _sw <= 0;
  266.     end else begin
  267.         if( FX2_FLAGB == 1 ) begin
  268.             _sw <= sw1; //サンプリングクロックにより更新されるswをFX2クロックに同期
  269.             if(tsw != _sw) begin    //サンプルデータが準備できているか?
  270.                 slwr <= 0;  //FX2のライト信号を有効
  271.                 fifo_data <= data_sel(tcnt, datR[tsw], datG[tsw], datB[tsw], sync[tsw]);
  272.                                                     //転送すべきデータをセット
  273.                 tcnt <= tcnt + 1;
  274.                 if(tcnt == 2) begin
  275.                     tcnt <= 0;
  276.                     if(tsw == 4'b1101)
  277.                         tsw <= 0;
  278.                     else
  279.                         tsw <= tsw + 1;             //転送バッファスイッチの更新
  280.                 end
  281.             end
  282.             else begin
  283.                 slwr <= 1;  //FX2のライト信号を無効
  284.             end
  285.         end else begin
  286.             slwr <= 1;  //FX2のライト信号を無効
  287.         end
  288. //      if ( Active == 0 ) begin
  289. //          FX2_PKTEND <= 1;
  290. //      end else begin
  291. //          FX2_PKTEND <= 0;
  292. //      end
  293.     end
  294. end
  295.  
  296.  
  297. //FX2で転送すべきデータ(1byte)をバッファから選択する
  298. function [7:0] data_sel;
  299.     input [1:0] tcnt;
  300.     input [5:0] datR, datG, datB;
  301.     input [1:0] sync;
  302.  
  303.     data_sel[7:6] = sync;
  304.    
  305.     case(tcnt)
  306.         0: data_sel[5:0] = datR;
  307.         1: data_sel[5:0] = datG;
  308.         2: data_sel[5:0] = datB;
  309.         3: data_sel[5:0] = 0;
  310.     endcase
  311. endfunction
  312.  
  313. assign FX2_SLOE = ((DIR == `DIR_PC2FX)&&(MODE == `MODE_START)) ? 0 : 1;
  314. assign FX2_FIFOADR = (DIR == `DIR_FX2PC) ? 2 : 0;
  315. assign FX2_PKTEND = 1;
  316. //assign FX2_SLRD = slrd;
  317. assign FX2_SLWR = slwr;
  318. //FX2のfifoバスはMODE信号で適宜切り替える
  319. assign FX2_FD = ((MODE == `MODE_REGW) || ((DIR == `DIR_PC2FX)&&(MODE == `MODE_START))) ? 8'bzzzzzzzz :
  320.                 (MODE == `MODE_REGR) ? reg_data    : fifo_data;
  321.  
  322. // I2S -> S/PDIF変換32kHz専用
  323.  
  324. reg  [7:0] MCLKCNT;
  325. reg  [1:0] WSCHGCK;
  326. reg  [15:0] SNDBUF [0:1];
  327. wire       MCNTRST;
  328. wire [3:0] MCNT_SDO;
  329. wire       MCLK_SDO;
  330. wire       MCLK128;
  331. reg        SPDIF;
  332. wire [5:0] MCNT_SPDIF;
  333. reg  [7:0] FRMCNT;
  334. reg        Channel;
  335. reg        Parity;
  336. wire       WS,nWS;
  337.  
  338. assign MCNTRST = WSCHGCK[0] ^ WSCHGCK[1];    // サブフレームのカウンタリセット信号
  339. assign MCNT_SDO = MCLKCNT[6:3];
  340. //assign MCNT64  = MCLKCNT[6:1];
  341. assign MCLK128  = MCLKCNT[0];
  342. assign MCLK_SDO = MCLKCNT[2];
  343. assign MCNT_SPDIF = MCLKCNT[6:1];
  344. assign SOUT    = SPDIF;
  345. assign WS      = WSCHGCK[0];
  346. assign nWS     = ~WSCHGCK[0];
  347.  
  348. // ワードクロック
  349. always@ (posedge SND_MCLK )begin
  350.     WSCHGCK <= WSCHGCK << 1;
  351.     WSCHGCK[0] <= SND_WS;
  352. end
  353.  
  354. always@ (negedge SND_MCLK or posedge MCNTRST )begin
  355.     if ( MCNTRST == 1 )
  356.         MCLKCNT <= 0;
  357.     else
  358.         MCLKCNT <= MCLKCNT + 1;
  359. end
  360.  
  361. // フレーム数カウンタ
  362. always@ ( posedge WS )begin
  363.     if ( FRMCNT == 191 )
  364.             FRMCNT <= 0;   
  365.         else
  366.             FRMCNT <= FRMCNT + 1;
  367.  
  368. // Channel bit作成
  369.     case( FRMCNT )
  370.         2,24,25,33: Channel <= 1;
  371.         default:    Channel <= 0;
  372.     endcase
  373. end
  374.  
  375. always@ (posedge MCLK_SDO ) begin
  376. //  case( MCNT_SDO )
  377. //      4'b0000:    SNDBUF[nWS][0] <= SND_SDO;
  378. //      4'b0001:    SNDBUF[WS][15] <= SND_SDO;
  379. //      4'b0010:    SNDBUF[WS][14] <= SND_SDO;
  380. //      4'b0011:    SNDBUF[WS][13] <= SND_SDO;
  381. //      4'b0100:    SNDBUF[WS][12] <= SND_SDO;
  382. //      4'b0101:    SNDBUF[WS][11] <= SND_SDO;
  383. //      4'b0110:    SNDBUF[WS][10] <= SND_SDO;
  384. //      4'b0111:    SNDBUF[WS][9] <= SND_SDO;
  385. //      4'b1000:    SNDBUF[WS][8] <= SND_SDO;
  386. //      4'b1001:    SNDBUF[WS][7] <= SND_SDO;
  387. //      4'b1010:    SNDBUF[WS][6] <= SND_SDO;
  388. //      4'b1011:    SNDBUF[WS][5] <= SND_SDO;
  389. //      4'b1100:    SNDBUF[WS][4] <= SND_SDO;
  390. //      4'b1101:    SNDBUF[WS][3] <= SND_SDO;
  391. //      4'b1110:    SNDBUF[WS][2] <= SND_SDO;
  392. //      4'b1111:    SNDBUF[WS][1] <= SND_SDO;
  393. //  endcase
  394.   if( MCNT_SDO == 4'b0000 ) begin
  395.     SNDBUF[nWS][0] <= SND_SDO;
  396.   end else begin
  397.     SNDBUF[WS] <= SNDBUF[WS] << 1;
  398.     SNDBUF[WS][1] <= SND_SDO;
  399.   end
  400. end
  401.  
  402. // S/PDIFデータ作成
  403. always@ (posedge MCLK128 )begin
  404.     if( MCNT_SPDIF <= 7 ) begin               // Sync作成
  405.         if( nWS == 0 ) begin
  406.             if( FRMCNT == 0 ) begin
  407.                 case( MCNT_SPDIF )            // B 11101000
  408.                     0:  SPDIF <= ~SPDIF;
  409.                     1:  SPDIF <= SPDIF;
  410.                     2:  SPDIF <= SPDIF;
  411.                     3:  SPDIF <= ~SPDIF;
  412.                     4:  SPDIF <= ~SPDIF;
  413.                     5:  SPDIF <= ~SPDIF;
  414.                     6:  SPDIF <= SPDIF;
  415.                     7:  SPDIF <= SPDIF;
  416.                 endcase
  417.             end else begin
  418.                 case( MCNT_SPDIF )            // M 11100010
  419.                     0:  SPDIF <= ~SPDIF;
  420.                     1:  SPDIF <= SPDIF;
  421.                     2:  SPDIF <= SPDIF;
  422.                     3:  SPDIF <= ~SPDIF;
  423.                     4:  SPDIF <= SPDIF;
  424.                     5:  SPDIF <= SPDIF;
  425.                     6:  SPDIF <= ~SPDIF;
  426.                     7:  SPDIF <= ~SPDIF;
  427.                 endcase
  428.             end
  429.         end else begin
  430.             case( MCNT_SPDIF )            // W 11100100
  431.                 0:  SPDIF <= ~SPDIF;
  432.                 1:  SPDIF <= SPDIF;
  433.                 2:  SPDIF <= SPDIF;
  434.                 3:  SPDIF <= ~SPDIF;
  435.                 4:  SPDIF <= SPDIF;
  436.                 5:  SPDIF <= ~SPDIF;
  437.                 6:  SPDIF <= ~SPDIF;
  438.                 7:  SPDIF <= SPDIF;
  439.             endcase
  440.         end
  441.     end else begin                             // データ部分作成
  442.         if ( MCNT_SPDIF[0] == 0 ) begin
  443.             SPDIF <= ~SPDIF;
  444.         end else begin
  445.             case( MCNT_SPDIF )
  446. //              6'b001001:  SPDIF <= SPDIF ^ 0;
  447. //              6'b001011:  SPDIF <= SPDIF ^ 0;
  448. //              6'b001101:  SPDIF <= SPDIF ^ 0;
  449. //              6'b001111:  SPDIF <= SPDIF ^ 0;
  450. //              6'b010001:  SPDIF <= SPDIF ^ 0;
  451. //              6'b010011:  SPDIF <= SPDIF ^ 0;
  452. //              6'b010101:  SPDIF <= SPDIF ^ 0;
  453. //              6'b010111:  SPDIF <= SPDIF ^ 0;
  454.                 6'b011001:
  455.                     begin
  456.                         SPDIF <= SPDIF ^ SNDBUF[nWS][0];
  457.                         Parity <= SNDBUF[nWS][0];
  458.                     end
  459.                 6'b011011:
  460.                     begin
  461.                         SPDIF <= SPDIF ^ SNDBUF[nWS][1];
  462.                         Parity <= Parity + SNDBUF[nWS][1];
  463.                     end
  464.                 6'b011101:
  465.                     begin
  466.                         SPDIF <= SPDIF ^ SNDBUF[nWS][2];
  467.                         Parity <= Parity + SNDBUF[nWS][2];
  468.                     end
  469.                 6'b011111:
  470.                     begin
  471.                         SPDIF <= SPDIF ^ SNDBUF[nWS][3];
  472.                         Parity <= Parity + SNDBUF[nWS][3];
  473.                     end
  474.                 6'b100001:
  475.                     begin
  476.                         SPDIF <= SPDIF ^ SNDBUF[nWS][4];
  477.                         Parity <= Parity + SNDBUF[nWS][4];
  478.                     end
  479.                 6'b100011:
  480.                     begin
  481.                         SPDIF <= SPDIF ^ SNDBUF[nWS][5];
  482.                         Parity <= Parity + SNDBUF[nWS][5];
  483.                     end
  484.                 6'b100101:
  485.                     begin
  486.                         SPDIF <= SPDIF ^ SNDBUF[nWS][6];
  487.                         Parity <= Parity + SNDBUF[nWS][6];
  488.                     end
  489.                 6'b100111:
  490.                     begin
  491.                         SPDIF <= SPDIF ^ SNDBUF[nWS][7];
  492.                         Parity <= Parity + SNDBUF[nWS][7];
  493.                     end
  494.                 6'b101001:
  495.                     begin
  496.                         SPDIF <= SPDIF ^ SNDBUF[nWS][8];
  497.                         Parity <= Parity + SNDBUF[nWS][8];
  498.                     end
  499.                 6'b101011:
  500.                     begin
  501.                         SPDIF <= SPDIF ^ SNDBUF[nWS][9];
  502.                         Parity <= Parity + SNDBUF[nWS][9];
  503.                     end
  504.                 6'b101101:
  505.                     begin
  506.                         SPDIF <= SPDIF ^ SNDBUF[nWS][10];
  507.                         Parity <= Parity + SNDBUF[nWS][10];
  508.                     end
  509.                 6'b101111:
  510.                     begin
  511.                         SPDIF <= SPDIF ^ SNDBUF[nWS][11];
  512.                         Parity <= Parity + SNDBUF[nWS][11];
  513.                     end
  514.                 6'b110001:
  515.                     begin
  516.                         SPDIF <= SPDIF ^ SNDBUF[nWS][12];
  517.                         Parity <= Parity + SNDBUF[nWS][12];
  518.                     end
  519.                 6'b110011:
  520.                     begin
  521.                         SPDIF <= SPDIF ^ SNDBUF[nWS][13];
  522.                         Parity <= Parity + SNDBUF[nWS][13];
  523.                     end
  524.                 6'b110101:
  525.                     begin
  526.                         SPDIF <= SPDIF ^ SNDBUF[nWS][14];
  527.                         Parity <= Parity + SNDBUF[nWS][14];
  528.                     end
  529.                 6'b110111:
  530.                     begin
  531.                         SPDIF <= SPDIF ^ SNDBUF[nWS][15];
  532.                         Parity <= Parity + SNDBUF[nWS][15];
  533.                     end
  534. //              6'b111001:  SPDIF <= SPDIF ^ 0;         // V
  535. //              6'b111011:  SPDIF <= SPDIF ^ 0;         // U
  536.                 6'b111101:
  537.                     begin
  538.                         SPDIF <= SPDIF ^ Channel;   // C
  539.                         Parity <= Parity + Channel;
  540.                     end
  541.                 6'b111111:  SPDIF <= SPDIF ^ Parity;    // P
  542.             endcase
  543.         end
  544.     end
  545. end
  546.  
  547. endmodule
  548.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement