n_mem_data_oe <= not mem_data_oe;
MEM_DATA_GEN : for i in 15 downto 0 generate
IOBUF_inst : IOBUF port map(
O => input_mem_data(i),
IO => mem_data(i),
I => mem_data_out(i),
T => n_mem_data_oe
);
end generate MEM_DATA_GEN;
-- n_mem_we, mem_data_oe を生成する。48MHzのステートマシンで出力
process(clk48) begin
if clk48'event and clk48='1' then
if reset='1' then
cs_we <= idle_we;
else
cs_we <= ns_we;
end if;
end if;
end process;
process(cs_we, r_w, cam_href_3d) begin
case cs_we is
when idle_we =>
n_mem_we_node <= '1';
mem_data_oe <= '0';
if r_w='0' and cam_href_3d='1' then -- hrefの間だけSRAMにWriteする
ns_we <= we_active;
else
ns_we <= idle_we;
end if;
when we_active => -- r_w が1時48MHzクロック1クロック間だけ n_mem_we を0にする
n_mem_we_node <= '0';
mem_data_oe <= '1';
ns_we <= we_holdoff;
when we_holdoff => -- この時はまだr_wが0
n_mem_we_node <= '1';
mem_data_oe <= '0';
ns_we <= idle_we;
end case;
end process;
n_mem_we <= n_mem_we_node;
signal mem_data_node : std_logic_vector(15 downto 0);
signal next_mem_data_oe : std_logic;
attribute iob : string;
attribute iob of n_mem_data_oe : signal is "TRUE";
attribute keep : string;
attribute keep of n_mem_data_oe : signal is "TRUE";
attribute keep of next_mem_data_oe : signal is "TRUE";
begin
.....
-- n_mem_we, mem_data_oe を生成する。48MHzのステートマシンで出力
process(clk48) begin
if clk48'event and clk48='1' then
if reset='1' then
cs_we <= idle_we;
else
cs_we <= ns_we;
end if;
end if;
end process;
process(cs_we, r_w, cam_href_3d) begin
case cs_we is
when idle_we =>
n_mem_we_node <= '1';
if r_w='0' and cam_href_3d='1' then -- hrefの間だけSRAMにWriteする
ns_we <= we_active;
next_mem_data_oe <= '1';
else
ns_we <= idle_we;
next_mem_data_oe <= '0';
end if;
when we_active => -- r_w が1時48MHzクロック1クロック間だけ n_mem_we を0にする
n_mem_we_node <= '0';
ns_we <= we_holdoff;
next_mem_data_oe <= '0';
when we_holdoff => -- この時はまだr_wが0
n_mem_we_node <= '1';
ns_we <= idle_we;
next_mem_data_oe <= '0';
when others =>
n_mem_we_node <= '1';
ns_we <= idle_we;
next_mem_data_oe <= '0';
end case;
end process;
n_mem_we <= n_mem_we_node;
-- mem_data_oeの出力
process(clk48) begin
if clk48'event and clk48='1' then
if reset='1' then
n_mem_data_oe <= (others => '1');
else
for i in 15 downto 0 loop
n_mem_data_oe(i) <= not next_mem_data_oe;
end loop;
end if;
end if;
end process;
MEM_DATA_GEN : for i in 15 downto 0 generate
IOBUF_inst : IOBUF port map(
O => input_mem_data(i),
IO => mem_data(i),
I => mem_data_out(i),
T => n_mem_data_oe(i)
);
end generate MEM_DATA_GEN;
日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
- | - | - | - | - | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | - | - | - | - | - | - |