9 use IEEE.std_logic_1164.
all;
10 use IEEE.std_logic_arith.
all;
11 use IEEE.std_logic_unsigned.
all;
13 use ipbus_lib.ipbus.
all;
15 use ipbus_lib.ipbus_reg_types.
all;
19 BYTE_SPI: boolean := FALSE;
38 selreg : out std_logic_vector(1 downto 0)
41 attribute keep_hierarchy : string;
42 attribute keep_hierarchy of ipbus_spi32 : entity is "yes";
50 signal ram_ptr : std_logic_vector(ADDR_WIDTH - 3 downto 0);
51 signal ram_write: std_logic;
53 signal outgoing_data, incoming_data: std_logic_vector(31 downto 0);
55 constant DIV_BITS: natural := 2;
57 signal spi_clk: std_logic := '0';
58 signal clk_en: std_logic := '0';
60 constant NSLV: positive := 4;
61 signal ipbw: ipb_wbus_array(NSLV-1 downto 0);
62 signal ipbr, ipbr_d: ipb_rbus_array(NSLV-1 downto 0);
64 signal spi_ctrl: ipb_reg_v(3 downto 0);
65 signal spi_stat: ipb_reg_v(0 downto 0);
68 signal transfer_count : std_logic_vector( ADDR_WIDTH downto 0);
71 signal do_spi,run_spi,busy : std_logic;
79 block_decode:
entity ipbus_lib.ipbus_fabric_branch
82 DECODE_BASE => ADDR_WIDTH -
2
87 ipb_to_slaves => ipbw,
88 ipb_from_slaves => ipbr
92 variable div : std_logic_vector(DIV_BITS downto 1);
97 spi_clk <= div(DIV_BITS);
103 spi_control:
entity ipbus_lib.ipbus_ctrlreg_v
112 ipbus_out => ipbr
(0),
117 selreg <= spi_ctrl(0)(1 downto 0);
118 transfer_count <= spi_ctrl(2)((ADDR_WIDTH ) downto 0);
119 do_spi <= spi_ctrl(3)(0);
121 spi_stat(0) <= X"0000000" & "000" & busy;
140 ADDR_WIDTH => ADDR_WIDTH -
2
149 d =>
(others => '0'
),
156 ADDR_WIDTH => ADDR_WIDTH -
2
182 ADDR_WIDTH => ADDR_WIDTH -
1,
197 mosi => spi_out.mosi,
out pulse std_logic
pulse created from the enable siganl
in Enable std_logic
enable
in CLK_I std_logic
clock in
in req std_logic
positive edge sensitive
in out_clk std_logic
derived from ipb_clk and slower
out kick std_logic := '0'
kick downstream state machine
in ipb_clk std_logic
IPBus clock of 31.25MHz.
in clk std_logic
write clock
in addr std_logic_vector( ADDR_WIDTH- 1 downto 0)
address
out ipb_out ipb_rbus
IPBus output bus going from slaves to master.
in rclk std_logic
read clock
in we std_logic := '0'
write enable
in ipb_in ipb_wbus
IPBus input bus going from master to slaves.
in d std_logic_vector( 31 downto 0) :=( others => '0')
data in
out q std_logic_vector( 31 downto 0)
data out
in spi_in spi_mi
spi input signals
out selreg std_logic_vector( 1 downto 0)
select output
out ipb_out ipb_rbus
IPBus output bus going from slaves to master.
out spi_out spi_mo
spi output signals
in ipb_in ipb_wbus
IPBus input bus going from master to slaves.
in ipbus_clk std_logic
ipbus clk of 31.25MHz
in ipbus_clk STD_LOGIC
IPBus clock of 31.25MHz.
out ipbus_out ipb_rbus
IPBus output bus going from slaves to master.
in ipbus_in ipb_wbus
IPBus input bus going from master to slaves.
icontroller for SPI interface PLL chips of FTM /eFEX
out cs_n std_logic := '1'
chip select of the spi flssh
out incoming_data std_logic_vector( 31 downto 0)
data from the spi flash
out busy std_logic := '0'
busy
in outgoing_data std_logic_vector( 31 downto 0)
data going to the spi flash
in run_spi std_logic
run spi controller
in transfer_count std_logic_vector( ADDR_WIDTH+ 1 downto 0)
data transfer count
out clk_en std_logic := '0'
clock enable
out mosi std_logic := '0'
mosi to spi flash
in miso std_logic := '0'
miso from spi flash
out ram_write std_logic := '0'
write enable of the ram
in spi_clk std_logic
spi clock
out ram_ptr std_logic_vector( ADDR_WIDTH- 2 downto 0)
ram pointer