##// END OF EJS Templates
MiniSpartan6:...
MiniSpartan6: added ftdi chip config to switch between UART and Async FIFO. added few WIP designs with either spwlight core, FIFO_deom IP... Libs: added SpaceWire Light IP (Works really well!) started design of ahb_ftdi_fifo -> same protocol than AHBUART but over FTDI's Async FIFO interface. This might lead to much faster transfers UP to 12MB/s.

File last commit:

r681:9d85f9f8f05a default
r681:9d85f9f8f05a default
Show More
ftdi_async_fifo_loopback.vhd
132 lines | 3.8 KiB | text/x-vhdl | VhdlLexer
/ lib / lpp / lpp_usb / ftdi_async_fifo_loopback.vhd
------------------------------------------------------------------------------
-- This file is a part of the LPP VHDL IP LIBRARY
-- Copyright (C) 2016, Laboratory of Plasmas Physic - CNRS
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 3 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
------------------------------------------------------------------------------
-- Author : Alexis Jeandet
-- Mail : alexis.jeandet@lpp.polytechnique.fr
------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
library grlib;
use grlib.stdlib.all;
use grlib.devices.all;
library gaisler;
use gaisler.libdcom.all;
use gaisler.uart.all;
library lpp;
use lpp.lpp_usb.all;
entity ftdi_async_fifo_loopback is
generic (
oepol : integer := 0
);
port (
clk : in std_logic;
rstn : in std_logic;
FTDI_RXF : in std_logic;
FTDI_TXE : in std_logic;
FTDI_SIWUA : out std_logic;
FTDI_WR : out std_logic;
FTDI_RD : out std_logic;
FTDI_D_in : in std_logic_vector(7 downto 0);
FTDI_D_out : out std_logic_vector(7 downto 0);
FTDI_D_drive : out std_logic
);
end ftdi_async_fifo_loopback;
architecture beh of ftdi_async_fifo_loopback is
type fifo_fsm_st is (idle,waitTXE,preWrite,Write,postWrite,preRead,Read,postRead);
signal state : fifo_fsm_st:=idle;
signal output_en : std_logic;
signal dready : std_logic;
signal fifo_flush_cntr : integer := 31;
signal fifo_siwu_pulse : std_logic_vector(3 downto 0):= (others => '1');
begin
acthi: if oepol = 1 generate
output_en <= '1';
end generate;
actlow: if oepol = 0 generate
output_en <= '0';
end generate;
FTDI_SIWUA <= '1';--fifo_siwu_pulse(0);
process(rstn,clk)
begin
if rstn = '0' then
FTDI_RD <= '1';
FTDI_WR <= '1';
FTDI_D_drive <= not output_en;
elsif clk'event and clk='1' then
if fifo_flush_cntr = 1 then
fifo_siwu_pulse <= (others => '0');
else
fifo_siwu_pulse <= '1' & fifo_siwu_pulse(3 downto 1);
end if;
case state is
when idle =>
if FTDI_RXF = '0' then
state <= preRead;
FTDI_RD <= '0';
end if;
FTDI_WR <= '1';
when preWrite =>
FTDI_WR <= '0';
state <= Write;
when Write =>
FTDI_D_drive <= not output_en;
state <= idle;
fifo_flush_cntr <= 31;
when preRead =>
state <= Read;
when Read =>
FTDI_D_out <= FTDI_D_in;
FTDI_RD <= '1';
state <= waitTXE;
when waitTXE =>
if FTDI_TXE = '0' then
state <= preWrite;
FTDI_D_drive <= output_en;
end if;
when others => NULL;
end case;
end if;
end process;
end beh;
-- type dcom_uart_in_type is record
-- read : std_ulogic;
-- write : std_ulogic;
-- data : std_logic_vector(7 downto 0);
-- end record;
-- type dcom_uart_out_type is record
-- dready : std_ulogic; -> data from ftdi to DCOM
-- tsempty : std_ulogic; -> not used by decom -> set to 0
-- thempty : std_ulogic; -> tels dcom that ready to write to ftdi
-- lock : std_ulogic; -> set to 1
-- enable : std_ulogic; -> unused
-- data : std_logic_vector(7 downto 0);
-- end record;