Advertisement
godar_

Untitled

Aug 8th, 2017
385
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. `define SPACE 0
  2. `define DOT 1
  3. `define SCORE 2
  4. `define UNDERSCORE 3
  5. `define COLON 4
  6. `define A 15
  7. `define B 16
  8. `define C 17
  9. `define D 18
  10. `define E 19
  11. `define F 20
  12. `define G 21
  13. `define H 22
  14. `define I 23
  15. `define J 24
  16. `define K 25
  17. `define L 26
  18. `define M 27
  19. `define N 28
  20. `define O 29
  21. `define P 30
  22. `define Q 31
  23. `define R 32
  24. `define S 33
  25. `define T 34
  26. `define U 35
  27. `define V 36
  28. `define W 37
  29. `define X 38
  30. `define Y 39
  31. `define Z 40
  32. //=======================================================
  33. //  This code is generated by Terasic System Builder
  34. //=======================================================
  35.  
  36. module SDRAM_VGA(
  37.  
  38.     //////////// CLOCK //////////
  39.     input                       ADC_CLK_10,
  40.     input                       MAX10_CLK1_50,
  41.     input                       MAX10_CLK2_50,
  42.  
  43.     //////////// SDRAM //////////
  44.     output          [12:0]      DRAM_ADDR,
  45.     output           [1:0]      DRAM_BA,
  46.     output                      DRAM_CAS_N,
  47.     output                      DRAM_CKE,
  48.     output                      DRAM_CLK,
  49.     output                      DRAM_CS_N,
  50.     inout           [15:0]      DRAM_DQ,
  51.     output                      DRAM_LDQM,
  52.     output                      DRAM_RAS_N,
  53.     output                      DRAM_UDQM,
  54.     output                      DRAM_WE_N,
  55.  
  56.     //////////// SEG7 //////////
  57.     output           [7:0]      HEX0,
  58.     output           [7:0]      HEX1,
  59.     output           [7:0]      HEX2,
  60.     output           [7:0]      HEX3,
  61.     output           [7:0]      HEX4,
  62.     output           [7:0]      HEX5,
  63.  
  64.     //////////// KEY //////////
  65.     input            [1:0]      KEY,
  66.  
  67.     //////////// LED //////////
  68.     output           [9:0]      LEDR,
  69.  
  70.     //////////// SW //////////
  71.     input            [9:0]      SW,
  72.  
  73.     //////////// VGA //////////
  74.     output           [3:0]      VGA_B,
  75.     output           [3:0]      VGA_G,
  76.     output                      VGA_HS,
  77.     output           [3:0]      VGA_R,
  78.     output                      VGA_VS,
  79.  
  80.     //////////// Accelerometer //////////
  81.     output                      GSENSOR_CS_N,
  82.     input            [2:1]      GSENSOR_INT,
  83.     output                      GSENSOR_SCLK,
  84.     inout                       GSENSOR_SDI,
  85.     inout                       GSENSOR_SDO,
  86.  
  87.     //////////// Arduino //////////
  88.     inout           [15:0]      ARDUINO_IO,
  89.     inout                       ARDUINO_RESET_N,
  90.  
  91.     //////////// GPIO, GPIO connect to GPIO Default //////////
  92.     inout           [35:0]      GPIO
  93. );
  94.  
  95.  
  96. //=======================================================
  97. //  REG/WIRE declarations
  98. //=======================================================
  99. wire VGA_CTRL_CLK, VGA_SYNC_CLK;
  100. wire holdClk, ramClk;
  101.    
  102. //PLLRAM ramPll(MAX10_CLK2_50, holdClk, ramClk); //c1 sfasato di 3ns in ritardo. c0 usato per l'hold
  103. PLLVGA pll1(MAX10_CLK1_50, VGA_CTRL_CLK, VGA_SYNC_CLK);
  104.  
  105. pll2 test(
  106.     .inclk0(MAX10_CLK2_50),
  107.     .c0(holdClk),
  108.     .c1(ramClk));
  109.    
  110.    
  111. integer count;
  112. integer currentLine;
  113. integer currentColumn;
  114. integer x;
  115. integer y;
  116.  
  117. reg [5:0] carattere;
  118. integer size; //dimensione testo
  119.  
  120. reg [7:0]R_val;
  121. reg [7:0]G_val;
  122. reg [7:0]B_val;
  123.  
  124. //servono 25.175MHz (60Hz)
  125. parameter Htime = 96;//41;      //clock
  126. parameter Vtime = 2;//10;       //lines
  127.  
  128. parameter VBporch = 33;//2; //lines
  129. parameter VFporch = 10;//2; //lines
  130.  
  131. parameter HBporch = 48;//2; //clk
  132. parameter HFporch = 16;//2; //clk
  133.  
  134. parameter columns = 640;
  135. parameter lines = 480;
  136.  
  137. parameter lineTime = (columns+HFporch+Htime+HBporch);   //th
  138. parameter totalFrame = lineTime*(lines+VFporch+Vtime+VBporch);
  139.  
  140. assign VGA_HS = ((currentColumn) > (columns+HFporch) && (currentColumn < (columns+HFporch+Htime)));//HSYNC_val;
  141. assign VGA_VS = ((currentLine) > (lines+VFporch) && (currentLine) < (lines+VFporch+Vtime));//VSYNC_val;
  142.  
  143. assign VGA_R[3:0] = R_val[3:0];
  144. assign VGA_G[3:0] = G_val[3:0];
  145. assign VGA_B[3:0] = B_val[3:0];
  146.  
  147. //tabella font
  148. //n righe, n elementi, n colonne
  149. reg [7:0] font [41][6] = '{
  150.     '{8'h00,8'h00,8'h00,8'h00,8'h00,8'h00}, //   //0
  151.     '{8'h30,8'h30,8'h00,8'h00,8'h00,8'h00}, // . //1
  152.     '{8'h08,8'h08,8'h08,8'h08,8'h08,8'h00}, // - //2
  153.     '{8'h40,8'h40,8'h40,8'h40,8'h40,8'h40}, // _    //3
  154.     '{8'h24,8'h00,8'h00,8'h00,8'h00,8'h00}, // : //4
  155.     '{8'h1e,8'h31,8'h29,8'h25,8'h23,8'h1e}, // 0 //5
  156.     '{8'h22,8'h21,8'h3f,8'h20,8'h20,8'h20}, // 1 //6
  157.     '{8'h32,8'h29,8'h29,8'h29,8'h29,8'h26}, // 2 //7
  158.     '{8'h12,8'h21,8'h21,8'h25,8'h25,8'h1a}, // 3 //8
  159.     '{8'h18,8'h14,8'h12,8'h3f,8'h10,8'h10}, // 4 //9
  160.     '{8'h17,8'h25,8'h25,8'h25,8'h25,8'h19}, // 5 //10
  161.     '{8'h1e,8'h25,8'h25,8'h25,8'h25,8'h18}, // 6 //11
  162.     '{8'h01,8'h01,8'h31,8'h09,8'h05,8'h03}, // 7 //12
  163.     '{8'h1a,8'h25,8'h25,8'h25,8'h25,8'h1a}, // 8 //13
  164.     '{8'h06,8'h29,8'h29,8'h29,8'h29,8'h1e}, // 9 //14
  165.     '{8'h3e,8'h09,8'h09,8'h09,8'h09,8'h3e}, // A //15
  166.     '{8'h3f,8'h25,8'h25,8'h25,8'h25,8'h1a}, // B //16
  167.     '{8'h1e,8'h21,8'h21,8'h21,8'h21,8'h12}, // C //17
  168.     '{8'h3f,8'h21,8'h21,8'h21,8'h12,8'h0c}, // D //18
  169.     '{8'h3f,8'h25,8'h25,8'h25,8'h25,8'h21}, // E //19
  170.     '{8'h3f,8'h05,8'h05,8'h05,8'h05,8'h01}, // F //20
  171.     '{8'h1e,8'h21,8'h21,8'h21,8'h29,8'h1a}, // G //21
  172.     '{8'h3f,8'h04,8'h04,8'h04,8'h04,8'h3f}, // H //22
  173.     '{8'h21,8'h21,8'h3f,8'h21,8'h21,8'h21}, // I //23
  174.     '{8'h10,8'h20,8'h20,8'h20,8'h20,8'h1f}, // J //24
  175.     '{8'h3f,8'h04,8'h0c,8'h0a,8'h11,8'h20}, // K //25
  176.     '{8'h3f,8'h20,8'h20,8'h20,8'h20,8'h20}, // L //26
  177.     '{8'h3f,8'h02,8'h04,8'h04,8'h02,8'h3f}, // M //27
  178.     '{8'h3f,8'h02,8'h04,8'h08,8'h10,8'h3f}, // N //28
  179.     '{8'h1e,8'h21,8'h21,8'h21,8'h21,8'h1e}, // O //29
  180.     '{8'h3f,8'h09,8'h09,8'h09,8'h09,8'h06}, // P //30
  181.     '{8'h1e,8'h21,8'h29,8'h31,8'h21,8'h1e}, // Q //31
  182.     '{8'h3f,8'h09,8'h09,8'h09,8'h19,8'h26}, // R //32
  183.     '{8'h12,8'h25,8'h25,8'h25,8'h25,8'h18}, // S //33
  184.     '{8'h01,8'h01,8'h01,8'h3f,8'h01,8'h01}, // T //34
  185.     '{8'h1f,8'h20,8'h20,8'h20,8'h20,8'h1f}, // U //35
  186.     '{8'h0f,8'h10,8'h20,8'h20,8'h10,8'h0f}, // V //36
  187.     '{8'h1f,8'h20,8'h10,8'h10,8'h20,8'h1f}, // W //37
  188.     '{8'h21,8'h12,8'h0c,8'h0c,8'h12,8'h21}, // X //38
  189.     '{8'h01,8'h02,8'h0c,8'h38,8'h04,8'h02}, // Y //39
  190.     '{8'h21,8'h31,8'h29,8'h25,8'h23,8'h21}  // Z //40
  191. };
  192.  
  193. //array che contiene le scritte
  194. reg [5:0] arrayChar [columns/6][lines/8]; //6 = larghezza font - 8 = altezza font (8 solo perchè è un byte, ne usiamo solo 6 di bit)
  195.  
  196. //=======================================================
  197. //  Structural coding
  198. //=======================================================
  199. always @(negedge VGA_CTRL_CLK)
  200. begin
  201.     if (count < totalFrame)
  202.         count = count + 1;
  203.     else
  204.         count = 0;
  205. end
  206.  
  207.  
  208.  
  209. always @(negedge VGA_CTRL_CLK)
  210. begin
  211.     currentColumn = count%lineTime;
  212.     currentLine = count/lineTime;
  213.    
  214.     if ((currentLine) < lines && (currentColumn) < columns)
  215.     begin //------0
  216.             //sotto è prima modifica
  217.             carattere = arrayChar[currentColumn/(8*size)][currentLine/(8*size)];//[currentColumn/6][currentLine/8]; //contiene l'indice del carattere scelto nella tabella dei caratteri "char" --- gli indici indicano la posizione sullo schermo
  218.             //------ questo sotto funziona tutto
  219.             if (font[carattere][(currentColumn/size)%8][(currentLine/size)%8]) //carattere, colonna e riga alla fine
  220.             begin
  221.                 R_val [7:0] = 255;
  222.                 G_val [7:0] = 255;
  223.                 B_val [7:0] = 255;
  224.             end
  225.             else
  226.             begin //------
  227.                 R_val [7:0] = 0;
  228.                 G_val [7:0] = 0;
  229.                 B_val [7:0] = 10;
  230.             end //------
  231.             //------
  232.     end //------0
  233.     else
  234.     begin
  235.     R_val [7:0] = 0;
  236.     G_val [7:0] = 0;
  237.     B_val [7:0] = 0;
  238.     end
  239.    
  240.    
  241. //-------
  242. end //always
  243.  
  244.  
  245. //scritta test memoria ram
  246. always @(1)
  247. begin
  248.     size = 2;
  249.     arrayChar[1][1] = `T;
  250.     arrayChar[2][1] = `E;
  251.     arrayChar[3][1] = `S;
  252.     arrayChar[4][1] = `T;
  253.     arrayChar[5][1] = `SPACE;
  254.     arrayChar[6][1] = `M;
  255.     arrayChar[7][1] = `E;
  256.     arrayChar[8][1] = `M;
  257.     arrayChar[9][1] = `O;
  258.     arrayChar[10][1] = `R;
  259.     arrayChar[11][1] = `I;
  260.     arrayChar[12][1] = `A;
  261.     arrayChar[13][1] = `SPACE;
  262.     arrayChar[14][1] = `R;
  263.     arrayChar[15][1] = `A;
  264.     arrayChar[16][1] = `M;
  265.     arrayChar[17][1] = `DOT;
  266.     arrayChar[18][1] = `DOT;
  267.     arrayChar[19][1] = `DOT;
  268.  
  269.    
  270. end
  271.  
  272. wire readEmpty, readAvailable, writeFull, busy;
  273. reg [15:0] OUTData [8];
  274. reg [15:0] INData [8];
  275.  
  276. reg [1:0] rdBank = 2'b0;
  277. wire [12:0] rdRow = {8'b0, SW[3:0]};
  278. wire [9:0] rdColumn = {5'b0, SW[3:0]};
  279.  
  280. reg [1:0] wrBank = 2'b0;
  281. wire [12:0] wrRow = {8'b0, SW[3:0]};
  282. wire [9:0] wrColumn = {5'b0, SW[3:0]};
  283.  
  284. wire [7:0] currentCommand = {DRAM_CKE, DRAM_CS_N, DRAM_RAS_N, DRAM_CAS_N, DRAM_WE_N, DRAM_BA[1:0], DRAM_ADDR[10]};
  285. always @(1)
  286. begin
  287.         INData[0][15:0] = {SW[9:4], SW[9:4], SW[9:4], SW[9:4]};
  288.        
  289.         arrayChar[1][4] = `A;
  290.         arrayChar[2][4] = `D;
  291.         arrayChar[3][4] = `D;
  292.         arrayChar[4][4] = `R;
  293.         arrayChar[5][4] = `COLON;
  294.         arrayChar[6][4] =  SW[3:0]+5;
  295.        
  296.         arrayChar[1][5] = `I;
  297.         arrayChar[2][5] = `N;
  298.         arrayChar[3][5] = `P;
  299.         arrayChar[4][5] = `T;
  300.         arrayChar[5][5] = `COLON;
  301.         arrayChar[6][5] =  INData[0][3:0]+5;
  302.        
  303.         arrayChar[1][6] = `O;
  304.         arrayChar[2][6] = `U;
  305.         arrayChar[3][6] = `P;
  306.         arrayChar[4][6] = `T;
  307.         arrayChar[5][6] = `COLON;
  308.        
  309.         arrayChar[6][7] =  OUTData[0][3:0]+5;
  310.         arrayChar[7][7] =  OUTData[0][7:4]+5;
  311.         arrayChar[8][7] =  OUTData[0][11:8]+5;
  312.         arrayChar[9][7] =  OUTData[0][15:12]+5;
  313.        
  314.         arrayChar[11][7] =  OUTData[1][3:0]+5;
  315.         arrayChar[12][7] =  OUTData[1][7:4]+5;
  316.         arrayChar[13][7] =  OUTData[1][11:8]+5;
  317.         arrayChar[14][7] =  OUTData[1][15:12]+5;
  318.        
  319.         arrayChar[16][7] =  OUTData[2][3:0]+5;
  320.         arrayChar[17][7] =  OUTData[2][7:4]+5;
  321.         arrayChar[18][7] =  OUTData[2][11:8]+5;
  322.         arrayChar[19][7] =  OUTData[2][15:12]+5;
  323.        
  324.         arrayChar[21][7] =  OUTData[3][3:0]+5;
  325.         arrayChar[22][7] =  OUTData[3][7:4]+5;
  326.         arrayChar[23][7] =  OUTData[3][11:8]+5;
  327.         arrayChar[24][7] =  OUTData[3][15:12]+5;
  328.        
  329.         arrayChar[6][8] =  OUTData[4][3:0]+5;
  330.         arrayChar[7][8] =  OUTData[4][7:4]+5;
  331.         arrayChar[8][8] =  OUTData[4][11:8]+5;
  332.         arrayChar[9][8] =  OUTData[4][15:12]+5;
  333.        
  334.         arrayChar[11][8] =  OUTData[5][3:0]+5;
  335.         arrayChar[12][8] =  OUTData[5][7:4]+5;
  336.         arrayChar[13][8] =  OUTData[5][11:8]+5;
  337.         arrayChar[14][8] =  OUTData[5][15:12]+5;
  338.        
  339.         arrayChar[16][8] =  OUTData[6][3:0]+5;
  340.         arrayChar[17][8] =  OUTData[6][7:4]+5;
  341.         arrayChar[18][8] =  OUTData[6][11:8]+5;
  342.         arrayChar[19][8] =  OUTData[6][15:12]+5;
  343.        
  344.         arrayChar[21][8] =  OUTData[7][3:0]+5;
  345.         arrayChar[22][8] =  OUTData[7][7:4]+5;
  346.         arrayChar[23][8] =  OUTData[7][11:8]+5;
  347.         arrayChar[24][8] =  OUTData[7][15:12]+5;
  348.            
  349.        
  350.  
  351.        
  352.  
  353. end
  354.  
  355. reg reset_n, readRq, writeRq;
  356. button breset_n(SW[9], MAX10_CLK1_50, 1, reset_n);
  357. button breadRq(~KEY[0], MAX10_CLK1_50, 1, readRq);
  358. button bwriteRq(~KEY[1], MAX10_CLK1_50, 1, writeRq);
  359. assign LEDR[5] = 1;
  360. assign LEDR[9] = SW[9];
  361. assign LEDR[8] = holdClk;
  362. assign LEDR[7] = ramClk;
  363. SDRAM_CONTROLLER miaRam(
  364.     SW[9],
  365.     holdClk, //il PLL viene implementato qui (cioè dentro il file SDRAM_CONTROLLER.v) stesso (così come le FIFO)
  366.     ramClk,
  367.     /////////////////////////////
  368.    
  369.     //read FIFO (tutti gli altri pin delle FIFo vengono definiti successivamente quando verranno inizializzate le FIFO)
  370.    
  371.     readEmpty,      //controlla se la FIFO di lettura è vuota
  372.     OUTData,        //da qui vengono prelevati i dati appena letti dalla RAM
  373.    
  374.     //fine read FIFO
  375.    
  376.     readAvailable,      //=1 se la lettura è stata eseguita e quindi dato disponibile in dataUT (??)
  377.     readRq,                 //=1 quando si vuole eseguire una lettura (una volta completata la lettura)
  378.     rdBank,             //seleziona il bank
  379.     rdRow,              //seleziona la linea
  380.     rdColumn,           //seleziona la colonna
  381.    
  382.     /////////////////////////////
  383.    
  384.     //write FIFO
  385.    
  386.     writeFull,      //controlla se la FIFO di scrittura è piena
  387.     INData, //riceve i dati che verranno scritti in RAM
  388.    
  389.     //fine write FIFO
  390.    
  391. //  output writeBusy,               //durante una scrittura viene posto a 1 e impedisce scritture "contemporanee"
  392.     writeRq,                    //=1 quando si vuole eseguire una scrittura
  393.     wrBank,             //seleziona il bank di partenza
  394.     wrRow,              //seleziona la linea di partenza
  395.     wrColumn,           //seleziona la colonna di partenza
  396.    
  397.     LEDR[1],
  398.        
  399.     //////////// SDRAM //////////
  400. DRAM_ADDR[12:0],
  401. DRAM_BA[1:0],
  402. DRAM_CAS_N,
  403. DRAM_CKE,
  404. DRAM_CLK,
  405. DRAM_CS_N,
  406. DRAM_DQ[15:0],
  407. DRAM_LDQM,
  408. DRAM_RAS_N,
  409. DRAM_UDQM,
  410. DRAM_WE_N,
  411. LEDR[0]
  412. );
  413.  
  414.  
  415. //wire mioClk;
  416. //clk_div asd(MAX10_CLK1_50, 1, 50, mioClk);
  417. //
  418. //always @(posedge mioClk)
  419. //begin
  420. //  readRq = ~KEY[0];
  421. //  writeRq = ~KEY[1];
  422. //end
  423.  
  424. //reg [12:0] DRAM_ADDR_reg;
  425. //reg [1:0] DRAM_BA_reg;
  426. //reg DRAM_CAS_N_reg;
  427. //reg DRAM_CKE_reg;
  428. //reg DRAM_CLK_reg;
  429. //reg DRAM_CS_N_reg;
  430. //reg [15:0] DRAM_DQ_reg;
  431. //reg DRAM_LDQM_reg;
  432. //reg DRAM_RAS_N_reg;
  433. //reg DRAM_UDQM_reg;
  434. //reg DRAM_WE_N_reg;
  435.  
  436.  
  437. //  assign DRAM_ADDR = DRAM_ADDR_reg;
  438. //  assign DRAM_BA = DRAM_BA_reg;
  439. //  assign DRAM_CAS_N = DRAM_CAS_N_reg;
  440. //  assign DRAM_CKE = DRAM_CKE_reg;
  441. //  assign DRAM_CLK = DRAM_CLK_reg;
  442. //  assign DRAM_CS_N = DRAM_CS_N_reg;
  443. //  assign DRAM_DQ = DRAM_DQ_reg;
  444. //  assign DRAM_LDQM = DRAM_LDQM_reg;
  445. //  assign DRAM_RAS_N = DRAM_RAS_N_reg;
  446. //  assign DRAM_UDQM = DRAM_UDQM_reg;
  447. //  assign DRAM_WE_N = DRAM_WE_N_reg;
  448.  
  449. endmodule
  450.  
  451. //--------- MODULO CHE CI PERMETTE DI DIVIDERE IL CLOCK IN UNA FREQUENZA QUALSIASI
  452. module clk_div(input clk_in, input [31:0] freq, input [7:0] duty_cycle, output reg clk_out);
  453. integer count;
  454. always @ (posedge clk_in)
  455.   begin
  456.     if (count==((2000/freq)-1))
  457.        count <= 0;
  458.     else count <= count+1;
  459.         clk_out  <=  (count > (2000/freq)/(100/(100-duty_cycle)));
  460.   end
  461. endmodule
  462. //------------------------------------------------------------------------------------------
  463.  
  464. //-------- MODULO FLIP FLOP EDGE-TRIGGERED D ---
  465. module FFD(input D, input clk, input rst_n, output Q);
  466.     reg q;
  467.     assign Q = q;
  468.  
  469.     always @(posedge clk)
  470.      if (~rst_n)
  471.         begin
  472.             q <= 1'b0;
  473.         end  
  474.      else
  475.         begin
  476.             q <= D;
  477.         end
  478.    
  479. endmodule
  480. //---------------------------------------------
  481.  
  482. //--------- MODULO CHE RENDE UN INPUT "MONOSTABILE" ------------------
  483. module button(input x, input clk, input rst_n, output out);
  484. wire M;
  485. wire N;
  486.  
  487. wire Dm;
  488. wire Dn = x;
  489. wire y;
  490.  
  491. and(Dm, N, x);
  492. xor(y, M, N);
  493.  
  494. FFD m(Dm, clk, rst_n, M);
  495. FFD n(Dn, clk, rst_n, N);
  496.  
  497. assign out = y;
  498.  
  499. endmodule
  500. //------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement