Thông báo

Collapse
No announcement yet.

thiết kê FIFO dựa trên synch dual port ram

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

  • #16
    Data vào A, nằm trong RAM rồi được đọc ra ở B

    Comment


    • #17
      Nguyên văn bởi boyzzun Xem bài viết
      cách của bác là viết FIFO dựa trên con trỏ thì phải, em cũng tháy trên mạng, nhưng dựa vào dual ram thì hình như nó có khác một chút
      đúng rồi...kiểu này dùng nhiều trong cấu trúc dữ liệu và giải thuật của CNTT mà.
      tham khảo thêm ở đây này..
      http://www.eng.auburn.edu/~strouce/c...0/vhdlmods.pdf

      Comment


      • #18
        Nguyên văn bởi tan0710 Xem bài viết
        đúng rồi...kiểu này dùng nhiều trong cấu trúc dữ liệu và giải thuật của CNTT mà.
        tham khảo thêm ở đây này..
        http://www.eng.auburn.edu/~strouce/c...0/vhdlmods.pdf
        nhưng em đang là về cái dual ram kia bác ak,em đọc nhiều cái về dual ram, xem code các kiểu mà vẫn không hiểu lắm

        Comment


        • #19
          Nguyên văn bởi jefflieu Xem bài viết
          Data vào A, nằm trong RAM rồi được đọc ra ở B
          cùng 1 data hả bác ???, nhưng address của a và b là khác nhau mà???
          em cũng đọc ở trên mạng mà vẫn chưa hiểu lắm về cái này, giả sử nếu address của a đúng bằng độ rộng của ram thì address của b lúc ấy sẽ tính ntn, nếu như dùng chung bộ nhớ của 2 port thì nếu dữ liệu từ port A đã ghi hết trong ram, như vậy dữ liệu sẽ không thể ghi vào từ port b nữa có đúng ko ak ???

          Comment


          • #20
            Nguyên văn bởi boyzzun Xem bài viết
            nhưng em đang là về cái dual ram kia bác ak,em đọc nhiều cái về dual ram, xem code các kiểu mà vẫn không hiểu lắm
            dual ram là thế nào nhỉ.??? mình search trên google chỉ thấy dual port...

            Comment


            • #21
              Nguyên văn bởi tan0710 Xem bài viết
              dual ram là thế nào nhỉ.??? mình search trên google chỉ thấy dual port...
              ở chính xác là true dual port ram single clock

              Comment


              • #22
                RAM thì muốn ghi đâu chả được, đâu có khái niệm "đầy" ...
                FIFO mới có khái niệm "đầy" ...
                FIFO được làm bằng dual-port RAM và logic ... khi bạn muốn dùng buffer mà chả quan tâm đến điểu khiển RAM như thế nào, chỉ cần cất vào và lấy ra ... cái nào vào trước thì ra trước, đó là nhiệm vụ của logic (read_controller & write_controller)

                Comment


                • #23
                  Nguyên văn bởi jefflieu Xem bài viết
                  RAM thì muốn ghi đâu chả được, đâu có khái niệm "đầy" ...
                  FIFO mới có khái niệm "đầy" ...
                  FIFO được làm bằng dual-port RAM và logic ... khi bạn muốn dùng buffer mà chả quan tâm đến điểu khiển RAM như thế nào, chỉ cần cất vào và lấy ra ... cái nào vào trước thì ra trước, đó là nhiệm vụ của logic (read_controller & write_controller)
                  vậy làm sao em có thể ghi dữ liệu vào từ port A và đọc chính dữ liệu đấy ra port B ???, FIFO sử dụng dual port ram thì việc đọc/ ghi sẽ được thực hiện ntn ???

                  Comment


                  • #24
                    Data ghi vào đâu và đọc ra ở đâu là do 2 con trỏ A & B.
                    Con trỏ A tăng lên 1 sau mỗi lần ghi, con trỏ B cũng vậy.
                    Con trỏ của A (ghi) sẽ đi trước con trỏ B (đọc) ...

                    http://www.cypress.com/?id=4&rID=29526

                    Comment


                    • #25
                      Nguyên văn bởi jefflieu Xem bài viết
                      Data ghi vào đâu và đọc ra ở đâu là do 2 con trỏ A & B.
                      Con trỏ A tăng lên 1 sau mỗi lần ghi, con trỏ B cũng vậy.
                      Con trỏ của A (ghi) sẽ đi trước con trỏ B (đọc) ...

                      Generation of FIFO Empty and Full Flags - KBA85082 - Cypress
                      thắc mắc của em chủ yếu xoay quanh cái vụ address của port a và address của port b thôi, vì em cứ thắc mãi cái việc là tại sao write giá trị vào 1 địa chỉ rồi lại có thể read ra từ 1 địa chỉ khác chả liên quan gì đến đại chỉ lúc write vào ( trc em viết single ram thì đọc vào địa chỉ nào thì ghi ra ở đại chỉ đó)
                      PS: em còn nghĩ là cái miền nhớ được đánh theo địa chỉ là tổng của 2 địa chỉ port A và port B gộp lại

                      Comment


                      • #26
                        Giờ giả sủ bạn có 4 ô nhớ ..
                        - Ban đầu trống hêt, 2 con trỏ chỉ vô ô 0
                        - Bạn có data A cần ghi, ghi vào 0, con trỏ write (wptr) ... tăng lên 1 sau khi ghi data vô 0...
                        - Có data B cần ghi tiếp, con trỏ wptr ghi data vào 1 và tăng lên thành 2 ...

                        Giờ bạn muốn đọc ra, thì con trỏ đọc (rptr) đang đứng ở 0, bạn đọc ra sẽ là A ... rptr tăng lên thành 1 ...
                        Lần đọc kế bạn sẽ đọc data B ở ô 1 ...
                        ... v.v.
                        Last edited by jefflieu; 16-06-2014, 21:07.

                        Comment


                        • #27
                          Nguyên văn bởi jefflieu Xem bài viết
                          Giờ giả sủ bạn có 4 ô nhớ ..
                          - Ban đầu trống hêt, 2 con trỏ chỉ vô ô 0
                          - Bạn có data A cần ghi, ghi vào 0, con trỏ write (wptr) ... tăng lên 1 sau khi ghi data vô 0...
                          - Có data B cần ghi tiếp, con trỏ wptr ghi data vào 1 và tăng lên thành 2 ...

                          Giờ bạn muốn đọc ra, thì con trỏ đọc (rptr) đang đứng ở 0, bạn đọc ra sẽ là A ... rptr tăng lên thành 1 ...
                          Lần đọc kế bạn sẽ đọc data B ở ô 1 ...
                          ... v.v.
                          bác ơi, em gặp phải vấn đề này , em tự viết code cho dual port ram thì lúc tổng hợp bị lỗi vì nó bảo nên sử dụng shared variable, tuy nhiên khi tìm trên mạng thì em tìm thấy code dual port ram chỉ sử dụng signal mà nó vẫn tổng hợp đc, em không hiểu là mình làm có khác nó nhiều đâu mà tại sao lại có cái lỗi đấy
                          đây là code em viết
                          Code:
                          ----------------------------------------------------------------------------------
                          -- Company: 
                          -- Engineer: 
                          -- 
                          -- Create Date:    22:25:38 06/11/2014 
                          -- Design Name: 
                          -- Module Name:    dual_ram - Behavioral 
                          -- Project Name: 
                          -- Target Devices: 
                          -- Tool versions: 
                          -- Description: 
                          --
                          -- Dependencies: 
                          --
                          -- Revision: 
                          -- Revision 0.01 - File Created
                          -- Additional Comments: 
                          --
                          ----------------------------------------------------------------------------------
                          library IEEE;
                          use IEEE.STD_LOGIC_1164.ALL;
                          use ieee.std_logic_unsigned.all;
                          
                          -- Uncomment the following library declaration if using
                          -- arithmetic functions with Signed or Unsigned values
                          --use IEEE.NUMERIC_STD.ALL;
                          
                          -- Uncomment the following library declaration if instantiating
                          -- any Xilinx primitives in this code.
                          --library UNISIM;
                          --use UNISIM.VComponents.all;
                          
                          entity dual_ram is
                           generic ( addr_width : integer :=4 );
                           port ( clk : in std_logic;
                                  wea,web : in std_logic;
                          		  csa,csb : in std_logic;
                          		  oea,oeb : in std_logic;
                          		  data_ina,data_inb : in std_logic_vector(7 downto 0);
                          		  addressa,addressb : in std_logic_vector (3 downto 0);
                          		  data_outa,data_outb : out std_logic_vector(7 downto 0));
                          end dual_ram;
                          
                          architecture Behavioral of dual_ram is
                          constant ram_depth : integer :=2**addr_width;
                          type ram is array (integer range <>) of std_logic_vector(7 downto 0);
                          signal mem : ram (0 to ram_depth-1);
                          
                          begin
                          writingA : process(clk,csa,wea,oea,mem)
                           begin
                            if rising_edge(clk) then
                             if csa='1' and wea='1' and oea='0' then
                          	 mem(conv_integer(addressa))<=data_ina;
                          	 end if;
                          	end if;
                           end process;
                          readingA : process(clk,csa,wea,oea,mem)
                           begin
                            if rising_edge(clk) then
                             if csa='1' and wea='0' and oea='1' then
                          	 data_outa<=mem(conv_integer(addressa));
                          	end if;
                            end if;
                           end process;
                          writingB : process(clk,csb,web,oeb,mem)
                           begin
                            if rising_edge(clk) then
                             if csb='1' and web='1' and oeb='0' then
                          	 mem(conv_integer(addressb))<=data_inb;
                          	end if;
                            end if;
                           end process;
                          readingB: process(clk,csb,web,oeb,mem)
                           begin 
                            if rising_edge(clk) then
                             if csb='1' and web='0' and oeb='1' then
                          	 data_outb<=mem(conv_integer(addressb));
                          	end if;
                            end if;
                           end process;
                          
                          end Behavioral;
                          đây là code trên mạng
                          Code:
                          -------------------------------------------------------
                          -- Design Name : ram_dp_ar_aw
                          -- File Name   : ram_dp_ar_aw.vhd
                          -- Function    : Asynchronous read write RAM
                          -- Coder       : Deepak Kumar Tala (Verilog)
                          -- Translator  : Alexander H Pham (VHDL)
                          -------------------------------------------------------
                          library ieee;
                              use ieee.std_logic_1164.all;
                              use ieee.std_logic_unsigned.all;
                          
                          entity ram_dp_ar_aw is
                              generic (
                                  DATA_WIDTH :integer := 8;
                                  ADDR_WIDTH :integer := 8
                              );
                              port (
                                  address_0 :in    std_logic_vector (ADDR_WIDTH-1 downto 0);  -- address_0 Input
                                  data_0    :in std_logic_vector (DATA_WIDTH-1 downto 0);		  -- data_0 bi-directional
                          		  data_0_out   :out std_logic_vector (DATA_WIDTH-1 downto 0);
                                  cs_0      :in    std_logic;                                 -- Chip Select
                                  we_0      :in    std_logic;                                 -- Write Enable/Read Enable
                                  oe_0      :in    std_logic;                                 -- Output Enable
                                  address_1 :in    std_logic_vector (ADDR_WIDTH-1 downto 0);  -- address_1 Input
                                  data_1    :in std_logic_vector (DATA_WIDTH-1 downto 0);  -- data_1 bi-directional
                          		  data_1_out   : out std_logic_vector (DATA_WIDTH-1 downto 0);
                                  cs_1      :in    std_logic;                                 -- Chip Select
                                  we_1      :in    std_logic;                                 -- Write Enable/Read Enable
                                  oe_1      :in    std_logic                                  -- Output Enable
                              );
                          end entity;
                          architecture rtl of ram_dp_ar_aw is
                              ----------------Internal variables----------------
                          
                              constant RAM_DEPTH :integer := 2**ADDR_WIDTH;
                              
                              --signal data_0_out :std_logic_vector (DATA_WIDTH-1 downto 0);
                              --signal data_1_out :std_logic_vector (DATA_WIDTH-1 downto 0);
                          
                              type RAM is array (integer range <>)of std_logic_vector (DATA_WIDTH-1 downto 0);
                              signal mem : RAM (0 to RAM_DEPTH-1);
                          begin
                          
                              ----------------Code Starts Here------------------
                              -- Memory Write Block
                              -- Write Operation : When we_0 = 1, cs_0 = 1
                              MEM_WRITE:
                              process (address_0, cs_0, we_0, data_0, address_1, cs_1, we_1, data_1) begin
                                if (cs_0 = '1' and we_0 = '1') then
                                   mem(conv_integer(address_0)) <= data_0;
                                elsif  (cs_1 = '1' and we_1 = '1') then
                                   mem(conv_integer(address_1)) <= data_1;
                                end if;
                              end process;
                          
                              -- Tri-State Buffer control
                             -- data_0 <= data_0_out when (cs_0 = '1' and oe_0 = '1' and we_0 = '0') else (others=>'Z');
                          
                              -- Memory Read Block
                              MEM_READ_0:
                              process (address_0, cs_0, we_0, oe_0, mem) begin
                                if (cs_0 = '1' and we_0 = '0' and oe_0 = '1') then
                                  data_0_out <= mem(conv_integer(address_0));
                                else
                                  data_0_out <= (others=>'0');
                                end if;
                              end process;
                          
                              -- Second Port of RAM
                              -- Tri-State Buffer control
                              --data_1 <= data_1_out when (cs_1 = '1' and oe_1 = '1' and we_1 = '0') else (others=>'Z');
                          
                              -- Memory Read Block 1
                              MEM_READ_1:
                              process (address_1, cs_1, we_1, oe_1, mem) begin
                                  if (cs_1 = '1' and we_1 = '0' and oe_1 = '1') then
                                      data_1_out <= mem(conv_integer(address_1));
                                  else
                                      data_1_out <= (others=>'0');
                                  end if;
                              end process;
                          
                          end architecture;

                          Comment


                          • #28
                            Good!

                            Trong VHDL và Verilog, ctrinh không tổng hợp được khi mà bạn write cùng 1 register ở 2 processes.

                            Trên mạng code nó chạy được là vì nó write vào mem trong cùng 1 process
                            MEM_WRITE:
                            process (address_0, cs_0, we_0, data_0, address_1, cs_1, we_1, data_1) begin
                            if (cs_0 = '1' and we_0 = '1') then
                            mem(conv_integer(address_0)) <= data_0;
                            elsif (cs_1 = '1' and we_1 = '1') then
                            mem(conv_integer(address_1)) <= data_1;
                            end if;
                            end process;

                            Có 2 loại dual-port RAM:

                            - True dual-port (TDP) : Port A và B hoàn toàn độc lập. A có thể ghi/đọc tùy ý với clock A và B có thể ghi/đọc tùy ý với clk B. Khi bạn muốn sử dụng loại RAM này, (theo mình biết) chỉ có mỗi cách là gọi primitive (tức hardware block) có sẵn.
                            - Simple dual-port : Port A ghi và port B đọc ... bạn có thể mô tả HDL loại ram này được và ctrinh sẽ hiểu và "infer"

                            Cái code mà bạn lấy trên mạng không phải TDP vì không thể write cùng lúc (1 clock cycle) vào A và B được, nên coi như chỉ có 1 port write và 2 port đọc.

                            Để dùng cho FIFO của bạn bạn chỉ cần SIMPLE DUAL PORT (SDP) thôi. Bạn thử bỏ cai write ở B đi, chi write ở A và read ở B.

                            Comment


                            • #29
                              Nguyên văn bởi jefflieu Xem bài viết
                              Good!

                              Trong VHDL và Verilog, ctrinh không tổng hợp được khi mà bạn write cùng 1 register ở 2 processes.

                              Trên mạng code nó chạy được là vì nó write vào mem trong cùng 1 process
                              em không hiểu lắm về việc dùng 1 register trong 2 process (trong trường hợp này là ntn hả bác), những cái này trc h e vẫn khong biết bác ak, chỉ có làm code, sai cái chỗ không biết thì đi hỏi thày, mà thày ra nc ngoài mất rồi

                              Comment


                              • #30
                                Nguyên văn bởi jefflieu Xem bài viết
                                Good!

                                - True dual-port (TDP) : Port A và B hoàn toàn độc lập. A có thể ghi/đọc tùy ý với clock A và B có thể ghi/đọc tùy ý với clk B. Khi bạn muốn sử dụng loại RAM này, (theo mình biết) chỉ có mỗi cách là gọi primitive (tức hardware block) có sẵn.
                                vậy cái này muốn lập trình để mô phỏng thì phải dùng shared variable hả bác ????

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X