Advertisement
ayush3504

FPGA Lab 11 sdram.vhd

Oct 19th, 2015
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 12.80 KB | None | 0 0
  1. library ieee;
  2.  
  3. use ieee.std_logic_1164.all;
  4. use ieee.numeric_std.all;
  5. use work.pcg.all;
  6.  
  7.  
  8. entity sdram is
  9.  
  10. port(
  11.  
  12. CLOCK_50: IN STD_LOGIC;
  13. SW: IN STD_LOGIC_VECTOR(9 downto 0);
  14. ----------------VGA-Interface---------------------
  15. VGA_B,VGA_G,VGA_R : OUT STD_LOGIC_VECTOR(7 downto 0);
  16. VGA_CLK,VGA_BLANK_N,VGA_HS,VGA_VS,VGA_SYNC_N: OUT STD_LOGIC;
  17. LEDR: OUT STD_LOGIC_VECTOR(9 downto 0);
  18. KEY: IN STD_LOGIC_VECTOR(3 downto 0);
  19. ------------------SDRAM---------------------------
  20. DRAM_ADDR: OUT STD_LOGIC_VECTOR(12 downto 0);
  21. DRAM_BA: OUT STD_LOGIC_VECTOR(1 downto 0);
  22. DRAM_CAS_N: OUT STD_LOGIC;
  23. DRAM_CKE: OUT STD_LOGIC;
  24. DRAM_CLK: OUT STD_LOGIC;
  25. DRAM_CS_N: OUT STD_LOGIC;
  26. DRAM_DQ: INOUT STD_LOGIC_VECTOR(31 downto 0);
  27. DRAM_RAS_N: OUT STD_LOGIC;
  28. DRAM_WE_N: OUT STD_LOGIC;
  29. DRAM_DQM0,DRAM_DQM1,DRAM_DQM2,DRAM_DQM3: OUT STD_LOGIC
  30. );
  31.  
  32.  
  33. end sdram;
  34.  
  35.  
  36. architecture  main of sdram is
  37. TYPE STAGES IS (ST0,ST1);
  38. SIGNAL BUFF_CTRL: STAGES:=ST0;
  39. ---------------------------test signals----------------------------
  40. signal counter : integer range 0 to 1000;
  41. signal test: std_logic:='0';
  42. signal testdata: std_logic_vector(7 downto 0):="00000000";
  43. signal Xpos,Ypos: integer range 0 to 799:=0;
  44. ---------------------------sync-----------------------------
  45. signal BUFF_WAIT: std_logic:='0';
  46. signal VGAFLAG: std_logic_vector(2 downto 0);
  47. -------------------------ram/gray----------------------------
  48. signal RAMFULL_POINTER:integer range 0 to 511:=0;
  49. signal RAMRESTART_POINTER: integer range 0 to 511:=0;
  50. signal RAMADDR1GR,RAMADDR2GR: std_logic_vector(8 downto 0):=(others=>'0');
  51. signal RAMADDR1GR_sync0,RAMADDR1GR_sync1,RAMADDR1GR_sync2,RAMADDR1_bin: std_logic_vector(8 downto 0);
  52. signal RAMADDR2GR_sync0,RAMADDR2GR_sync1,RAMADDR2GR_sync2,RAMADDR2_bin: std_logic_vector(8 downto 0);
  53. -------------------------dual ram ----------------------------------
  54. signal RAMIN1,RAMIN2,RAMOUT1,RAMOUT2: std_logic_vector(7 downto 0);
  55. signal RAMWE1,RAMWE2: std_logic:='0';
  56. signal RAMADDR1,RAMADDR2: integer range 0 to 511:=0;
  57. ------------------vga----------------------------------
  58. signal NEXTFRAME: std_logic_vector(2 downto 0):="000";
  59. signal FRAMEEND,FRAMESTART: std_logic:='0';
  60. signal ACTVIDEO: std_logic:='0';
  61. signal VGABEGIN: std_logic:='0';
  62. signal RED,GREEN,BLUE: STD_LOGIC_VECTOR(7 downto 0);
  63. ------------------clock--------------------------------
  64. SIGNAL CLK143,CLK143_2,clk49_5: STD_LOGIC;
  65. ------------------sdram--------------------------------
  66. SIGNAL SDRAM_ADDR: STD_LOGIC_VECTOR(24 downto 0);
  67. SIGNAL SDRAM_BE_N: STD_LOGIC_VECTOR(3 downto 0);
  68. SIGNAL SDRAM_CS: STD_LOGIC;
  69. SIGNAL SDRAM_RDVAL,SDRAM_WAIT:STD_LOGIC;
  70. SIGNAL SDRAM_RE_N,SDRAM_WE_N: STD_LOGIC;
  71. SIGNAL SDRAM_READDATA,SDRAM_WRITEDATA: STD_LOGIC_VECTOR(31 downto 0);
  72. SIGNAL DRAM_DQM : STD_LOGIC_VECTOR(3 downto 0);
  73.  
  74. --------------------------------------------------------
  75.  
  76.     component true_dual_port_ram_dual_clock is
  77.     port
  78.     (
  79.         clk_a   : in std_logic;
  80.         clk_b   : in std_logic;
  81.         addr_a  : in natural range 0 to 511;
  82.         addr_b  : in natural range 0 to 511;
  83.         data_a  : in std_logic_vector(7 downto 0);
  84.         data_b  : in std_logic_vector(7 downto 0);
  85.         we_a    : in std_logic := '1';
  86.         we_b    : in std_logic := '1';
  87.         q_a     : out std_logic_vector(7 downto 0);
  88.         q_b     : out std_logic_vector(7 downto 0)
  89.     );
  90.     end component true_dual_port_ram_dual_clock;
  91.    component  vga is
  92.     port(
  93.         CLK: in std_logic;
  94.         R_OUT,G_OUT,B_OUT: OUT std_logic_vector(7 downto 0);
  95.         R_IN,G_IN,B_IN: IN std_logic_vector(7 downto 0);
  96.         VGAHS, VGAVS:OUT std_logic;
  97.        ACTVID: OUT std_logic;
  98.         VGA_FRAMESTART: out std_logic;
  99.         VGA_FRAMEEND: out std_logic
  100.     );
  101. end component vga;
  102.  
  103.  
  104. component ramsys is
  105.         port (
  106.                     areset_export       : in    std_logic                     := 'X';             -- export
  107.                     clk_clk             : in    std_logic                     := 'X';             -- clk
  108.                     clk143_clk          : out   std_logic;                                        -- clk
  109.                     clk143_shift_clk    : out   std_logic;                                        -- clk
  110.                     clk49_5_clk         : out   std_logic;                                        -- clk
  111.                     reset_reset_n       : in    std_logic                     := 'X';             -- reset_n
  112.                     sdram_address       : in    std_logic_vector(24 downto 0) := (others => 'X'); -- address
  113.                     sdram_byteenable_n  : in    std_logic_vector(3 downto 0)  := (others => 'X'); -- byteenable_n
  114.                     sdram_chipselect    : in    std_logic                     := 'X';             -- chipselect
  115.                     sdram_writedata     : in    std_logic_vector(31 downto 0) := (others => 'X'); -- writedata
  116.                     sdram_read_n        : in    std_logic                     := 'X';             -- read_n
  117.                     sdram_write_n       : in    std_logic                     := 'X';             -- write_n
  118.                     sdram_readdata      : out   std_logic_vector(31 downto 0);                    -- readdata
  119.                     sdram_readdatavalid : out   std_logic;                                        -- readdatavalid
  120.                     sdram_waitrequest   : out   std_logic;                                        -- waitrequest
  121.                     wire_addr           : out   std_logic_vector(12 downto 0);                    -- addr
  122.                     wire_ba             : out   std_logic_vector(1 downto 0);                     -- ba
  123.                     wire_cas_n          : out   std_logic;                                        -- cas_n
  124.                     wire_cke            : out   std_logic;                                        -- cke
  125.                     wire_cs_n           : out   std_logic;                                        -- cs_n
  126.                     wire_dq             : inout std_logic_vector(31 downto 0) := (others => 'X'); -- dq
  127.                     wire_dqm            : out   std_logic_vector(3 downto 0);                     -- dqm
  128.                     wire_ras_n          : out   std_logic;                                        -- ras_n
  129.                     wire_we_n           : out   std_logic                                      -- waitrequest
  130.         );
  131.     end component ramsys;
  132. begin
  133.  
  134.  
  135.     u0 : component ramsys
  136.         port map (
  137.             areset_export       => '0',       --       areset.export
  138.                 clk_clk             => CLOCK_50,             --          clk.clk
  139.             reset_reset_n       => '1',       --        reset.reset_n
  140.             clk143_shift_clk    => CLK143_2,    -- clk143_shift.clk
  141.             clk143_clk          => CLK143,          --       clk143.clk
  142.             clk49_5_clk         => clk49_5,         --      clk49_5.clk
  143.             wire_addr           => DRAM_ADDR,           --         wire.addr
  144.             wire_ba             => DRAM_BA,             --             .ba
  145.             wire_cas_n          => DRAM_CAS_N,          --             .cas_n
  146.             wire_cke            => DRAM_CKE,            --             .cke
  147.             wire_cs_n           => DRAM_CS_N,           --             .cs_n
  148.             wire_dq             => DRAM_DQ,             --             .dq
  149.             wire_dqm            => DRAM_DQM,            --             .dqm
  150.             wire_ras_n          => DRAM_RAS_N,          --             .ras_n
  151.             wire_we_n           => DRAM_WE_N,           --             .we_n
  152.             sdram_address       => SDRAM_ADDR,       --        sdram.address
  153.             sdram_byteenable_n  => SDRAM_BE_N,  --             .byteenable_n
  154.             sdram_chipselect    => SDRAM_CS,    --             .chipselect
  155.             sdram_writedata     => SDRAM_WRITEDATA,     --             .writedata
  156.             sdram_read_n        => SDRAM_RE_N,        --             .read_n
  157.             sdram_write_n       => SDRAM_WE_N,       --             .write_n
  158.             sdram_readdata      => SDRAM_READDATA,      --             .readdata
  159.             sdram_readdatavalid => SDRAM_RDVAL, --             .readdatavalid
  160.             sdram_waitrequest   => SDRAM_WAIT    --             .waitrequest
  161.         );
  162.  
  163.       u1 : component vga
  164.             port map(
  165.                     CLK=>clk49_5,
  166.                     R_OUT=>VGA_R,
  167.                     G_OUT=>VGA_G,
  168.                     B_OUT=>VGA_B,
  169.                     R_IN=>RED,
  170.                     G_IN=>GREEN,
  171.                     B_IN=>BLUE,
  172.                     VGAHS=>VGA_HS,
  173.                     VGAVS=>VGA_VS,
  174.                    ACTVID=>ACTVIDEO,
  175.                     VGA_FRAMESTART=>FRAMESTART,
  176.                     VGA_FRAMEEND=>FRAMEEND
  177.             );
  178.  
  179.         u3: component true_dual_port_ram_dual_clock
  180.            port map  (
  181.             clk_a=>CLK143,
  182.             clk_b=>clk49_5,
  183.             addr_a=>RAMADDR1,
  184.             addr_b=>RAMADDR2,
  185.             data_a=>RAMIN1,
  186.             data_b=>RAMIN2,
  187.             we_a=>RAMWE1,
  188.             we_b=>RAMWE2,
  189.             q_a=>RAMOUT1,
  190.             q_b=>RAMOUT2           
  191.             );
  192.  
  193.  
  194.  
  195.  
  196.  
  197. DRAM_DQM0<=DRAM_DQM(0);
  198. DRAM_DQM1<=DRAM_DQM(1);
  199. DRAM_DQM2<=DRAM_DQM(2);
  200. DRAM_DQM3<=DRAM_DQM(3);
  201. DRAM_CLK<=CLK143_2;
  202. VGA_CLK<=clk49_5;
  203. SDRAM_CS<='1';
  204. SDRAM_BE_N<="0000";
  205. VGA_BLANK_N<='1';
  206. VGA_SYNC_N<='0';
  207. PROCESS (CLK143)
  208. begin
  209. if rising_edge(clk143)then
  210. ------------double flop sync----------------------
  211.     RAMADDR2GR_sync0<=RAMADDR2GR;
  212.     RAMADDR2GR_sync1<=RAMADDR2GR_sync0;
  213.     RAMADDR2_bin<=gray_to_bin(RAMADDR2GR_sync1);
  214.    NEXTFRAME(1)<=NEXTFRAME(0);
  215.     NEXTFRAME(2)<=NEXTFRAME(1);
  216.  
  217.  
  218. RAMADDR1GR<=bin_to_gray(std_logic_vector(to_unsigned(RAMADDR1,9)));
  219. ----------------------------------------------------
  220.     case BUFF_CTRL is
  221.         when st0=>------------write image to  SDRAM    
  222.         if (SDRAM_WAIT='0')then
  223.             SDRAM_WE_N<='0';
  224.              SDRAM_RE_N<='1';
  225. ------------------------circle generation------------------
  226.             if(Xpos<799)then
  227.                 Xpos<=Xpos+1;
  228.                 else
  229.                 Xpos<=0;
  230.                   if(Ypos<599)then
  231.                   Ypos<=Ypos+1;
  232.                   else
  233.                   Ypos<=0;
  234.                   end if;    
  235.             end if;
  236.                 IF((Xpos-to_integer(unsigned(SW)))*(Xpos-to_integer(unsigned(SW)))+(Ypos-300)*(Ypos-300)<40000)THEN
  237.                 test<='0';
  238.                 else
  239.                 test<='1';
  240.                 end if;
  241. ------------------------------------------------------------
  242.            SDRAM_WRITEDATA(7 downto 0)<=(others=>test);
  243.            SDRAM_ADDR<=std_logic_vector(unsigned(SDRAM_ADDR)+1);   
  244.  
  245.         end if;
  246.        
  247.       if(to_integer(unsigned(SDRAM_ADDR))>(800*600-1) )then-----800x600 resolution
  248.            RAMADDR1<=0;
  249.             BUFF_WAIT<='0';
  250.             RAMFULL_POINTER<=10;----------min. value 2
  251.            BUFF_CTRL<=st1;
  252.             SDRAM_ADDR<=(others=>'0');
  253.         end if;
  254.        
  255.         when st1=>-----------write from SDRAM to BUFFER
  256.               SDRAM_WE_N<='1';
  257.             RAMWE1<=SDRAM_RDVAL;
  258.             IF(BUFF_WAIT='0')then
  259.                      SDRAM_RE_N<='0';
  260.                        ------------if no wait request is issued and read enable------
  261.                     IF(SDRAM_WAIT='0' and SDRAM_RE_N='0')THEN  
  262.                             IF(RAMFULL_POINTER<511)then-----move full pointer
  263.                                 RAMFULL_POINTER<=RAMFULL_POINTER+1;
  264.                                 else
  265.                                 RAMFULL_POINTER<=0;
  266.                             end if;        
  267.                         SDRAM_ADDR<=std_logic_vector(unsigned(SDRAM_ADDR)+1);      
  268.                    END IF;
  269.                         -------------check if the buffer is full----------------------
  270.                         IF(to_integer(unsigned(RAMADDR2_bin))=(RAMFULL_POINTER))then
  271.                                 VGAFLAG(0)<='1';---------init displaying image
  272.                                 SDRAM_RE_N<='1';
  273.                                 BUFF_WAIT<='1';
  274.                                 IF((RAMADDR2+63)<511)THEN
  275.                                     RAMRESTART_POINTER<=to_integer(unsigned(RAMADDR2_bin))+63;
  276.                                     ELSE
  277.                                     RAMRESTART_POINTER<=to_integer(unsigned(RAMADDR2_bin))+63-511;
  278.                                 END IF;
  279.                         end if;
  280.             END IF;
  281.                     RAMIN1<=SDRAM_READDATA(7 downto 0);
  282.                     ------------while data is avalable, write to buffer RAM
  283.                     IF(SDRAM_RDVAL='1')then
  284.                         IF(RAMADDR1<511)then
  285.                         RAMADDR1<=RAMADDR1+1;
  286.                         else
  287.                         RAMADDR1<=0;
  288.                         end if;
  289.                     END IF;
  290.                     -------------------------------refill buffer------------------------
  291.                          IF(to_integer(unsigned(RAMADDR2_bin))=RAMRESTART_POINTER and BUFF_WAIT='1')then
  292.                           BUFF_WAIT<='0';        
  293.                           end if;
  294.                     -------------------------------end of frame--------------------------
  295.                         IF(NEXTFRAME(2)='1')THEN
  296.                               xpos<=0;
  297.                             ypos<=0;
  298.                                BUFF_CTRL<=ST0;
  299.                                 VGAFLAG(0)<='0';
  300.                                 SDRAM_ADDR<=(others=>'0');
  301.                                 ------------
  302.                                 counter<=0;
  303.                                 test<='0';
  304.                             END IF;
  305.            
  306.         when others=>NULL;
  307.         END CASE;
  308.  
  309.  
  310.  
  311.  
  312.  
  313. end if;
  314. end process;
  315. PROCESS(clk49_5)
  316. begin
  317. if rising_edge(clk49_5)then
  318.      
  319. RAMADDR2GR<=bin_to_gray(std_logic_vector(to_unsigned(RAMADDR2,9)));
  320. -------------dual clock sync-------------------------
  321. RAMADDR1GR_sync0<=RAMADDR1GR;
  322. RAMADDR1GR_sync1<=RAMADDR1GR_sync0;
  323. VGAFLAG(1)<=VGAFLAG(0);
  324. VGAFLAG(2)<=VGAFLAG(1);
  325.  
  326. RAMADDR1_bin<=gray_to_bin(RAMADDR1GR_sync1);
  327.  
  328.  
  329.     IF(VGAFLAG(2)='1' AND FRAMESTART='1' )THEN-------if buffer is rdy and  begin of new frame, start displaying image
  330.      VGABEGIN<='1';
  331.      end if;
  332.      
  333.      IF(FRAMEEND='1' AND VGABEGIN='1')THEN------end of frame
  334.      NEXTFRAME(0)<='1';
  335.      VGABEGIN<='0';
  336.      ELSE
  337.      NEXTFRAME(0)<='0';
  338.      END IF;
  339.    
  340.         IF(ACTVIDEO='1'AND to_integer(unsigned(RAMADDR1_bin))/=RAMADDR2  AND VGABEGIN='1')then----if buffer ia not empty
  341.             IF(RAMADDR2<511)then
  342.             RAMADDR2<=RAMADDR2+1;
  343.             else
  344.             RAMADDR2<=0;
  345.             end if;
  346.            RED<=RAMOUT2;
  347.           GREEN<=RAMOUT2;
  348.            BLUE<=RAMOUT2;
  349.         ELSIF(VGABEGIN='0')THEN---------if buffer not ready
  350.        RAMADDR2<=0;
  351.         BLUE<=(others=>'0');
  352.         RED<=(others=>'0');
  353.         GREEN<=(others=>'0');
  354.         END IF;
  355. end if;
  356. end process;
  357. end main;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement