Thông báo

Collapse
No announcement yet.

Giao tiếp SRAM ngôn ngữ VHDL

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Giao tiếp SRAM ngôn ngữ VHDL

    Xin chào, hiện nay mình đang viết về khối giao tiếp SRAM, bạn nào rành cái này cho mình hỏi 1 chút >"<, không biết mình có hiểu sai không nhưng sau khi mô phỏng chân SRAM_DQ lúc nào cũng HiZ, có thể sửa lại code dùm mình thì càng tốt. Thx

    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_arith.all;
    use ieee.std_logic_unsigned.all;

    --------------------------------------------------------------

    entity SRAM is
    port(
    in_address: in std_logic_vector (17 downto 0);
    in_data: in std_logic_vector (15 downto 0);
    R_W: in std_logic;
    CE: in std_logic;
    SRAM_ADDR: out std_logic_vector(17 downto 0);
    SRAM_CE_N:out std_logic;
    SRAM_WE_N:out std_logic;
    SRAM_OE_N:out std_logic;
    SRAM_UB_N:out std_logic;
    SRAM_LB_N:out std_logic;
    SRAM_DQ:inout std_logic_vector(15 downto 0);
    out_data: out std_logic_vector (15 downto 0));
    end SRAM;

    --------------------------------------------------------------

    architecture behav of SRAM is
    begin
    SRAM_DQ<=in_data when R_W='1' else (others => 'Z');
    out_data <= SRAM_DQ;
    SRAM_ADDR <= in_address;
    SRAM_WE_N <=(R_W and CE);
    SRAM_OE_N <=not (R_W and CE);
    SRAM_CE_N <=Not CE;
    SRAM_UB_N <= '0';
    SRAM_LB_N <= '0';
    end behav;

    PS: Các chân OE CE UB LB có thể sai, do mình sửa tới sửa lui nhiều lần, mình chỉ thắc mắc sao khi mô phỏng lúc ghi dữ liệu thì in_data không gán được vào SRAM_DQ :'(

  • #2
    ủa,sao bác làm SRAM mà ko có xung clk vậy?
    thử cái này xem sao:
    Code:
    process(clk)
    begin
           if clk'event and clk='1' then
                if R_W='1' then SRAM_DQ<=in_data
                end if;
           end if;
    end process;
    Chuyện nhỏ như con thỏ,bắt thỏ mới là chuyện lớn!!!

    Comment


    • #3
      à, thx bạn, thật ra là trước đó mình còn 1 khối control rd_wr có clk rồi, nhưng thêm thẳng vào đây cũng không sao, có điều... vẫn hok chạy T.T

      library ieee;
      use ieee.std_logic_1164.all;
      use ieee.std_logic_arith.all;
      use ieee.std_logic_unsigned.all;

      --------------------------------------------------------------

      entity SRAM is
      port(clk : in std_logic;
      in_address: in std_logic_vector (17 downto 0);
      in_data: in std_logic_vector (15 downto 0);
      R_W: in std_logic;
      CE: in std_logic;
      SRAM_ADDR: out std_logic_vector(17 downto 0);
      SRAM_CE_N:out std_logic;
      SRAM_WE_N:out std_logic;
      SRAM_OE_N:out std_logic;
      SRAM_UB_N:out std_logic;
      SRAM_LB_N:out std_logic;
      SRAM_DQ:inout std_logic_vector(15 downto 0);
      out_data: out std_logic_vector (15 downto 0));
      end SRAM;

      --------------------------------------------------------------

      architecture behav of SRAM is
      begin
      process (clk)
      begin
      if rising_edge (clk) then
      if R_W='1' then
      SRAM_DQ<=in_data;
      else SRAM_DQ <= (others => 'Z');
      end if;
      out_data <= SRAM_DQ;
      SRAM_ADDR <= in_address;
      SRAM_WE_N <=(R_W and CE);
      SRAM_OE_N <=not (R_W and CE);
      SRAM_CE_N <=Not CE;
      SRAM_UB_N <= '0';
      SRAM_LB_N <= '0';
      end if;
      end process;
      end behav;

      Đây là dạng sóng mình mô phỏng thử T.T

      Comment


      • #4
        Hi,bữa sau bác quăng code vào tag code cho dễ đọc nha.
        Em ko hiểu bác làm cái SRAM_DQ kiểu inout làm gì? Đã có ngõ in_dât là ngõ vào rùi,ta làm thêm ngõ ra nữa thôi,cho thêm một signal làm phần tử nhớ nữa là xong.Với lại câu này :
        Code:
        else SRAM_DQ <= (others => 'Z');
        là sao.Nếu làm vậy thì đâu có khả năng lưu trữ thông tin(bị xóa nếu R_W='0')
        Bác coi code này xem,mô phỏng bình thường:
        Code:
        library ieee;
        use ieee.std_logic_1164.all;
        use ieee.std_logic_arith.all;
        use ieee.std_logic_unsigned.all;
        
        --------------------------------------------------------------
        
        entity test is
        port(
        	clk : in std_logic;
        	in_address: in std_logic_vector (17 downto 0);
        	in_data: in std_logic_vector (15 downto 0);
        	R_W: in std_logic;
        	CE: in std_logic;
        	SRAM_ADDR: out std_logic_vector(17 downto 0);
        	SRAM_CE_N:out std_logic;
        	SRAM_WE_N:out std_logic;
        	SRAM_OE_N:out std_logic;
        	SRAM_UB_N:out std_logic;
        	SRAM_LB_N:out std_logic;
        	SRAM_DQ_out: out std_logic_vector(15 downto 0);
        	out_data: out std_logic_vector (15 downto 0));
        end test;
        
        --------------------------------------------------------------
        
        architecture behav of test is
        	signal SRAM_DQ: std_logic_vector(15 downto 0);
        begin
        process (clk)
        
        begin
        	if rising_edge (clk) then
        		if R_W='1' then
        			SRAM_DQ<=in_data;
        		--else SRAM_DQ <= (others => 'Z');
        		end if;
        		out_data <= SRAM_DQ;
        		SRAM_ADDR <= in_address;
        		SRAM_WE_N <=(R_W and CE);
        		SRAM_OE_N <=not (R_W and CE);
        		SRAM_CE_N <=Not CE;
        		SRAM_UB_N <= '0';
        		SRAM_LB_N <= '0';
        	end if;
        end process;
        	SRAM_DQ_out<=SRAM_DQ;
        end behav;
        Chuyện nhỏ như con thỏ,bắt thỏ mới là chuyện lớn!!!

        Comment


        • #5
          À, cái chân inout mình nghĩ là SRAM nó quy định chân đó như vậy mà. Ý là khi ghi thì chân data_in sẽ gán vào SRAM_DQ, còn khi đọc thì SRAM_DQ sẽ chuyển ra out_data, hok bik hiểu zậy đúng hok nhỉ . Cái code này verilog có nhiều lắm nhưng VHDL thì hok thấy ai test thử T.T
          Last edited by Milano; 20-03-2009, 12:16.

          Comment


          • #6
            Nguyên văn bởi it4rb Xem bài viết
            Hi,bữa sau bác quăng code vào tag code cho dễ đọc nha.
            Em ko hiểu bác làm cái SRAM_DQ kiểu inout làm gì? Đã có ngõ in_dât là ngõ vào rùi,ta làm thêm ngõ ra nữa thôi,cho thêm một signal làm phần tử nhớ nữa là xong.Với lại câu này :
            Code:
            else SRAM_DQ <= (others => 'Z');
            là sao.Nếu làm vậy thì đâu có khả năng lưu trữ thông tin(bị xóa nếu R_W='0')
            Bác coi code này xem,mô phỏng bình thường[/code]
            Đấy là cách thức sử dụng chân INOUT. Còn việc lưu trữ thông tin thì thực ra đây ko phải là code mô tả RAM mà là mô tả khối điều khiển giao tiếp với SRAM.

            @Milano: cậu xem lại file mô phỏng xem. Code này ko sai, chỉ làm việc giao tiếp trễ đi 1 chu kỳ. Tớ đã thử simulate chả sao cả

            Comment


            • #7
              hic,dốt quá,cứ tưởng là bác ấy viết RAM.Như vậy là cái đó dùng để giao tiếp với RAM có sẵn phải ko ạ? Các bác nói rõ hơn về cái inout giùm em được ko,vụ này lờ mờ quá,khó hiểu thật.
              Chuyện nhỏ như con thỏ,bắt thỏ mới là chuyện lớn!!!

              Comment


              • #8
                Nguyên văn bởi NEO3F Xem bài viết
                Đấy là cách thức sử dụng chân INOUT. Còn việc lưu trữ thông tin thì thực ra đây ko phải là code mô tả RAM mà là mô tả khối điều khiển giao tiếp với SRAM.

                @Milano: cậu xem lại file mô phỏng xem. Code này ko sai, chỉ làm việc giao tiếp trễ đi 1 chu kỳ. Tớ đã thử simulate chả sao cả
                Hì, thx bạn. Thật ra là do mình lần đâu viết về SRAM_interface, nên mình nghĩ là chân SRAM_DQ phải theo dữ liệu ghi, nhưng hôm nay tét thử code vẻilog thì nó ra cũng y chang . Simulate thì nó không bị lỗi rồi. Mà bạn có cách nào khắc phục việc trễ 1 xung không??

                @it4rb: mình cũng hok rành lắm, hì, chỉ có thể nói sơ như vầy, Khối SRAM_interface này mình viết để giao tiếp với RAM có sẵn trên Kit. Chân DQ là nối thẳng vào RAM, là nơi chuyển dữ liệu từ RAM khi đọc, và là nơi ghi dữ liệu vào Ram khi ghi, mặc định nó gồm 16 bits, khi đọc hay ghi gì đều phải wa đó, nên buộc mình phải khai báo inout . [Nói zậy hok bik đúng hok ^_^ ]

                PS: mà mọi người chuẩn bị, Mila sắp viết wa đến khối VGA, thể nào cũng phải hỏi, pà kon chuẩn bị giúp dùm

                Comment


                • #9
                  Bỏ cái If(rising_edge(clk)) đi. Để cái SRAM_Controller chỉ là mạch combinational thuần túy nối dây để giao tiếp với SRAM thôi.

                  Comment


                  • #10
                    Hì, ok, zậy sửa tới sửa lui, nó ra y như lúc đầu, thx it4rb, NÈO nhiều, sắp tới sẽ còn nhiều cái hỏi mấy bạn , à có thể để lại nick yahoo cho Mila tiện liên lạc hok

                    Comment


                    • #11
                      O_O, Zụ gì zậy, post nhầm hay 2pic nào cũng post thía ~.~

                      Comment


                      • #12
                        ~.~ mới post bài bị delete roài, nhanh khiếp

                        Comment


                        • #13
                          Bí rồi đành phải đi hỏi típ zậy, có ai đã làm SRAM vừa ghi vừa đọc chưa vậy, chỉ Mila xử lý dùm, vd 3 xung đầu đọc, 4 xung sau ghi rồi lại típ tục..Mình sd 1 biến count đếm cạnh xung như đến giờ vẫn chưa vừa ý. Có thể nói sơ cách mình viết, 2 khối Read Write riêng, Read có 2 chân ready và read_done, Write cũng có ready và write_done, như vậy chân read_done sẽ báo hiệu cho khối write, nhưng mô phỏng ra chưa được, có ai thử viết 1 đoạn nhỏ điều khiển cái cờ đó cho Mila coi thử được hok

                          Comment

                          Về tác giả

                          Collapse

                          Milano Tìm hiểu thêm về Milano

                          Bài viết mới nhất

                          Collapse

                          Đang tải...
                          X