angie probe doesn't use srst pin anymore, it was removed in latest version. Change-Id: I6b1439f2328770e5b525c3d129afd08bddf42025 Signed-off-by: Ahmed BOUDJELIDA <aboudjelida@nanoxplore.com> Reviewed-on: https://review.openocd.org/c/openocd/+/8859 Tested-by: jenkins Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
416 lines
10 KiB
VHDL
416 lines
10 KiB
VHDL
-- SPDX-License-Identifier: BSD-3-Clause
|
|
----------------------------------------------------------------------------
|
|
-- Project Context: nanoXplore USB to JTAG/I2C Adapter Board, Spartan6
|
|
-- Design Name: ANGIE USB to JTAG/I2C Adapter FPGA source code
|
|
-- Module Name: angie_bitstream.vhd
|
|
-- Target Device: XC6SLX9-2 TQ144
|
|
-- Tool versions: ISE Webpack 13.2 -> 14.2
|
|
-- Author: Ahmed BOUDJELIDA nanoXplore SAS
|
|
----------------------------------------------------------------------------
|
|
library work;
|
|
use work.all;
|
|
library ieee;
|
|
use ieee.std_logic_1164.all;
|
|
use ieee.std_logic_arith.all;
|
|
use ieee.std_logic_unsigned.all;
|
|
|
|
entity angie_bitstream is port(
|
|
SDA_IO : inout std_logic;
|
|
SDA_DIR_I : in std_logic;
|
|
SCL_I : in std_logic;
|
|
|
|
JPW_I : in std_logic; --Devkit power
|
|
|
|
SO_SDA_OUT_O : out std_logic;
|
|
SO_SDA_IN_I : in std_logic;
|
|
SO_SCL_O : out std_logic;
|
|
|
|
ST_0_O : out std_logic;
|
|
ST_1_O : out std_logic;
|
|
ST_2_O : out std_logic;
|
|
ST_3_O : out std_logic;
|
|
ST_4_O : out std_logic;
|
|
ST_5_O : out std_logic;
|
|
|
|
SO_TRST_O : out std_logic;
|
|
SO_TMS_O : out std_logic;
|
|
SO_TCK_O : out std_logic;
|
|
SO_TDI_O : out std_logic;
|
|
SO_SRST_O : out std_logic;
|
|
SI_TDO_I : in std_logic;
|
|
|
|
PA2_I : in std_logic; -- GPIF IN
|
|
|
|
-- Clock 48MHz
|
|
IFCLK_I : in std_logic;
|
|
|
|
GCTL0_I : in std_logic;
|
|
GRDY1_I : out std_logic;
|
|
GD_IO : inout std_logic_vector(7 downto 0);
|
|
FTP_O : out std_logic_vector(15 downto 0)
|
|
);
|
|
end angie_bitstream;
|
|
|
|
architecture A_angie_bitstream of angie_bitstream is
|
|
----------------------------------------Fifo out (PC to devkit)
|
|
signal rst_o, clk_wr_o, clk_rd_o : std_logic;
|
|
signal write_en_o, read_en_o : std_logic;
|
|
signal data_in_o, data_out_o : std_logic_vector(7 downto 0);
|
|
signal empty_o, full_o : std_logic;
|
|
|
|
----------------------------------------Fifo in (devkit to PC)
|
|
signal rst_i, clk_wr_i, clk_rd_i : std_logic;
|
|
signal write_en_i, read_en_i : std_logic;
|
|
signal data_in_i, data_out_i : std_logic_vector(7 downto 0);
|
|
signal empty_i, full_i : std_logic;
|
|
|
|
signal wr_o, rd_i : std_logic;
|
|
|
|
----------------------------------------MAE
|
|
signal transit1, transit2 : std_logic;
|
|
|
|
----------------------------------------DFF
|
|
signal pa2_dff_clk, pa2_dff_rst, pa2_dff_d, pa2_dff_q : std_logic;
|
|
signal trst_clk, trst_rst, trst_d, trst_q : std_logic;
|
|
signal tms_clk, tms_rst, tms_d, tms_q : std_logic;
|
|
signal tdi_clk, tdi_rst, tdi_d, tdi_q : std_logic;
|
|
signal tdo_clk, tdo_rst, tdo_d, tdo_q : std_logic;
|
|
|
|
----------------------------------------clk_div
|
|
signal clk_div_in, clk_div_out, reset_clk_div : std_logic;
|
|
signal clk_div2_in, clk_div2_out, reset_clk_div2 : std_logic;
|
|
|
|
----------------------------------------MAE
|
|
type State_Type is (IDLE, WRITE_OUT, WRITE_IN, DELAY, READ_IN);
|
|
signal state, state2 : State_Type;
|
|
signal reset_mae, reset_mae2 : std_logic;
|
|
|
|
-- Add Component DFF
|
|
component DFF
|
|
Port (
|
|
clk : in std_logic;
|
|
reset : in std_logic;
|
|
d : in std_logic;
|
|
q : out std_logic
|
|
);
|
|
end component;
|
|
|
|
-- Add Component Clk_div
|
|
component clk_div
|
|
Port (
|
|
clk_in : in std_logic;
|
|
reset : in std_logic;
|
|
clk_out : out std_logic
|
|
);
|
|
end component;
|
|
|
|
-- Add component FIFO 64B
|
|
component fifo_generator_v9_3
|
|
PORT (
|
|
rst : IN STD_LOGIC;
|
|
wr_clk : IN STD_LOGIC;
|
|
rd_clk : IN STD_LOGIC;
|
|
din : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
|
|
wr_en : IN STD_LOGIC;
|
|
rd_en : IN STD_LOGIC;
|
|
dout : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
|
|
full : OUT STD_LOGIC;
|
|
empty : OUT STD_LOGIC
|
|
);
|
|
end component;
|
|
|
|
signal state1_debug, state2_debug : std_logic;
|
|
|
|
begin
|
|
-------------------------------------------------------------I2C :
|
|
SDA_IO <= not(SO_SDA_IN_I) when (SDA_DIR_I = '1') else 'Z';
|
|
SO_SDA_OUT_O <= SDA_IO;
|
|
ST_5_O <= SDA_DIR_I;
|
|
|
|
SO_SCL_O <= SCL_I when (JPW_I = '1') else '0';
|
|
ST_4_O <= '0';
|
|
|
|
------------------------------------------------------------JTAG :
|
|
-- Instantiate the Clk div by 10
|
|
clk_div_inst : clk_div
|
|
port map (
|
|
clk_in => clk_div_in,
|
|
reset => reset_clk_div,
|
|
clk_out => clk_div_out
|
|
);
|
|
-- Instantiate the Clk div by 10
|
|
clk_div2_inst : clk_div
|
|
port map (
|
|
clk_in => clk_div2_in,
|
|
reset => reset_clk_div2,
|
|
clk_out => clk_div2_out
|
|
);
|
|
|
|
-- Instantiate DFFs
|
|
DFF_inst_PA2 : DFF
|
|
port map (
|
|
clk => pa2_dff_clk,
|
|
reset => pa2_dff_rst,
|
|
d => pa2_dff_d,
|
|
q => pa2_dff_q
|
|
);
|
|
|
|
DFF_inst_TRST : DFF
|
|
port map (
|
|
clk => trst_clk,
|
|
reset => trst_rst,
|
|
d => trst_d,
|
|
q => trst_q
|
|
);
|
|
|
|
DFF_inst_TMS : DFF
|
|
port map (
|
|
clk => tms_clk,
|
|
reset => tms_rst,
|
|
d => tms_d,
|
|
q => tms_q
|
|
);
|
|
|
|
DFF_inst_TDI : DFF
|
|
port map (
|
|
clk => tdi_clk,
|
|
reset => tdi_rst,
|
|
d => tdi_d,
|
|
q => tdi_q
|
|
);
|
|
|
|
DFF_inst_TDO : DFF
|
|
port map (
|
|
clk => tdo_clk,
|
|
reset => tdo_rst,
|
|
d => tdo_d,
|
|
q => tdo_q
|
|
);
|
|
|
|
-- Instantiate the FIFO OUT
|
|
U0 : fifo_generator_v9_3
|
|
port map (
|
|
rst => rst_o,
|
|
wr_clk => clk_wr_o,
|
|
rd_clk => clk_rd_o,
|
|
din => data_in_o,
|
|
wr_en => write_en_o,
|
|
rd_en => read_en_o,
|
|
dout => data_out_o,
|
|
full => full_o,
|
|
empty => empty_o
|
|
);
|
|
-- Instantiate the FIFO IN
|
|
U1 : fifo_generator_v9_3
|
|
port map (
|
|
rst => rst_i,
|
|
wr_clk => clk_wr_i,
|
|
rd_clk => clk_rd_i,
|
|
din => data_in_i,
|
|
wr_en => write_en_i,
|
|
rd_en => read_en_i,
|
|
dout => data_out_i,
|
|
full => full_i,
|
|
empty => empty_i
|
|
);
|
|
|
|
--------------- clock dividers
|
|
clk_div_in <= IFCLK_I; -- 48Mhz
|
|
clk_div2_in <= clk_div_out; -- 24Mhz
|
|
|
|
--------------- DFFs
|
|
pa2_dff_clk <= IFCLK_I;
|
|
trst_clk <= IFCLK_I;
|
|
tms_clk <= IFCLK_I;
|
|
tdi_clk <= IFCLK_I;
|
|
tdo_clk <= IFCLK_I;
|
|
|
|
--------------- FIFOs
|
|
clk_wr_o <= IFCLK_I;
|
|
clk_rd_o <= clk_div2_out;
|
|
clk_wr_i <= clk_div2_out;
|
|
clk_rd_i <= IFCLK_I;
|
|
|
|
--------------------------- GPIF ready :
|
|
GRDY1_I <= '1';
|
|
|
|
-------------------------------PA2 DFF :
|
|
pa2_dff_rst <= '0';
|
|
pa2_dff_d <= PA2_I;
|
|
|
|
-------------------- FX2<->Fifo Enable pins :
|
|
write_en_o <= not(wr_o) and not(GCTL0_I);
|
|
read_en_i <= not(rd_i) and not(GCTL0_I);
|
|
|
|
---------------- FX2->Fifo Data :
|
|
data_in_o <= GD_IO;
|
|
|
|
------------ FIFO_OUT->Devkit :
|
|
SO_TRST_O <= trst_q;
|
|
trst_d <= data_out_o(4);
|
|
SO_TMS_O <= tms_q;
|
|
tms_d <= data_out_o(3);
|
|
SO_TDI_O <= tdi_q;
|
|
tdi_d <= data_out_o(1);
|
|
------------
|
|
SO_TCK_O <= data_out_o(0);
|
|
|
|
-------------------- FIFO_OUT->FIFO_IN :
|
|
--data_in_i <= data_out_o;
|
|
|
|
-------------------- FIFO_IN<-Devkit :
|
|
data_in_i(0) <= '0';
|
|
data_in_i(1) <= '0';
|
|
data_in_i(2) <= tdo_q;
|
|
tdo_d <= not SI_TDO_I;
|
|
data_in_i(3) <= '0';
|
|
data_in_i(4) <= '0';
|
|
data_in_i(5) <= '0';
|
|
data_in_i(6) <= '0';
|
|
data_in_i(7) <= '0';
|
|
|
|
-------------------- FX2<-FIFO_IN :
|
|
GD_IO <= data_out_i when (state = READ_IN) else "ZZZZZZZZ";
|
|
|
|
state1_debug <= '1' when state = READ_IN else '0';
|
|
state2_debug <= '1' when state2 = WRITE_IN else '0';
|
|
|
|
--Points de test:
|
|
FTP_O(0) <= IFCLK_I;
|
|
FTP_O(1) <= GCTL0_I;
|
|
FTP_O(2) <= GD_IO(0);
|
|
FTP_O(3) <= GD_IO(1);
|
|
FTP_O(4) <= JPW_I;
|
|
FTP_O(5) <= PA2_I;
|
|
FTP_O(6) <= empty_o;
|
|
FTP_O(7) <= not SI_TDO_I;
|
|
|
|
process(pa2_dff_d, pa2_dff_q)
|
|
begin
|
|
if pa2_dff_d = '0' and pa2_dff_q = '1' then
|
|
reset_mae <= '1'; -- Reset State Machine
|
|
reset_mae2 <= '1'; -- Reset State Machine
|
|
rst_o <= '1'; -- Reset OUT
|
|
rst_i <= '1'; -- Reset IN
|
|
reset_clk_div <= '1';
|
|
reset_clk_div2 <= '1';
|
|
trst_rst <= '1';
|
|
tms_rst <= '1';
|
|
tdi_rst <= '1';
|
|
tdo_rst <= '1';
|
|
else
|
|
reset_mae <= '0'; -- No Reset State Machine
|
|
reset_mae2 <= '0'; -- Reset State Machine
|
|
rst_o <= '0'; -- No Reset OUT
|
|
rst_i <= '0'; -- No Reset IN
|
|
reset_clk_div <= '0';
|
|
reset_clk_div2 <= '0';
|
|
trst_rst <= '0';
|
|
tms_rst <= '0';
|
|
tdi_rst <= '0';
|
|
tdo_rst <= '0';
|
|
end if;
|
|
end process;
|
|
|
|
process(clk_div2_out, reset_mae2)
|
|
begin
|
|
if reset_mae2 = '1' then
|
|
state2 <= IDLE;
|
|
elsif rising_edge(clk_div2_out) then
|
|
case state2 is
|
|
when IDLE =>
|
|
read_en_o <= '0'; -- Disable read OUT
|
|
write_en_i <= '0'; -- Disable write IN
|
|
transit2 <= '1';
|
|
if transit1 = '0' and PA2_I = '0' then
|
|
state2 <= WRITE_IN;
|
|
else
|
|
state2 <= IDLE;
|
|
end if;
|
|
|
|
when WRITE_IN =>
|
|
read_en_o <= '1'; -- Enable read OUT
|
|
write_en_i <= '1'; -- Enable write IN
|
|
if PA2_I = '1' then
|
|
state2 <= DELAY; -- Change state to DELAY
|
|
else
|
|
state2 <= WRITE_IN; -- Stay in WRITE_IN state
|
|
end if;
|
|
|
|
when DELAY =>
|
|
transit2 <= '0'; -- Enable READ IN
|
|
if empty_o = '1' then
|
|
read_en_o <= '0'; -- Disable read OUT
|
|
write_en_i <= '0'; -- Disable write IN
|
|
state2 <= IDLE; -- Change state to IDLE
|
|
else
|
|
state2 <= DELAY; -- Stay in READ_IN state
|
|
end if;
|
|
|
|
when others =>
|
|
state2 <= IDLE;
|
|
end case;
|
|
end if;
|
|
end process;
|
|
|
|
process(IFCLK_I, reset_mae)
|
|
begin
|
|
if reset_mae = '1' then
|
|
state <= IDLE;
|
|
elsif rising_edge(IFCLK_I) then
|
|
case state is
|
|
when IDLE =>
|
|
wr_o <= '1'; -- Disable write OUT
|
|
rd_i <= '1'; -- Disable read IN
|
|
transit1 <= '1';
|
|
if PA2_I = '0' then
|
|
state <= WRITE_OUT; -- Change state to RESET
|
|
else
|
|
state <= IDLE; -- Stay in IDLE state
|
|
end if;
|
|
|
|
when WRITE_OUT =>
|
|
wr_o <= '0'; -- Enable write OUT
|
|
if empty_o = '0' then
|
|
transit1 <= '0'; -- Enable Rd OUT & Wr IN
|
|
state <= DELAY; -- Change state to DELAY
|
|
else
|
|
state <= WRITE_OUT; -- Stay in WRITE_OUT state
|
|
end if;
|
|
|
|
when DELAY =>
|
|
if transit2 = '0' then
|
|
wr_o <= '1'; -- Disable write OUT
|
|
state <= READ_IN;
|
|
else
|
|
state <= DELAY;
|
|
end if;
|
|
|
|
when READ_IN =>
|
|
rd_i <= '0'; -- Enable read IN
|
|
if empty_i = '1' then
|
|
rd_i <= '1'; -- Enable read IN
|
|
state <= IDLE; -- Change state to IDLE
|
|
else
|
|
state <= READ_IN; -- Stay in READ_IN state
|
|
end if;
|
|
|
|
when others =>
|
|
state <= IDLE;
|
|
end case;
|
|
end if;
|
|
end process;
|
|
|
|
-- OUT signals direction
|
|
-- TRST, TMS, TCK and TDI : out
|
|
ST_0_O <= '0';
|
|
-- TDO : in
|
|
ST_1_O <= '1';
|
|
-- SRST : out
|
|
ST_2_O <= '1';
|
|
SO_SRST_O <= '0';
|
|
-- MOD : in
|
|
ST_3_O <= '1';
|
|
|
|
end A_angie_bitstream;
|