Commit d1683381 authored by Tristan Gingold's avatar Tristan Gingold

Only support 32b data WB bus.

parent 01b08fee
...@@ -111,8 +111,8 @@ use work.vme64x_pack.all; ...@@ -111,8 +111,8 @@ use work.vme64x_pack.all;
entity VME64xCore_Top is entity VME64xCore_Top is
generic ( generic (
g_CLOCK_PERIOD : integer := c_CLOCK_PERIOD; -- Clock period (ns) g_CLOCK_PERIOD : integer := c_CLOCK_PERIOD; -- Clock period (ns)
g_WB_DATA_WIDTH : integer := c_DATA_WIDTH; -- WB data width: must be 32 or 64 g_WB_DATA_WIDTH : integer := c_DATA_WIDTH; -- WB data width: = 32
g_WB_ADDR_WIDTH : integer := c_ADDR_WIDTH; -- WB addr width: 64 or less g_WB_ADDR_WIDTH : integer := c_ADDR_WIDTH; -- WB addr width: <= 32
g_USER_CSR_EXT : boolean := false; -- Use external user CSR g_USER_CSR_EXT : boolean := false; -- Use external user CSR
-- Manufacturer ID: IEEE OUID -- Manufacturer ID: IEEE OUID
......
...@@ -82,9 +82,9 @@ entity VME_Wb_master is ...@@ -82,9 +82,9 @@ entity VME_Wb_master is
cardSel_i : in std_logic; cardSel_i : in std_logic;
reset_i : in std_logic; reset_i : in std_logic;
BERRcondition_i : in std_logic; BERRcondition_i : in std_logic;
sel_i : in std_logic_vector(7 downto 0); sel_i : in std_logic_vector(3 downto 0);
locDataInSwap_i : in std_logic_vector(63 downto 0); locDataInSwap_i : in std_logic_vector(31 downto 0);
locDataOut_o : out std_logic_vector(63 downto 0); locDataOut_o : out std_logic_vector(31 downto 0);
rel_locAddr_i : in std_logic_vector(31 downto 0); rel_locAddr_i : in std_logic_vector(31 downto 0);
memAckWb_o : out std_logic; memAckWb_o : out std_logic;
err_o : out std_logic; err_o : out std_logic;
...@@ -105,14 +105,9 @@ entity VME_Wb_master is ...@@ -105,14 +105,9 @@ entity VME_Wb_master is
end VME_Wb_master; end VME_Wb_master;
architecture Behavioral of VME_Wb_master is architecture Behavioral of VME_Wb_master is
signal s_shift_dx : std_logic;
signal s_cyc : std_logic;
signal s_AckWithError : std_logic; signal s_AckWithError : std_logic;
signal s_wbData_i : std_logic_vector(63 downto 0); signal s_cyc : std_logic;
signal s_memAckWB_d1 : std_logic;
begin begin
-- stb handler -- stb handler
process (clk_i) process (clk_i)
begin begin
...@@ -136,7 +131,7 @@ begin ...@@ -136,7 +131,7 @@ begin
end if; end if;
end if; end if;
end process; end process;
cyc_o <= s_cyc; cyc_o <= s_cyc;
process (clk_i) process (clk_i)
begin begin
...@@ -146,100 +141,24 @@ begin ...@@ -146,100 +141,24 @@ begin
end if; end if;
end process; end process;
-- shift data and address for WB data bus 64 bits
gen64: if (g_WB_DATA_WIDTH = 64) generate
process (clk_i)
begin
if rising_edge(clk_i) then
locAddr_o (63 downto 29) <= (others => '0');
locAddr_o (28 downto 0) <= rel_locAddr_i (31 downto 3);
end if;
end process;
process (clk_i)
begin
if rising_edge(clk_i) then
case sel_i is
when "10000000" => WBdata_o <= std_logic_vector(unsigned(locDataInSwap_i) sll 56);
when "01000000" => WBdata_o <= std_logic_vector(unsigned(locDataInSwap_i) sll 48);
when "00100000" => WBdata_o <= std_logic_vector(unsigned(locDataInSwap_i) sll 40);
when "00010000" => WBdata_o <= std_logic_vector(unsigned(locDataInSwap_i) sll 32);
when "00001000" => WBdata_o <= std_logic_vector(unsigned(locDataInSwap_i) sll 24);
when "00000100" => WBdata_o <= std_logic_vector(unsigned(locDataInSwap_i) sll 16);
when "00000010" => WBdata_o <= std_logic_vector(unsigned(locDataInSwap_i) sll 8);
when "00000001" => WBdata_o <= locDataInSwap_i;
when "11000000" => WBdata_o <= std_logic_vector(unsigned(locDataInSwap_i) sll 48);
when "00110000" => WBdata_o <= std_logic_vector(unsigned(locDataInSwap_i) sll 32);
when "00001100" => WBdata_o <= std_logic_vector(unsigned(locDataInSwap_i) sll 16);
when "00000011" => WBdata_o <= locDataInSwap_i;
when "11110000" => WBdata_o <= std_logic_vector(unsigned(locDataInSwap_i) sll 32);
when "00001111" => WBdata_o <= locDataInSwap_i;
when "11111111" => WBdata_o <= locDataInSwap_i;
when others => null;
end case;
WbSel_o <= std_logic_vector(sel_i);
end if;
end process;
process (sel_i, s_wbData_i)
begin
case sel_i is
when "00000010" =>
locDataOut_o <= std_logic_vector(resize(unsigned(s_wbData_i(15 downto 0)) srl 8, locDataOut_o'length));
when "00000100" =>
locDataOut_o <= std_logic_vector(resize(unsigned(s_wbData_i(23 downto 0)) srl 16, locDataOut_o'length));
when "00001000" =>
locDataOut_o <= std_logic_vector(resize(unsigned(s_wbData_i(31 downto 0)) srl 24, locDataOut_o'length));
when "00010000" =>
locDataOut_o <= std_logic_vector(resize(unsigned(s_wbData_i(39 downto 0)) srl 32, locDataOut_o'length));
when "00100000" =>
locDataOut_o <= std_logic_vector(resize(unsigned(s_wbData_i(47 downto 0)) srl 40, locDataOut_o'length));
when "01000000" =>
locDataOut_o <= std_logic_vector(resize(unsigned(s_wbData_i(55 downto 0)) srl 48, locDataOut_o'length));
when "10000000" =>
locDataOut_o <= std_logic_vector(resize(unsigned(s_wbData_i(63 downto 0)) srl 56, locDataOut_o'length));
when "00001100" =>
locDataOut_o <= std_logic_vector(resize(unsigned(s_wbData_i(31 downto 0)) srl 16, locDataOut_o'length));
when "00110000" =>
locDataOut_o <= std_logic_vector(resize(unsigned(s_wbData_i(47 downto 0)) srl 32, locDataOut_o'length));
when "11000000" =>
locDataOut_o <= std_logic_vector(resize(unsigned(s_wbData_i(63 downto 0)) srl 48, locDataOut_o'length));
when "00000001" =>
locDataOut_o <= std_logic_vector(resize(unsigned(s_wbData_i(7 downto 0)), locDataOut_o'length));
when "00000011" =>
locDataOut_o <= std_logic_vector(resize(unsigned(s_wbData_i(15 downto 0)), locDataOut_o'length));
when "00001111" =>
locDataOut_o <= std_logic_vector(resize(unsigned(s_wbData_i(31 downto 0)), locDataOut_o'length));
when "11110000" =>
locDataOut_o <= std_logic_vector(resize(unsigned(s_wbData_i(63 downto 0)) srl 32, locDataOut_o'length));
when "11111111" =>
locDataOut_o <= std_logic_vector(resize(unsigned(s_wbData_i(63 downto 0)), locDataOut_o'length));
when others =>
locDataOut_o <= (others => '0');
end case;
end process;
end generate gen64;
-- shift data and address for WB data bus 32 bits -- shift data and address for WB data bus 32 bits
gen32: if (g_WB_DATA_WIDTH = 32) generate assert g_WB_DATA_WIDTH = 32 severity failure;
process (clk_i)
begin process (clk_i)
if rising_edge(clk_i) then begin
locAddr_o (31 downto 30) <= (others => '0'); if rising_edge(clk_i) then
locAddr_o (29 downto 0) <= rel_locAddr_i (31 downto 2); locAddr_o (31 downto 30) <= (others => '0');
end if; locAddr_o (29 downto 0) <= rel_locAddr_i (31 downto 2);
end process; end if;
end process;
process (clk_i)
begin
if rising_edge(clk_i) then
WBdata_o <= locDataInSwap_i(31 downto 0);
WbSel_o <= sel_i(3 downto 0);
end if;
end process;
locDataOut_o <= s_wbData_i; process (clk_i)
end generate gen32; begin
if rising_edge(clk_i) then
WBdata_o <= locDataInSwap_i;
WbSel_o <= sel_i;
end if;
end process;
err_o <= err_i; err_o <= err_i;
rty_o <= rty_i; rty_o <= rty_i;
...@@ -251,12 +170,9 @@ begin ...@@ -251,12 +170,9 @@ begin
begin begin
if rising_edge(clk_i) then if rising_edge(clk_i) then
if memAckWB_i = '1' then if memAckWB_i = '1' then
s_wbData_i <= (others => '0'); locDataOut_o <= wbData_i;
s_wbData_i(wbData_i'range) <= wbData_i;
end if; end if;
s_memAckWb_d1 <= memAckWB_i or s_AckWithError or rty_i; memAckWb_o <= memAckWB_i or s_AckWithError or rty_i;
end if; end if;
end process; end process;
memAckWb_o <= s_memAckWB_d1;
end Behavioral; end Behavioral;
...@@ -227,7 +227,7 @@ architecture RTL of VME_bus is ...@@ -227,7 +227,7 @@ architecture RTL of VME_bus is
signal s_card_sel : std_logic; -- WB memory is addressed signal s_card_sel : std_logic; -- WB memory is addressed
-- WishBone signals -- WishBone signals
signal s_sel : std_logic_vector(7 downto 0); -- SEL WB signal s_sel : std_logic_vector(3 downto 0); -- SEL WB
-- Error signals -- Error signals
signal s_BERRcondition : std_logic; -- Condition to set BERR signal s_BERRcondition : std_logic; -- Condition to set BERR
...@@ -259,7 +259,10 @@ architecture RTL of VME_bus is ...@@ -259,7 +259,10 @@ architecture RTL of VME_bus is
-- True if endianness converters are supported. -- True if endianness converters are supported.
constant c_SWAPPER_EN : boolean := False; constant c_SWAPPER_EN : boolean := False;
begin begin
-- Consistency check.
assert g_WB_DATA_WIDTH = 32 report "g_WB_DATA_WIDTH must be set to 32"
severity failure;
-- These output signals are connected to the buffers on the board -- These output signals are connected to the buffers on the board
-- SN74VMEH22501A Function table: (A is fpga, B is VME connector) -- SN74VMEH22501A Function table: (A is fpga, B is VME connector)
-- OEn | DIR | OUTPUT OEAB | OEBYn | OUTPUT -- OEn | DIR | OUTPUT OEAB | OEBYn | OUTPUT
...@@ -347,7 +350,7 @@ begin ...@@ -347,7 +350,7 @@ begin
s_retry <= '0'; s_retry <= '0';
s_BERR_out <= '0'; s_BERR_out <= '0';
s_mainFSMstate <= IDLE; s_mainFSMstate <= IDLE;
s_sel <= "00000000"; s_sel <= "0000";
s_ADDRlatched <= (others => '0'); s_ADDRlatched <= (others => '0');
s_LWORDlatched_n <= '0'; s_LWORDlatched_n <= '0';
...@@ -393,6 +396,8 @@ begin ...@@ -393,6 +396,8 @@ begin
when REFORMAT_ADDRESS => when REFORMAT_ADDRESS =>
-- Reformat address according to the mode (A16, A24, A32) -- Reformat address according to the mode (A16, A24, A32)
-- FIXME: not needed if ADEM are correctly reduced to not compare
-- MSBs of A16 or A24 addresses.
case s_addressingType is case s_addressingType is
when A16 => when A16 =>
s_ADDRlatched (31 downto 16) <= (others => '0'); -- A16 s_ADDRlatched (31 downto 16) <= (others => '0'); -- A16
...@@ -455,7 +460,20 @@ begin ...@@ -455,7 +460,20 @@ begin
s_transferActive <= '1'; s_transferActive <= '1';
if s_DS_latch_count = 0 then if s_DS_latch_count = 0 then
s_mainFSMstate <= CHECK_TRANSFER_TYPE; s_mainFSMstate <= CHECK_TRANSFER_TYPE;
-- Read DS (which is delayed to avoid metastability).
s_DSlatched <= VME_DS_n_i; s_DSlatched <= VME_DS_n_i;
-- Read DATA (which are stable)
s_locDataIn(63 downto 33) <= VME_ADDR_i;
s_locDataIn(32) <= VME_LWORD_n_i;
if s_LWORDlatched_n = '1' and s_ADDRlatched(1) = '0' then
-- Word/byte access with A1=0
s_locDataIn(31 downto 16) <= VME_DATA_i(15 downto 0);
s_locDataIn(15 downto 0) <= VME_DATA_i(15 downto 0);
else
s_locDataIn(31 downto 0) <= VME_DATA_i;
end if;
else else
s_mainFSMstate <= LATCH_DS; s_mainFSMstate <= LATCH_DS;
s_DS_latch_count <= s_DS_latch_count - 1; s_DS_latch_count <= s_DS_latch_count - 1;
...@@ -468,15 +486,11 @@ begin ...@@ -468,15 +486,11 @@ begin
s_dataPhase <= s_dataPhase; s_dataPhase <= s_dataPhase;
s_transferActive <= '1'; s_transferActive <= '1';
-- Translate DS+LWORD+MBLT+AS to WB byte selects -- Translate DS+LWORD+ADDR to WB byte selects
if s_LWORDlatched_n = '0' then if s_LWORDlatched_n = '0' then
if s_transferType = MBLT then s_sel <= "1111";
s_sel <= "11111111";
else
s_sel <= "00001111";
end if;
else else
s_sel <= "00000000"; s_sel <= "0000";
case s_ADDRlatched(1) is case s_ADDRlatched(1) is
when '0' => when '0' =>
s_sel (3 downto 2) <= not s_DSlatched; s_sel (3 downto 2) <= not s_DSlatched;
...@@ -745,22 +759,6 @@ begin ...@@ -745,22 +759,6 @@ begin
-- Data Handler Process -- Data Handler Process
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
-- This process aligns the VME data input in the lsb
process (clk_i)
begin
if rising_edge(clk_i) then
s_locDataIn(63 downto 33) <= VME_ADDR_i;
s_locDataIn(32) <= VME_LWORD_n_i;
if s_LWORDlatched_n = '1' and s_ADDRlatched(1) = '0' then
-- Word/byte access with A1=0
s_locDataIn(31 downto 16) <= VME_DATA_i(15 downto 0);
s_locDataIn(15 downto 0) <= VME_DATA_i(15 downto 0);
else
s_locDataIn(31 downto 0) <= VME_DATA_i;
end if;
end if;
end process;
gen_swapper_ena: if c_SWAPPER_EN generate gen_swapper_ena: if c_SWAPPER_EN generate
-- Swap the data during read or write operation -- Swap the data during read or write operation
-- sel= 000 --> No swap -- sel= 000 --> No swap
...@@ -808,8 +806,8 @@ begin ...@@ -808,8 +806,8 @@ begin
reset_i => s_wbMaster_rst, reset_i => s_wbMaster_rst,
BERRcondition_i => s_BERRcondition, BERRcondition_i => s_BERRcondition,
sel_i => s_sel, sel_i => s_sel,
locDataInSwap_i => s_locDataInSwap, locDataInSwap_i => s_locDataInSwap (31 downto 0),
locDataOut_o => s_locDataOutWb, locDataOut_o => s_locDataOutWb (31 downto 0),
rel_locAddr_i => s_locAddr, rel_locAddr_i => s_locAddr,
memAckWb_o => s_AckWb, memAckWb_o => s_AckWb,
err_o => s_err, err_o => s_err,
......
...@@ -361,8 +361,8 @@ package vme64x_pack is ...@@ -361,8 +361,8 @@ package vme64x_pack is
cardSel_i : in std_logic; cardSel_i : in std_logic;
reset_i : in std_logic; reset_i : in std_logic;
BERRcondition_i : in std_logic; BERRcondition_i : in std_logic;
sel_i : in std_logic_vector(7 downto 0); sel_i : in std_logic_vector(3 downto 0);
locDataInSwap_i : in std_logic_vector(63 downto 0); locDataInSwap_i : in std_logic_vector(31 downto 0);
rel_locAddr_i : in std_logic_vector(31 downto 0); rel_locAddr_i : in std_logic_vector(31 downto 0);
RW_i : in std_logic; RW_i : in std_logic;
stall_i : in std_logic; stall_i : in std_logic;
...@@ -370,7 +370,7 @@ package vme64x_pack is ...@@ -370,7 +370,7 @@ package vme64x_pack is
err_i : in std_logic; err_i : in std_logic;
wbData_i : in std_logic_vector(g_WB_DATA_WIDTH-1 downto 0); wbData_i : in std_logic_vector(g_WB_DATA_WIDTH-1 downto 0);
memAckWB_i : in std_logic; memAckWB_i : in std_logic;
locDataOut_o : out std_logic_vector(63 downto 0); locDataOut_o : out std_logic_vector(31 downto 0);
memAckWb_o : out std_logic; memAckWb_o : out std_logic;
err_o : out std_logic; err_o : out std_logic;
rty_o : out std_logic; rty_o : out std_logic;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment