Data vào A, nằm trong RAM rồi được đọc ra ở B
Thông báo
Collapse
No announcement yet.
thiết kê FIFO dựa trên synch dual port ram
Collapse
X
-
Nguyên văn bởi boyzzun Xem bài viếtcá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
tham khảo thêm ở đây này..
http://www.eng.auburn.edu/~strouce/c...0/vhdlmods.pdf
Comment
-
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
Comment
-
Nguyên văn bởi jefflieu Xem bài viếtData vào A, nằm trong RAM rồi được đọc ra ở B
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
-
Nguyên văn bởi boyzzun Xem bài viếtnhư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
-
Nguyên văn bởi tan0710 Xem bài viếtdual ram là thế nào nhỉ.??? mình search trên google chỉ thấy dual port...
Comment
-
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
-
Nguyên văn bởi jefflieu Xem bài viếtRAM 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
-
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
-
Nguyên văn bởi jefflieu Xem bài viếtData 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
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
-
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
-
Nguyên văn bởi jefflieu Xem bài viếtGiờ 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.
đâ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;
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
-
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
-
Nguyên văn bởi jefflieu Xem bài viếtGood!
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
Comment
-
Nguyên văn bởi jefflieu Xem bài viếtGood!
- 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.
Comment
Bài viết mới nhất
Collapse
-
Trả lời cho Hỏi cách điều chế xungbởi thetungBạn cho qua cái Tờ ri gơ Sờ mít ấy ......
-
Channel: Kỹ thuật điện tử tương tự
16-12-2024, 11:26 -
-
Trả lời cho Hỏi cách điều chế xungbởi nguyendinhvanCó gì mà khó ?
Răn cưa vuông đây
...-
Channel: Kỹ thuật điện tử tương tự
15-12-2024, 23:36 -
-
Trả lời cho hỏi về tụ điệnbởi ndp62Chữ " VENT" không phải là tên hãng sx tụ đâu ,vó thế là 1 ký hiệu liên quan tụ lowesr ?
-
Channel: Điện thanh
15-12-2024, 18:24 -
-
Trả lời cho Thắc mắc về nguồn tổ ong 12vbởi bqvietTrừ trường hợp công suất (rất) thấp, hầu như tất cả các loại nguồn xung thông thường đều có tụ nhỏ 1 - 10nF nối giữa sơ cấp và thứ cấp, để thoát nhiễu và để chống hiện tượng tương tự tĩnh điện. Vụ này đã thảo luận vài...
-
Channel: Điện tử dành cho người mới bắt đầu
14-12-2024, 22:02 -
-
Trả lời cho Thắc mắc về nguồn tổ ong 12vbởi namlangnhoE thử 3 cái nguồn nó đều giống nhau. Nên e làm tiếp địa luôn.
-
Channel: Điện tử dành cho người mới bắt đầu
14-12-2024, 19:58 -
-
Trả lời cho Thắc mắc về nguồn tổ ong 12vbởi mèomướpDạ chú sắm con át chống giật và thay nguồn tổ ong khác cho an toàn ạ. Đa phần nguồn xung đều xả nhiễu của bên thứ cấp về điện lưới qua 1 con tụ nên cảm giác tê sẽ khó xác định rõ ràng là do rò điện hay là nó vốn vậy...
-
Channel: Điện tử dành cho người mới bắt đầu
14-12-2024, 18:51 -
-
bởi namlangnhoXin chào mọi người. E có sử dụng 1 cục nguồn tổ ong 12v-30A chạy đèn led xe trà sữa. Mà thợ thi công bị rò điện nên điện rò ra khung xe. E dùng đồng hồ đo điện ở khung xe và cả output thì thấy có dòng điện xoay chiều hơn 100v. Nên chạm...
-
Channel: Điện tử dành cho người mới bắt đầu
14-12-2024, 00:12 -
-
bởi Manh.n.trCác bác cho em hỏi cách điều chế xung răng cưa sang xung vuông với ạ. Em đang thấy khó ạ...
-
Channel: Kỹ thuật điện tử tương tự
13-12-2024, 20:46 -
-
Trả lời cho hỏi về thiết kế mạch tuần tự trên proteusbởi Hatruong1309
-
Channel: Hỗ trợ học tập
12-12-2024, 00:33 -
-
bởi Hatruong1309Cho e hỏi là phần chân X thì nối cái j thì mạch mới chạy được ạ và kiểm tra đúng sai kiểu j ạ
Đề bài thiết kế mạch dãy đồng bộ nhận biết dãy tín hiệu vào ở dạng nhị phân được đưa liên tiếp ở đầu vào X và được đồng...-
Channel: Hỗ trợ học tập
12-12-2024, 00:33 -
Comment