1
0
mirror of synced 2026-02-27 08:49:18 +00:00
This commit is contained in:
Romain Dolbeau
2021-01-09 16:05:10 -05:00
parent 91b6e04f92
commit d2cc1412c2

View File

@@ -187,31 +187,31 @@ ENTITY SBusFSM is
CONSTANT REG_OFFSET_AES128_OUT4 : std_logic_vector(OFFSET_HIGH downto OFFSET_LOW) := conv_std_logic_vector(REG_INDEX_AES128_OUT4*4, OFFSET_LENGTH);
constant c_CLKS_PER_BIT : integer := 417; -- 48M/115200
-- constant c_CLKS_PER_BIT : integer := 50; -- 5.76M/115200
END ENTITY;
-- constant c_CLKS_PER_BIT : integer := 50; -- 5.76M/115200
END ENTITY;
ARCHITECTURE RTL OF SBusFSM IS
TYPE SBus_States IS (
-- after reset, move to Idle
SBus_Start,
SBus_Start,
-- waiting, all outputs should be set Z
-- includes the detection logic for the next cycle
-- also capture PA immediately (useful for address wrapping,
-- might become useful for extended transfer)
SBus_Idle,
SBus_Idle,
-- cycle during which ACK is IDLE to end SBus Cycle
-- also check for deasserting of AS
SBus_Slave_Ack_Reg_Write,
SBus_Slave_Ack_Reg_Write,
-- cycle after ACK is idle, everything goes back to Z before Idle
-- also check for deasserting of AS
SBus_Slave_Ack_Reg_Write_Final,
SBus_Slave_Ack_Reg_Write_Final,
-- cycle(s) with data acquired from the bus & ACK of the next acquisition
-- between 1 and 16 words (so 1 to 16 cycles in the state)
SBus_Slave_Ack_Reg_Write_Burst,
SBus_Slave_Ack_Reg_Write_Burst,
-- cycle we put the data on the bus when reading from Prom
-- also ACK goes to idle
-- byte-wide
SBus_Slave_Ack_Read_Prom_Byte,
SBus_Slave_Ack_Read_Prom_Byte,
-- cycle we put the data on the bus when reading from Prom
-- also ACK goes to idle
-- half-word-wide
@@ -219,11 +219,11 @@ ARCHITECTURE RTL OF SBusFSM IS
-- cycle(s) we put the data on the bus when reading from Prom
-- also ACK the next word we will put, or goes to idle for last
-- word-wide, burst from 1 to 16
SBus_Slave_Ack_Read_Prom_Burst,
SBus_Slave_Ack_Read_Prom_Burst,
-- cycle we put the data on the bus when reading from registers
-- also ACK goes to idle
-- byte-wide
SBus_Slave_Ack_Read_Reg_Byte,
SBus_Slave_Ack_Read_Reg_Byte,
-- cycle we put the data on the bus when reading from registers
-- also ACK goes to idle
-- half-word-wide
@@ -231,26 +231,26 @@ ARCHITECTURE RTL OF SBusFSM IS
-- cycle(s) we put the data on the bus when reading from registers
-- also ACK the next word we will put, or goes to idle for last
-- word-wide, burst from 1 to 16
SBus_Slave_Ack_Read_Reg_Burst,
SBus_Slave_Ack_Read_Reg_Burst,
-- last cycle where the master read our data from the bus
-- everything goes to Z before Idle
SBus_Slave_Do_Read,
SBus_Slave_Do_Read,
-- delay cycle to assert late error
SBus_Slave_Delay_Error,
SBus_Slave_Delay_Error,
-- cycle where master detect the error (ACK or late)
-- everything goes to Z before Idle
SBus_Slave_Error,
SBus_Slave_Error,
-- SBus_Slave_Heartbeat,
SBus_Master_Translation,
SBus_Master_Read,
SBus_Master_Read_Ack,
SBus_Master_Read_Finish,
SBus_Master_Write,
SBus_Master_Write_Final
);
SBus_Master_Translation,
SBus_Master_Read,
SBus_Master_Read_Ack,
SBus_Master_Read_Finish,
SBus_Master_Write,
SBus_Master_Write_Final
);
TYPE Uart_States IS ( UART_IDLE, UART_WAITING );
TYPE AES_States IS ( AES_IDLE, AES_INIT1, AES_CRYPT1, AES_CRYPT2 );
SIGNAL State : SBus_States := SBus_Start;
SIGNAL Uart_State : Uart_States := UART_IDLE;
SIGNAL AES_State : AES_States := AES_IDLE;
@@ -322,58 +322,58 @@ ARCHITECTURE RTL OF SBusFSM IS
pure function REG_OFFSET_IS_GCMINPUT(value : in std_logic_vector(OFFSET_HIGH downto OFFSET_LOW)) return boolean is
begin
return (REG_OFFSET_GCM_INPUT1 = value) OR
(REG_OFFSET_GCM_INPUT2 = value) OR
(REG_OFFSET_GCM_INPUT3 = value) OR
(REG_OFFSET_GCM_INPUT4 = value);
(REG_OFFSET_GCM_INPUT2 = value) OR
(REG_OFFSET_GCM_INPUT3 = value) OR
(REG_OFFSET_GCM_INPUT4 = value);
end function;
pure function REG_OFFSET_IS_GCMH (value : in std_logic_vector(OFFSET_HIGH downto OFFSET_LOW)) return boolean is
begin
return (REG_OFFSET_GCM_H1 = value) OR
(REG_OFFSET_GCM_H2 = value) OR
(REG_OFFSET_GCM_H3 = value) OR
(REG_OFFSET_GCM_H4 = value);
(REG_OFFSET_GCM_H2 = value) OR
(REG_OFFSET_GCM_H3 = value) OR
(REG_OFFSET_GCM_H4 = value);
end function;
pure function REG_OFFSET_IS_GCMC (value : in std_logic_vector(OFFSET_HIGH downto OFFSET_LOW)) return boolean is
begin
return (REG_OFFSET_GCM_C1 = value) OR
(REG_OFFSET_GCM_C2 = value) OR
(REG_OFFSET_GCM_C3 = value) OR
(REG_OFFSET_GCM_C4 = value);
(REG_OFFSET_GCM_C2 = value) OR
(REG_OFFSET_GCM_C3 = value) OR
(REG_OFFSET_GCM_C4 = value);
end function;
pure function REG_OFFSET_IS_ANYDMA(value : in std_logic_vector(OFFSET_HIGH downto OFFSET_LOW)) return boolean is
begin
return (REG_OFFSET_DMA_ADDR = value) OR
(REG_OFFSET_DMA_CTRL = value) OR
(REG_OFFSET_DMAW_ADDR = value) OR
(REG_OFFSET_DMAW_CTRL = value);
(REG_OFFSET_DMA_CTRL = value) OR
(REG_OFFSET_DMAW_ADDR = value) OR
(REG_OFFSET_DMAW_CTRL = value);
end function;
pure function REG_OFFSET_IS_AESKEY(value : in std_logic_vector(OFFSET_HIGH downto OFFSET_LOW)) return boolean is
begin
return (REG_OFFSET_AES128_KEY1 = value) OR
(REG_OFFSET_AES128_KEY2 = value) OR
(REG_OFFSET_AES128_KEY3 = value) OR
(REG_OFFSET_AES128_KEY4 = value) OR
(REG_OFFSET_AES128_KEY5 = value) OR
(REG_OFFSET_AES128_KEY6 = value) OR
(REG_OFFSET_AES128_KEY7 = value) OR
(REG_OFFSET_AES128_KEY8 = value);
(REG_OFFSET_AES128_KEY2 = value) OR
(REG_OFFSET_AES128_KEY3 = value) OR
(REG_OFFSET_AES128_KEY4 = value) OR
(REG_OFFSET_AES128_KEY5 = value) OR
(REG_OFFSET_AES128_KEY6 = value) OR
(REG_OFFSET_AES128_KEY7 = value) OR
(REG_OFFSET_AES128_KEY8 = value);
end function;
pure function REG_OFFSET_IS_AESDATA(value : in std_logic_vector(OFFSET_HIGH downto OFFSET_LOW)) return boolean is
begin
return (REG_OFFSET_AES128_DATA1 = value) OR
(REG_OFFSET_AES128_DATA2 = value) OR
(REG_OFFSET_AES128_DATA3 = value) OR
(REG_OFFSET_AES128_DATA4 = value);
(REG_OFFSET_AES128_DATA2 = value) OR
(REG_OFFSET_AES128_DATA3 = value) OR
(REG_OFFSET_AES128_DATA4 = value);
end function;
pure function REG_OFFSET_IS_AESOUT(value : in std_logic_vector(OFFSET_HIGH downto OFFSET_LOW)) return boolean is
begin
return (REG_OFFSET_AES128_OUT1 = value) OR
(REG_OFFSET_AES128_OUT2 = value) OR
(REG_OFFSET_AES128_OUT3 = value) OR
(REG_OFFSET_AES128_OUT4 = value);
(REG_OFFSET_AES128_OUT2 = value) OR
(REG_OFFSET_AES128_OUT3 = value) OR
(REG_OFFSET_AES128_OUT4 = value);
end function;
pure function REG_OFFSET_IS_ANYGCM(value : in std_logic_vector(OFFSET_HIGH downto OFFSET_LOW)) return boolean is
@@ -384,25 +384,25 @@ ARCHITECTURE RTL OF SBusFSM IS
pure function REG_OFFSET_IS_ANYAES(value : in std_logic_vector(OFFSET_HIGH downto OFFSET_LOW)) return boolean is
begin
return REG_OFFSET_IS_AESKEY(value) OR REG_OFFSET_IS_AESDATA(value) OR REG_OFFSET_IS_AESOUT(value) OR
(REG_OFFSET_AES128_CTRL = value);
(REG_OFFSET_AES128_CTRL = value);
end function;
pure function REG_OFFSET_IS_ANYREAD(value : in std_logic_vector(OFFSET_HIGH downto OFFSET_LOW)) return boolean is
begin
return REG_OFFSET_IS_GCMC(value) OR
REG_OFFSET_IS_AESOUT(value) OR
(REG_OFFSET_DMA_CTRL = value) OR
(REG_OFFSET_DMAW_CTRL = value) OR
(REG_OFFSET_AES128_CTRL = value)
;
REG_OFFSET_IS_AESOUT(value) OR
(REG_OFFSET_DMA_CTRL = value) OR
(REG_OFFSET_DMAW_CTRL = value) OR
(REG_OFFSET_AES128_CTRL = value)
;
end function;
pure function REG_OFFSET_IS_ANYWRITE(value : in std_logic_vector(OFFSET_HIGH downto OFFSET_LOW)) return boolean is
begin
return (REG_OFFSET_LED = value) OR
REG_OFFSET_IS_ANYGCM(value) OR
REG_OFFSET_IS_ANYAES(value) OR
REG_OFFSET_IS_ANYDMA(value);
REG_OFFSET_IS_ANYGCM(value) OR
REG_OFFSET_IS_ANYAES(value) OR
REG_OFFSET_IS_ANYDMA(value);
end function;
pure function REG_OFFSET_IS_ANY(value : in std_logic_vector(OFFSET_HIGH downto OFFSET_LOW)) return boolean is
@@ -418,36 +418,36 @@ ARCHITECTURE RTL OF SBusFSM IS
pure function SIZ_IS_WORD(value : in std_logic_vector(2 downto 0)) return boolean is
begin
return (SIZ_WORD = value) OR
(SIZ_BURST2 = value) OR
(SIZ_BURST4 = value) OR
(SIZ_BURST8 = value) OR
(SIZ_BURST16 = value);
(SIZ_BURST2 = value) OR
(SIZ_BURST4 = value) OR
(SIZ_BURST8 = value) OR
(SIZ_BURST16 = value);
end function;
pure function SIZ_TO_BURSTSIZE(value : in std_logic_vector(2 downto 0)) return integer is
begin
case value is
WHEN SIZ_WORD => return 1;
WHEN SIZ_BURST2 => return 2;
WHEN SIZ_BURST4 => return 4;
WHEN SIZ_BURST8 => return 8;
WHEN SIZ_BURST16 => return 16;
WHEN OTHERS => return 1; -- should not happen
end case;
case value is
WHEN SIZ_WORD => return 1;
WHEN SIZ_BURST2 => return 2;
WHEN SIZ_BURST4 => return 4;
WHEN SIZ_BURST8 => return 8;
WHEN SIZ_BURST16 => return 16;
WHEN OTHERS => return 1; -- should not happen
end case;
end function;
pure function INDEX_WITH_WRAP(counter: in integer;
limit: in integer;
value : in std_logic_vector(3 downto 0)) return std_logic_vector is
limit: in integer;
value : in std_logic_vector(3 downto 0)) return std_logic_vector is
begin
case limit is
WHEN 1 => return value(3 downto 0);
WHEN 2 => return value(3 downto 1) & conv_std_logic_vector(conv_integer(value(0)) +counter,1);
WHEN 4 => return value(3 downto 2) & conv_std_logic_vector(conv_integer(value(1 downto 0))+counter,2);
WHEN 8 => return value(3 downto 3) & conv_std_logic_vector(conv_integer(value(2 downto 0))+counter,3);
WHEN 16 => return conv_std_logic_vector(conv_integer(value(3 downto 0))+counter,4);
WHEN others => return value(3 downto 0); -- should not happen
end case;
case limit is
WHEN 1 => return value(3 downto 0);
WHEN 2 => return value(3 downto 1) & conv_std_logic_vector(conv_integer(value(0)) +counter,1);
WHEN 4 => return value(3 downto 2) & conv_std_logic_vector(conv_integer(value(1 downto 0))+counter,2);
WHEN 8 => return value(3 downto 3) & conv_std_logic_vector(conv_integer(value(2 downto 0))+counter,3);
WHEN 16 => return conv_std_logic_vector(conv_integer(value(3 downto 0))+counter,4);
WHEN others => return value(3 downto 0); -- should not happen
end case;
end function;
--COMPONENT LedHandler
@@ -485,11 +485,11 @@ ARCHITECTURE RTL OF SBusFSM IS
END COMPONENT;
COMPONENT mastrovito_V2_multiplication
PORT(
a : IN std_logic_vector(M-1 downto 0);
b : IN std_logic_vector(M-1 downto 0);
c : OUT std_logic_vector(M-1 downto 0)
);
PORT(
a : IN std_logic_vector(M-1 downto 0);
b : IN std_logic_vector(M-1 downto 0);
c : OUT std_logic_vector(M-1 downto 0)
);
END COMPONENT;
--Inputs
SIGNAL mas_a : std_logic_vector(M-1 downto 0) := (others=>'0');
@@ -519,7 +519,7 @@ ARCHITECTURE RTL OF SBusFSM IS
dout : out STD_LOGIC_VECTOR ( 7 downto 0 );
full : out STD_LOGIC;
empty : out STD_LOGIC
);
);
end component;
component fifo_generator_to_aes is
Port (
@@ -531,7 +531,7 @@ ARCHITECTURE RTL OF SBusFSM IS
dout : out STD_LOGIC_VECTOR ( 260 downto 0 );
full : out STD_LOGIC;
empty : out STD_LOGIC
);
);
end component;
component fifo_generator_from_aes is
Port (
@@ -543,7 +543,7 @@ ARCHITECTURE RTL OF SBusFSM IS
dout : out STD_LOGIC_VECTOR ( 127 downto 0 );
full : out STD_LOGIC;
empty : out STD_LOGIC
);
);
end component;
component fifo_generator_from_strng is
Port (
@@ -555,7 +555,7 @@ ARCHITECTURE RTL OF SBusFSM IS
dout : out STD_LOGIC_VECTOR ( 31 downto 0 );
full : out STD_LOGIC;
empty : out STD_LOGIC
);
);
end component;
component uart_tx is
@@ -578,23 +578,23 @@ ARCHITECTURE RTL OF SBusFSM IS
-- end component clk_wiz_0;
component clk_wiz_aes is
port(clk_out1 : out std_logic;
clk_in1 : in std_logic);
port(clk_out1 : out std_logic;
clk_in1 : in std_logic);
end component clk_wiz_aes;
component aes_wrapper is
port (
aes_wrapper_rst : in std_logic;
aes_wrapper_clk : in std_logic;
port (
aes_wrapper_rst : in std_logic;
aes_wrapper_clk : in std_logic;
-- iskey?, keylen, encdec, cbc, data (256 or 128 + 128)
input_fifo_out : in std_logic_vector(260 downto 0);
input_fifo_empty: in std_logic;
input_fifo_rd_en : out std_logic;
input_fifo_out : in std_logic_vector(260 downto 0);
input_fifo_empty: in std_logic;
input_fifo_rd_en : out std_logic;
-- data (128)
output_fifo_in : out std_logic_vector(127 downto 0);
output_fifo_full : in std_logic;
output_fifo_wr_en : out std_logic
);
output_fifo_in : out std_logic_vector(127 downto 0);
output_fifo_full : in std_logic;
output_fifo_wr_en : out std_logic
);
end component aes_wrapper;
-- component strng_wrapper is
@@ -608,13 +608,13 @@ ARCHITECTURE RTL OF SBusFSM IS
-- end component strng_wrapper;
component trivium_wrapper is
port (
trivium_wrapper_rst : in std_logic;
trivium_wrapper_clk : in std_logic;
output_fifo_in : out std_logic_vector(31 downto 0);
output_fifo_full : in std_logic;
output_fifo_wr_en : out std_logic
);
port (
trivium_wrapper_rst : in std_logic;
trivium_wrapper_clk : in std_logic;
output_fifo_in : out std_logic_vector(31 downto 0);
output_fifo_full : in std_logic;
output_fifo_wr_en : out std_logic
);
end component trivium_wrapper;
PROCEDURE SBus_Set_Default(
@@ -660,23 +660,23 @@ BEGIN
IO => SBUS_3V3_D(i), -- Buffer INOUT PORT (connect directly to top-level PORT)
I => BUF_DATA_O(i), -- Buffer input (warning - data going to SBUS so O)
T => DATA_T -- 3-state enable input, high=input, low=output
-- DATA_T is 1 by default, so input from the SBus (e.g. during slave *write* cycle)
-- DATA_T should be set to 1 during slave *read* cycle, when we send data to the SBus (IOBUS is an output)
-- DATA_T is 1 by default, so input from the SBus (e.g. during slave *write* cycle)
-- DATA_T should be set to 1 during slave *read* cycle, when we send data to the SBus (IOBUS is an output)
);
end generate GENDATABUF;
IOBpprd : IOBUF GENERIC MAP(DRIVE => 12, IOSTANDARD => "DEFAULT", SLEW => "SLOW")
PORT MAP(O => BUF_PPRD_I, IO => SBUS_3V3_PPRD, I => BUF_PPRD_O, T => SM_T);
PORT MAP(O => BUF_PPRD_I, IO => SBUS_3V3_PPRD, I => BUF_PPRD_O, T => SM_T);
GENSIZBUF: for i IN 0 to 2 generate
IOBsiz : IOBUF GENERIC MAP(DRIVE => 12, IOSTANDARD => "DEFAULT", SLEW => "SLOW")
PORT MAP (O => BUF_SIZ_I(i), IO => SBUS_3V3_SIZ(i), I => BUF_SIZ_O(i), T => SM_T);
PORT MAP (O => BUF_SIZ_I(i), IO => SBUS_3V3_SIZ(i), I => BUF_SIZ_O(i), T => SM_T);
end generate GENSIZBUF;
GENACKBUF: for i IN 0 to 2 generate
IOBacks : IOBUF GENERIC MAP(DRIVE => 12, IOSTANDARD => "DEFAULT", SLEW => "SLOW")
PORT MAP (O => BUF_ACKs_I(i), IO => SBUS_3V3_ACKs(i), I => BUF_ACKs_O(i), T => SMs_T);
PORT MAP (O => BUF_ACKs_I(i), IO => SBUS_3V3_ACKs(i), I => BUF_ACKs_O(i), T => SMs_T);
end generate GENACKBUF;
IOBerrs : IOBUF GENERIC MAP(DRIVE => 12, IOSTANDARD => "DEFAULT", SLEW => "SLOW")
PORT MAP(O => BUF_ERRs_I, IO => SBUS_3V3_ERRs, I => BUF_ERRs_O, T => SMs_T);
PORT MAP(O => BUF_ERRs_I, IO => SBUS_3V3_ERRs, I => BUF_ERRs_O, T => SMs_T);
--label_led_handler: LedHandler PORT MAP( l_ifclk => SBUS_3V3_CLK, l_LED_RESET => LED_RESET, l_LED_DATA => LED_DATA, l_LED0 => LED0, l_LED1 => LED1, l_LED2 => LED2, l_LED3 => LED3 );
label_led_handler: LedHandler PORT MAP( l_ifclk => SBUS_3V3_CLK, l_LED_RESET => LED_RESET, l_LED_DATA => REGISTERS(REG_INDEX_LED), l_LED0 => LED0, l_LED1 => LED1, l_LED2 => LED2, l_LED3 => LED3,
@@ -687,17 +687,17 @@ BEGIN
--label_mas: mastrovito_V2_multiplication PORT MAP( a => mas_a, b => mas_b, c => mas_c );
label_fifo_uart: fifo_generator_uart port map(rst => fifo_rst, wr_clk => SBUS_3V3_CLK, rd_clk => fxclk_in,
din => fifo_din, wr_en => fifo_wr_en, rd_en => fifo_rd_en,
dout => fifo_dout, full => fifo_full, empty => fifo_empty);
din => fifo_din, wr_en => fifo_wr_en, rd_en => fifo_rd_en,
dout => fifo_dout, full => fifo_full, empty => fifo_empty);
label_fifo_toaes: fifo_generator_to_aes port map(wr_clk => SBUS_3V3_CLK, rd_clk => aes_clk_out,
din => fifo_toaes_din, wr_en => fifo_toaes_wr_en, rd_en => fifo_toaes_rd_en,
dout => fifo_toaes_dout, full => fifo_toaes_full, empty => fifo_toaes_empty);
din => fifo_toaes_din, wr_en => fifo_toaes_wr_en, rd_en => fifo_toaes_rd_en,
dout => fifo_toaes_dout, full => fifo_toaes_full, empty => fifo_toaes_empty);
label_fifo_fromaes: fifo_generator_from_aes port map(wr_clk => aes_clk_out, rd_clk => SBUS_3V3_CLK,
din => fifo_fromaes_din, wr_en => fifo_fromaes_wr_en, rd_en => fifo_fromaes_rd_en,
dout => fifo_fromaes_dout, full => fifo_fromaes_full, empty => fifo_fromaes_empty);
din => fifo_fromaes_din, wr_en => fifo_fromaes_wr_en, rd_en => fifo_fromaes_rd_en,
dout => fifo_fromaes_dout, full => fifo_fromaes_full, empty => fifo_fromaes_empty);
label_fifo_fromstrng: fifo_generator_from_strng port map(wr_clk => aes_clk_out, rd_clk => SBUS_3V3_CLK,
din => fifo_fromstrng_din, wr_en => fifo_fromstrng_wr_en, rd_en => fifo_fromstrng_rd_en,
dout => fifo_fromstrng_dout, full => fifo_fromstrng_full, empty => fifo_fromstrng_empty);
din => fifo_fromstrng_din, wr_en => fifo_fromstrng_wr_en, rd_en => fifo_fromstrng_rd_en,
dout => fifo_fromstrng_dout, full => fifo_fromstrng_full, empty => fifo_fromstrng_empty);
label_aes_wrapper: aes_wrapper port map(
aes_wrapper_rst => aes_wrapper_rst,
aes_wrapper_clk => aes_clk_out,
@@ -708,7 +708,7 @@ BEGIN
output_fifo_full => fifo_fromaes_full,
output_fifo_wr_en => fifo_fromaes_wr_en
);
-- label_strng_wrapper: strng_wrapper port map (
-- strng_wrapper_rst => aes_wrapper_rst,
-- strng_wrapper_clk => aes_clk_out,
@@ -741,17 +741,17 @@ BEGIN
);
PROCESS (SBUS_3V3_CLK, SBUS_3V3_RSTs)
variable do_gcm : boolean := false;
variable finish_gcm : boolean := false;
variable last_pa : std_logic_vector(ADDR_PHYS_HIGH downto ADDR_PHYS_LOW) := (others => '0');
variable BURST_COUNTER : integer range 0 to 15 := 0;
variable BURST_LIMIT : integer range 1 to 16 := 1;
variable BURST_INDEX : integer range 0 to 15;
variable seen_ack : boolean := false;
variable dma_write : boolean := false;
variable dma_ctrl_idx : integer range 0 to 7;
variable dma_addr_idx : integer range 0 to 7;
variable reg_bank : integer range 0 to 1 := 0;
variable do_gcm : boolean := false;
variable finish_gcm : boolean := false;
variable last_pa : std_logic_vector(ADDR_PHYS_HIGH downto ADDR_PHYS_LOW) := (others => '0');
variable BURST_COUNTER : integer range 0 to 15 := 0;
variable BURST_LIMIT : integer range 1 to 16 := 1;
variable BURST_INDEX : integer range 0 to 15;
variable seen_ack : boolean := false;
variable dma_write : boolean := false;
variable dma_ctrl_idx : integer range 0 to 7;
variable dma_addr_idx : integer range 0 to 7;
variable reg_bank : integer range 0 to 1 := 0;
BEGIN
IF (SBUS_3V3_RSTs = '0') THEN
State <= SBus_Start;
@@ -800,7 +800,7 @@ BEGIN
State <= SBus_Slave_Ack_Read_Reg_Burst;
ELSIF ((last_pa(ADDR_PFX_HIGH downto ADDR_PFX_LOW) = REGTRNG_ADDR_PFX) AND REG_OFFSET_IS_ANYTRNGREAD(last_pa(OFFSET_HIGH downto OFFSET_LOW))
-- and (fifo_fromstrng_empty = '0')
) then
) then
-- 32 bits read from aligned memory IN REG TRNG space ------------------------------------
-- if FIFO is empty, will fallback to returning an error...
BUF_ACKs_O <= ACK_WORD;
@@ -874,16 +874,16 @@ BEGIN
LED_RESET <= '1'; -- reset led cycle
--DATA_T <= '1'; -- set buffer as input
CASE last_pa(1 downto 0) IS
WHEN "00" =>
REGISTERS(REG_INDEX_LED)(31 downto 24) <= BUF_DATA_I(31 downto 24);
WHEN "01" =>
REGISTERS(REG_INDEX_LED)(23 downto 16) <= BUF_DATA_I(31 downto 24);
WHEN "10" =>
REGISTERS(REG_INDEX_LED)(15 downto 8) <= BUF_DATA_I(31 downto 24);
WHEN "11" =>
REGISTERS(REG_INDEX_LED)(7 downto 0) <= BUF_DATA_I(31 downto 24);
WHEN OTHERS =>
-- TODO: FIXME, probably should generate an error
WHEN "00" =>
REGISTERS(REG_INDEX_LED)(31 downto 24) <= BUF_DATA_I(31 downto 24);
WHEN "01" =>
REGISTERS(REG_INDEX_LED)(23 downto 16) <= BUF_DATA_I(31 downto 24);
WHEN "10" =>
REGISTERS(REG_INDEX_LED)(15 downto 8) <= BUF_DATA_I(31 downto 24);
WHEN "11" =>
REGISTERS(REG_INDEX_LED)(7 downto 0) <= BUF_DATA_I(31 downto 24);
WHEN OTHERS =>
-- TODO: FIXME, probably should generate an error
END CASE;
BUF_ACKs_O <= ACK_BYTE; -- acknowledge the Byte
BUF_ERRs_O <= '1'; -- no late error
@@ -901,7 +901,7 @@ BEGIN
(REGISTERS(REG_INDEX_DMAW_CTRL)(DMA_CTRL_START_IDX)='1' AND
REGISTERS(REG_INDEX_DMAW_CTRL)(DMA_CTRL_BUSY_IDX)='0' AND
REGISTERS(REG_INDEX_DMAW_CTRL)(DMA_CTRL_ERR_IDX)='0')
)) then
)) then
-- we have a DMA request pending and not been granted the bus
IF ((REGISTERS(REG_INDEX_DMA_CTRL)(DMA_CTRL_GCM_IDX) = '1') OR
((REGISTERS(REG_INDEX_DMA_CTRL)(DMA_CTRL_AES_IDX) = '1') AND
@@ -910,7 +910,7 @@ BEGIN
((REGISTERS(REG_INDEX_DMAW_CTRL)(DMA_CTRL_AES_IDX) = '1') AND
(REGISTERS(REG_INDEX_AES128_CTRL) = 0) AND
(fifo_fromaes_empty = '0'))
) THEN
) THEN
fifo_wr_en <= '1'; fifo_din <= x"61"; -- "a"
-- GCM is always available (1 cycle)
-- for AES don't request the bus unless the AES block is free
@@ -921,48 +921,48 @@ BEGIN
fifo_wr_en <= '1'; fifo_din <= x"7a"; -- "z"
END IF;
ELSIF (SBUS_3V3_BGs='0') THEN
fifo_wr_en <= '1'; fifo_din <= x"62"; -- "b"
fifo_wr_en <= '1'; fifo_din <= x"62"; -- "b"
-- we were granted the bus for DMA
SBUS_3V3_BRs <= '1'; -- relinquish the request (required)
DATA_T <= '0'; -- set data buffer as output
SM_T <= '0'; -- PPRD, SIZ becomes output (master mode)
SMs_T <= '1';
IF ((REGISTERS(REG_INDEX_DMAW_CTRL)(DMA_CTRL_START_IDX) = '1') AND
(fifo_fromaes_empty = '0')) THEN
dma_write := true;
dma_ctrl_idx := REG_INDEX_DMAW_CTRL;
dma_addr_idx := REG_INDEX_DMAW_ADDR;
BUF_DATA_O <= REGISTERS(REG_INDEX_DMAW_ADDR); -- virt address
BUF_PPRD_O <= '0'; -- writing to slave
REGISTERS(REG_INDEX_AES128_OUT1) <= fifo_fromaes_dout(127 downto 96);
REGISTERS(REG_INDEX_AES128_OUT2) <= fifo_fromaes_dout( 95 downto 64);
REGISTERS(REG_INDEX_AES128_OUT3) <= fifo_fromaes_dout( 63 downto 32);
REGISTERS(REG_INDEX_AES128_OUT4) <= fifo_fromaes_dout( 31 downto 0);
fifo_fromaes_rd_en <= '1';
ELSE
dma_write := false;
dma_ctrl_idx := REG_INDEX_DMA_CTRL;
dma_addr_idx := REG_INDEX_DMA_ADDR;
BUF_DATA_O <= REGISTERS(REG_INDEX_DMA_ADDR); -- virt address
BUF_PPRD_O <= '1'; -- reading from slave
END IF;
SBUS_3V3_BRs <= '1'; -- relinquish the request (required)
DATA_T <= '0'; -- set data buffer as output
SM_T <= '0'; -- PPRD, SIZ becomes output (master mode)
SMs_T <= '1';
IF ((REGISTERS(REG_INDEX_DMAW_CTRL)(DMA_CTRL_START_IDX) = '1') AND
(fifo_fromaes_empty = '0')) THEN
dma_write := true;
dma_ctrl_idx := REG_INDEX_DMAW_CTRL;
dma_addr_idx := REG_INDEX_DMAW_ADDR;
BUF_DATA_O <= REGISTERS(REG_INDEX_DMAW_ADDR); -- virt address
BUF_PPRD_O <= '0'; -- writing to slave
REGISTERS(REG_INDEX_AES128_OUT1) <= fifo_fromaes_dout(127 downto 96);
REGISTERS(REG_INDEX_AES128_OUT2) <= fifo_fromaes_dout( 95 downto 64);
REGISTERS(REG_INDEX_AES128_OUT3) <= fifo_fromaes_dout( 63 downto 32);
REGISTERS(REG_INDEX_AES128_OUT4) <= fifo_fromaes_dout( 31 downto 0);
fifo_fromaes_rd_en <= '1';
ELSE
dma_write := false;
dma_ctrl_idx := REG_INDEX_DMA_CTRL;
dma_addr_idx := REG_INDEX_DMA_ADDR;
BUF_DATA_O <= REGISTERS(REG_INDEX_DMA_ADDR); -- virt address
BUF_PPRD_O <= '1'; -- reading from slave
END IF;
-- IF (conv_integer(REGISTERS(REG_INDEX_DMA_CTRL)(11 downto 0)) >= 3) THEN
-- BUF_SIZ_O <= SIZ_BURST16;
-- BURST_LIMIT := 16;
-- ELS
IF ((dma_write = false) AND
(REGISTERS(dma_ctrl_idx)(DMA_CTRL_GCM_IDX) = '1') AND
conv_integer(REGISTERS(dma_ctrl_idx)(11 downto 0)) >= 1) THEN
IF ((dma_write = false) AND
(REGISTERS(dma_ctrl_idx)(DMA_CTRL_GCM_IDX) = '1') AND
conv_integer(REGISTERS(dma_ctrl_idx)(11 downto 0)) >= 1) THEN
-- 32 bytes burst only for GCM ATM (bit 27)
BUF_SIZ_O <= SIZ_BURST8;
BURST_LIMIT := 8;
ELSE
BUF_SIZ_O <= SIZ_BURST4;
BURST_LIMIT := 4;
END IF;
-- REGISTERS(REG_INDEX_LED) <= REGISTERS(REG_INDEX_DMA_ADDR); -- show the virt on the LEDs
BURST_COUNTER := 0;
State <= SBus_Master_Translation;
BUF_SIZ_O <= SIZ_BURST8;
BURST_LIMIT := 8;
ELSE
BUF_SIZ_O <= SIZ_BURST4;
BURST_LIMIT := 4;
END IF;
-- REGISTERS(REG_INDEX_LED) <= REGISTERS(REG_INDEX_DMA_ADDR); -- show the virt on the LEDs
BURST_COUNTER := 0;
State <= SBus_Master_Translation;
-- ERROR ERROR ERROR
ELSIF SBUS_3V3_SELs='0' AND SBUS_3V3_ASs='0' AND BUF_SIZ_I /= SIZ_WORD THEN
SMs_T <= '0'; -- ACKs/ERRs buffer in slave mode/output
@@ -1144,14 +1144,14 @@ BEGIN
fifo_din <= x"2F"; -- "/"
REGISTERS(dma_ctrl_idx)(DMA_CTRL_ERR_IDX) <= '1';
SBus_Set_Default(SBUS_3V3_INT1s, SBUS_3V3_INT7s,
SBUS_DATA_OE_LED, SBUS_DATA_OE_LED_2,
p_addr, DATA_T, SM_T, SMs_T, LED_RESET);
SBUS_DATA_OE_LED, SBUS_DATA_OE_LED_2,
p_addr, DATA_T, SM_T, SMs_T, LED_RESET);
State <= SBus_Idle;
ELSIF (BUF_ACKs_I = ACK_RERUN) THEN
fifo_din <= x"5c"; -- "\"
SBus_Set_Default(SBUS_3V3_INT1s, SBUS_3V3_INT7s,
SBUS_DATA_OE_LED, SBUS_DATA_OE_LED_2,
p_addr, DATA_T, SM_T, SMs_T, LED_RESET);
SBUS_DATA_OE_LED, SBUS_DATA_OE_LED_2,
p_addr, DATA_T, SM_T, SMs_T, LED_RESET);
State <= SBus_Idle;
ELSIF (BUF_ACKs_I = ACK_IDLE) THEN
IF (dma_write = false) THEN
@@ -1164,8 +1164,8 @@ BEGIN
-- oups, we lost our bus access without error ?!?
fifo_din <= x"21"; -- "!"
SBus_Set_Default(SBUS_3V3_INT1s, SBUS_3V3_INT7s,
SBUS_DATA_OE_LED, SBUS_DATA_OE_LED_2,
p_addr, DATA_T, SM_T, SMs_T, LED_RESET);
SBUS_DATA_OE_LED, SBUS_DATA_OE_LED_2,
p_addr, DATA_T, SM_T, SMs_T, LED_RESET);
State <= SBus_Idle;
END IF;
@@ -1223,30 +1223,30 @@ BEGIN
-- REGISTERS(REG_INDEX_AES128_CTRL) <= x"88000000"; -- request to start a CBC block
-- enqueue the block in the AES FIFO
IF (REGISTERS(dma_ctrl_idx)(DMA_CTRL_CBC_IDX) = '0') THEN
fifo_toaes_din <=
'0' & -- !iskey
'0' & -- keylen, ignored
(NOT REGISTERS(dma_ctrl_idx)(DMA_CTRL_DEC_IDX)) & -- encdec
'0' & -- cbc
(NOT REGISTERS(dma_ctrl_idx)(DMA_CTRL_DEC_IDX)) & -- internal cbc; HACKISH - enable for encrypt
x"00000000000000000000000000000000" &
REGISTERS(REG_INDEX_AES128_DATA1) & REGISTERS(REG_INDEX_AES128_DATA2) &
REGISTERS(REG_INDEX_AES128_DATA3) & BUF_DATA_I;
fifo_toaes_wr_en <= '1';
fifo_toaes_din <=
'0' & -- !iskey
'0' & -- keylen, ignored
(NOT REGISTERS(dma_ctrl_idx)(DMA_CTRL_DEC_IDX)) & -- encdec
'0' & -- cbc
(NOT REGISTERS(dma_ctrl_idx)(DMA_CTRL_DEC_IDX)) & -- internal cbc; HACKISH - enable for encrypt
x"00000000000000000000000000000000" &
REGISTERS(REG_INDEX_AES128_DATA1) & REGISTERS(REG_INDEX_AES128_DATA2) &
REGISTERS(REG_INDEX_AES128_DATA3) & BUF_DATA_I;
fifo_toaes_wr_en <= '1';
ELSE
fifo_toaes_din <=
'0' & -- !iskey
'0' & -- keylen, ignored
(NOT REGISTERS(dma_ctrl_idx)(DMA_CTRL_DEC_IDX)) & -- encdec
'0' & -- cbc
'0' & -- internal cbc
x"00000000000000000000000000000000" &
(REGISTERS(REG_INDEX_AES128_DATA1) XOR REGISTERS(REG_INDEX_AES128_OUT1)) &
(REGISTERS(REG_INDEX_AES128_DATA2) XOR REGISTERS(REG_INDEX_AES128_OUT2)) &
(REGISTERS(REG_INDEX_AES128_DATA3) XOR REGISTERS(REG_INDEX_AES128_OUT3)) &
(BUF_DATA_I XOR REGISTERS(REG_INDEX_AES128_OUT4));
fifo_toaes_wr_en <= '1';
REGISTERS(dma_ctrl_idx)(DMA_CTRL_CBC_IDX) <= '0';
fifo_toaes_din <=
'0' & -- !iskey
'0' & -- keylen, ignored
(NOT REGISTERS(dma_ctrl_idx)(DMA_CTRL_DEC_IDX)) & -- encdec
'0' & -- cbc
'0' & -- internal cbc
x"00000000000000000000000000000000" &
(REGISTERS(REG_INDEX_AES128_DATA1) XOR REGISTERS(REG_INDEX_AES128_OUT1)) &
(REGISTERS(REG_INDEX_AES128_DATA2) XOR REGISTERS(REG_INDEX_AES128_OUT2)) &
(REGISTERS(REG_INDEX_AES128_DATA3) XOR REGISTERS(REG_INDEX_AES128_OUT3)) &
(BUF_DATA_I XOR REGISTERS(REG_INDEX_AES128_OUT4));
fifo_toaes_wr_en <= '1';
REGISTERS(dma_ctrl_idx)(DMA_CTRL_CBC_IDX) <= '0';
END IF;
END IF;
END IF; -- GCM | AES
@@ -1301,7 +1301,7 @@ BEGIN
when SBus_Master_Write =>
fifo_wr_en <= '1'; fifo_din <= x"67"; -- "g"
IF (BUF_ACKs_I = ACK_IDLE) THEN
-- wait some more
-- wait some more
ELSIF (BUF_ACKs_I = ACK_WORD) THEN
IF (BURST_COUNTER = BURST_LIMIT) THEN
State <= SBus_Master_Write_Final;
@@ -1348,9 +1348,9 @@ BEGIN
-- FALLBACK
WHEN OTHERS => -- include SBus_Start
if SBUS_3V3_RSTs = '1' then
SBus_Set_Default(SBUS_3V3_INT1s, SBUS_3V3_INT7s,
SBUS_DATA_OE_LED, SBUS_DATA_OE_LED_2,
p_addr, DATA_T, SM_T, SMs_T, LED_RESET);
SBus_Set_Default(SBUS_3V3_INT1s, SBUS_3V3_INT7s,
SBUS_DATA_OE_LED, SBUS_DATA_OE_LED_2,
p_addr, DATA_T, SM_T, SMs_T, LED_RESET);
REGISTERS(REG_INDEX_DMA_CTRL) <= (others => '0');
REGISTERS(REG_INDEX_DMAW_CTRL) <= (others => '0');
IF (RES_COUNTER = 0) THEN
@@ -1368,42 +1368,42 @@ BEGIN
END CASE; -- SBus state machine
CASE AES_State IS
WHEN AES_IDLE =>
IF ((REGISTERS(REG_INDEX_AES128_CTRL)(AES128_CTRL_START_IDX) = '1') AND
(fifo_toaes_full = '0')
) THEN
WHEN AES_IDLE =>
IF ((REGISTERS(REG_INDEX_AES128_CTRL)(AES128_CTRL_START_IDX) = '1') AND
(fifo_toaes_full = '0')
) THEN
fifo_wr_en <= '1'; fifo_din <= x"30"; -- "0"
REGISTERS(REG_INDEX_AES128_CTRL)(AES128_CTRL_BUSY_IDX) <= '1';
-- start & !busy & !aesbusy -> start processing
if (REGISTERS(REG_INDEX_AES128_CTRL)(AES128_CTRL_NEWKEY_IDX) = '1') THEN --newkey
fifo_toaes_din <=
'1' & -- iskey
REGISTERS(REG_INDEX_AES128_CTRL)(AES128_CTRL_AES256_IDX) & -- keylen
(NOT REGISTERS(REG_INDEX_AES128_CTRL)(AES128_CTRL_DEC_IDX)) & -- encdec
REGISTERS(REG_INDEX_AES128_CTRL)(AES128_CTRL_CBCMOD_IDX) & -- cbc
'0' & -- internal cbc
REGISTERS(REG_INDEX_AES128_KEY1) & REGISTERS(REG_INDEX_AES128_KEY2) &
REGISTERS(REG_INDEX_AES128_KEY3) & REGISTERS(REG_INDEX_AES128_KEY4) &
REGISTERS(REG_INDEX_AES128_KEY5) & REGISTERS(REG_INDEX_AES128_KEY6) &
REGISTERS(REG_INDEX_AES128_KEY7) & REGISTERS(REG_INDEX_AES128_KEY8);
fifo_toaes_wr_en <= '1';
AES_State <= AES_INIT1;
ELSE
fifo_toaes_din <=
'0' & -- !iskey
REGISTERS(REG_INDEX_AES128_CTRL)(AES128_CTRL_AES256_IDX) & -- keylen
(NOT REGISTERS(REG_INDEX_AES128_CTRL)(AES128_CTRL_DEC_IDX)) & -- encdec
REGISTERS(REG_INDEX_AES128_CTRL)(AES128_CTRL_CBCMOD_IDX) & -- cbc
'0' & -- internal cbc
REGISTERS(REG_INDEX_AES128_OUT1) & REGISTERS(REG_INDEX_AES128_OUT2) &
REGISTERS(REG_INDEX_AES128_OUT3) & REGISTERS(REG_INDEX_AES128_OUT4) &
REGISTERS(REG_INDEX_AES128_DATA1) & REGISTERS(REG_INDEX_AES128_DATA2) &
REGISTERS(REG_INDEX_AES128_DATA3) & REGISTERS(REG_INDEX_AES128_DATA4);
fifo_toaes_wr_en <= '1';
AES_State <= AES_CRYPT1;
-- start & !busy & !aesbusy -> start processing
if (REGISTERS(REG_INDEX_AES128_CTRL)(AES128_CTRL_NEWKEY_IDX) = '1') THEN --newkey
fifo_toaes_din <=
'1' & -- iskey
REGISTERS(REG_INDEX_AES128_CTRL)(AES128_CTRL_AES256_IDX) & -- keylen
(NOT REGISTERS(REG_INDEX_AES128_CTRL)(AES128_CTRL_DEC_IDX)) & -- encdec
REGISTERS(REG_INDEX_AES128_CTRL)(AES128_CTRL_CBCMOD_IDX) & -- cbc
'0' & -- internal cbc
REGISTERS(REG_INDEX_AES128_KEY1) & REGISTERS(REG_INDEX_AES128_KEY2) &
REGISTERS(REG_INDEX_AES128_KEY3) & REGISTERS(REG_INDEX_AES128_KEY4) &
REGISTERS(REG_INDEX_AES128_KEY5) & REGISTERS(REG_INDEX_AES128_KEY6) &
REGISTERS(REG_INDEX_AES128_KEY7) & REGISTERS(REG_INDEX_AES128_KEY8);
fifo_toaes_wr_en <= '1';
AES_State <= AES_INIT1;
ELSE
fifo_toaes_din <=
'0' & -- !iskey
REGISTERS(REG_INDEX_AES128_CTRL)(AES128_CTRL_AES256_IDX) & -- keylen
(NOT REGISTERS(REG_INDEX_AES128_CTRL)(AES128_CTRL_DEC_IDX)) & -- encdec
REGISTERS(REG_INDEX_AES128_CTRL)(AES128_CTRL_CBCMOD_IDX) & -- cbc
'0' & -- internal cbc
REGISTERS(REG_INDEX_AES128_OUT1) & REGISTERS(REG_INDEX_AES128_OUT2) &
REGISTERS(REG_INDEX_AES128_OUT3) & REGISTERS(REG_INDEX_AES128_OUT4) &
REGISTERS(REG_INDEX_AES128_DATA1) & REGISTERS(REG_INDEX_AES128_DATA2) &
REGISTERS(REG_INDEX_AES128_DATA3) & REGISTERS(REG_INDEX_AES128_DATA4);
fifo_toaes_wr_en <= '1';
AES_State <= AES_CRYPT1;
END IF;
END IF;
END IF;
when AES_INIT1 =>
fifo_wr_en <= '1'; fifo_din <= x"31"; -- "1"
fifo_toaes_wr_en <= '0';
@@ -1438,12 +1438,12 @@ BEGIN
CASE fifo_fromstrng_full IS
WHEN '1' =>
fifo_fromstrng_rd_en <= '1'; -- remove one word from FIFO
REGISTERS(64 + REG_INDEX_TRNG_DATA) <= fifo_fromstrng_dout;
fifo_fromstrng_rd_en <= '1'; -- remove one word from FIFO
REGISTERS(64 + REG_INDEX_TRNG_DATA) <= fifo_fromstrng_dout;
WHEN others =>
-- do nothing
-- do nothing
END CASE; --TRNG self-emptying FIFO
END IF;
@@ -1451,50 +1451,50 @@ BEGIN
process(fxclk_in, fifo_rst)
BEGIN
if (fifo_rst = '1') THEN
Uart_State <= UART_IDLE;
ELSIF RISING_EDGE(fxclk_in) THEN
r_TX_DV <= '0';
fifo_rd_en <= '0';
CASE Uart_State IS
WHEN UART_IDLE =>
IF (fifo_empty = '0') THEN
if (fifo_rst = '1') THEN
Uart_State <= UART_IDLE;
ELSIF RISING_EDGE(fxclk_in) THEN
r_TX_DV <= '0';
fifo_rd_en <= '0';
CASE Uart_State IS
WHEN UART_IDLE =>
IF (fifo_empty = '0') THEN
r_TX_DV <= '1';
fifo_rd_en <= '1';
r_TX_BYTE <= fifo_dout;
Uart_State <= UART_WAITING;
END IF;
WHEN UART_WAITING =>
if (w_TX_DONE = '1') then
END IF;
WHEN UART_WAITING =>
if (w_TX_DONE = '1') then
Uart_State <= UART_IDLE;
END IF;
END CASE;
END IF;
END IF;
END CASE;
END IF;
END PROCESS;
-- process to enable signal after a while
process(fxclk_in)
BEGIN
IF RISING_EDGE(fxclk_in) THEN
IF (OE_COUNTER = 0) THEN
IF RISING_EDGE(fxclk_in) THEN
IF (OE_COUNTER = 0) THEN
SBUS_OE <= '0';
ELSE
ELSE
OE_COUNTER <= OE_COUNTER - 1;
END IF;
END IF;
END IF;
END PROCESS;
-- process to enable AES block
process (aes_clk_out)
BEGIN
IF RISING_EDGE(aes_clk_out) THEN
if (AES_RST_COUNTER = 0) THEN
IF RISING_EDGE(aes_clk_out) THEN
if (AES_RST_COUNTER = 0) THEN
aes_wrapper_rst <= '1';
else
else
AES_RST_COUNTER <= (AES_RST_COUNTER - 1);
aes_wrapper_rst <= '0';
end if;
END IF;
end if;
END IF;
END PROCESS;
END rtl;