이 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;
대략이 상황에서 FIFO를 어떻게 사용하는지 설명해 주시겠습니까? – fiz
또한 - 배열을 올바르게 초기화했다고 생각하십니까? – fiz
FIFO = 선입 선출. 래티스와 자일링스와 액텔이 모두 약간 다르므로, 가지고있는 FPGA 패브릭을 사용하여 FIFO를 만드는 방법을 찾아보십시오. 하나의 프로세스가 FIFO에 쓰는 것에 전적인 책임이 있고 다른 프로세스는 FIFO에서 독점적으로 읽기를 담당해야합니다. 나는 대개 깨끗한 상태로 유지하기 위해 이들 각각을 2 개의 개별 파일에 저장합니다. FIFO에 대한 몇 가지주의 사항 : 1. 절대 FIFO에 쓰지 말아야합니다. 2. 빈 FIFO를 읽지 마십시오. 행운을 빈다. – Russell