2013-12-12 2 views
0

이 RAM의 2D 배열은 완벽하게 작동했습니다. 이제 데이터를 읽기 전에 다중 트리거를 처리해야합니다. 그래서 지금은 RAM에 데이터 버퍼를 만들기 위해 노력하고 있습니다. 그래서 여러 개의 트리거가 실행되면 나중에 읽을 수있는 데이터를 저장할 수 있습니다. 방금 두 가지를 궁금해했습니다.데이터 버퍼 용 VHDL의 3D 배열

1) 3D 배열을 설정하는 방법은 무엇입니까? 방대한 양의 정보가 없습니다

2) 내 데이터를위한 버퍼를 만드는 더 좋은 방법이 있습니까?

데이터 형식이다 데이터 [buff_num] word_num [이진]

각 단어는 32 비트이고, 보통 14 개 단어가되고 난 8 비트 깊이 버퍼라고 생각되는.

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use ieee.numeric_std.all; 

entity ipbus_dpram is 
    generic(
    ADDR_WIDTH: natural 
    ); 
    port(
    clk: in std_logic; 
    rst: in std_logic; 
    rclk: in std_logic; 
    we: in std_logic := '0'; 
    d: in std_logic_vector(31 downto 0); 
    rdata: out std_logic_vector(ADDR_WIDTH - 1 downto 0); 
    addr: in std_logic_vector(ADDR_WIDTH - 1 downto 0); 
    w_addr: out std_logic(ADDR_WIDTH - 1 downto 0); 
    w_buf_shift: in std_logic; 
    en_write: in std_logic; 

    ); 

end ipbus_dpram; 

architecture rtl of ipbus_dpram is 

    type ram_array is array(7 downto 0, 13 downto 0) of std_logic_vector(31 downto 0);  
    shared variable ram: ram_array; 
    signal w_shel, r_shel : integer; 
    signal sel, wsel: integer; 
    signal ack: std_logic; 

    signal w_shift: unsigned(7 downto 0); 
    signal r_shift: unsigned(7 downto 0); 

begin 

    sel <= to_integer(unsigned(r_addr(addr_width-1 downto 0))); 

    process(clk) 
    begin 
    if rising_edge(clk) then 
     rdata <= ram(r_shel, sel); 

     if (en_write='1') then 
     r_shel <= to_integer(unsigned(r_shift)); 
     r_shift <= r_shift +1; 
     end if; 
    end if; 
    end process; 

    wsel <= to_integer(unsigned(addr)); 

    process(rclk) 
    begin 
    if rising_edge(rclk) then 

     if we = '1' then 
     ram(w_shel, wsel) := d; 
     end if; 
     if w_buf_shift = '1' then 
     w_shel <= to_integer(unsigned(w_shift)); 
     w_shift <= w_shift + 1; 
     end if; 
    end if; 
    end process; 

end rtl; 

답변

1

와우 ... 이것은 합성하려고하는 엄청난 양의 레지스터입니다. 2^8 = 256 넓이, 2^14 = 16384 길이, 32 깊이 = 134,217,728 레지스터 인 3D 벡터! 더 큰 보트가 필요할거야. 사실 아직 존재하지 않는 보트가 필요할 것입니다. 어쩌면 언젠가는 요구 사항을 처리 할 수있을 정도로 큰 FPGA를 만들지 만 그날은 오늘이 아닙니다.

데이터를보다 지능적으로 저장해야합니다. DRAM이나 SRAM과 같은 오프 칩 저장소를 사용해야하거나 FIFO를 사용하여 일시적으로 데이터를 버퍼해야합니다.

+0

대략이 상황에서 FIFO를 어떻게 사용하는지 설명해 주시겠습니까? – fiz

+0

또한 - 배열을 올바르게 초기화했다고 생각하십니까? – fiz

+0

FIFO = 선입 선출. 래티스와 자일링스와 액텔이 모두 약간 다르므로, 가지고있는 FPGA 패브릭을 사용하여 FIFO를 만드는 방법을 찾아보십시오. 하나의 프로세스가 FIFO에 쓰는 것에 전적인 책임이 있고 다른 프로세스는 FIFO에서 독점적으로 읽기를 담당해야합니다. 나는 대개 깨끗한 상태로 유지하기 위해 이들 각각을 2 개의 개별 파일에 저장합니다. FIFO에 대한 몇 가지주의 사항 : 1. 절대 FIFO에 쓰지 말아야합니다. 2. 빈 FIFO를 읽지 마십시오. 행운을 빈다. – Russell