Line 1... |
Line 1... |
library ieee;
|
library ieee;
|
use ieee.std_logic_1164.all;
|
use ieee.std_logic_1164.all;
|
use ieee.std_logic_unsigned.all;
|
use ieee.std_logic_unsigned.all;
|
|
|
entity hellfire_cpu_if is
|
entity hfrisc_soc is
|
generic(
|
generic(
|
address_width: integer := 14;
|
address_width: integer := 14;
|
memory_file : string := "code.txt";
|
memory_file : string := "code.txt";
|
uart_support : string := "yes"
|
uart_support : string := "yes"
|
);
|
);
|
Line 12... |
Line 12... |
reset_in: in std_logic;
|
reset_in: in std_logic;
|
int_in: in std_logic;
|
int_in: in std_logic;
|
uart_read: in std_logic;
|
uart_read: in std_logic;
|
uart_write: out std_logic
|
uart_write: out std_logic
|
);
|
);
|
end hellfire_cpu_if;
|
end hfrisc_soc;
|
|
|
architecture interface of hellfire_cpu_if is
|
architecture top_level of hfrisc_soc is
|
signal clock, boot_enable, ram_enable_n, stall, stall_cpu, busy_cpu, irq_cpu, irq_ack_cpu, data_access_cpu, ram_dly, rff1, reset: std_logic;
|
signal clock, boot_enable, ram_enable_n, stall, stall_cpu, busy_cpu, irq_cpu, irq_ack_cpu, data_access_cpu, ram_dly, rff1, reset: std_logic;
|
signal address, data_read, data_write, data_read_boot, data_read_ram, irq_vector_cpu, inst_addr_cpu, inst_in_cpu, data_addr_cpu, data_in_cpu, data_out_cpu: std_logic_vector(31 downto 0);
|
signal address, data_read, data_write, data_read_boot, data_read_ram, irq_vector_cpu, address_cpu, data_in_cpu, data_out_cpu: std_logic_vector(31 downto 0);
|
signal ext_irq: std_logic_vector(7 downto 0);
|
signal ext_irq: std_logic_vector(7 downto 0);
|
signal data_we, data_w_n_ram, data_w_cpu: std_logic_vector(3 downto 0);
|
signal data_we, data_w_n_ram, data_w_cpu: std_logic_vector(3 downto 0);
|
|
|
signal ext_periph, ext_periph_dly, ready: std_logic;
|
signal ext_periph, ext_periph_dly, ready: std_logic;
|
signal key: std_logic_vector(127 downto 0);
|
signal key: std_logic_vector(127 downto 0);
|
Line 66... |
Line 66... |
end if;
|
end if;
|
end process;
|
end process;
|
|
|
|
|
|
|
process (data_addr_cpu, key, input, output)
|
process (clock, reset, address_cpu, key, input, output)
|
begin
|
begin
|
case data_addr_cpu(7 downto 4) is
|
if reset = '1' then
|
|
data_read_xtea <= (others => '0');
|
|
elsif clock'event and clock = '1' then
|
|
if (ext_periph = '1') then -- XTEA is at 0xfa000000
|
|
case address_cpu(7 downto 4) is
|
when "0000" => -- control 0xfa000000 (bit2 - ready (R), bit1 - encrypt (RW), bit0 - start (RW)
|
when "0000" => -- control 0xfa000000 (bit2 - ready (R), bit1 - encrypt (RW), bit0 - start (RW)
|
data_read_xtea <= x"000000" & "00000" & ready & control;
|
data_read_xtea <= x"000000" & "00000" & ready & control;
|
when "0001" => -- key[0] 0xfa000010
|
when "0001" => -- key[0] 0xfa000010
|
data_read_xtea <= key(127 downto 96);
|
data_read_xtea <= key(127 downto 96);
|
when "0010" => -- key[1] 0xfa000020
|
when "0010" => -- key[1] 0xfa000020
|
Line 90... |
Line 94... |
when "1000" => -- output[1] 0xfa000080
|
when "1000" => -- output[1] 0xfa000080
|
data_read_xtea <= output(31 downto 0);
|
data_read_xtea <= output(31 downto 0);
|
when others =>
|
when others =>
|
data_read_xtea <= (others => '0');
|
data_read_xtea <= (others => '0');
|
end case;
|
end case;
|
|
end if;
|
|
end if;
|
end process;
|
end process;
|
|
|
process (clock, reset, data_addr_cpu, control, key, input, output)
|
process (clock, reset, address_cpu, control, key, input, output)
|
begin
|
begin
|
if reset = '1' then
|
if reset = '1' then
|
key <= (others => '0');
|
key <= (others => '0');
|
input <= (others => '0');
|
input <= (others => '0');
|
control <= "00";
|
control <= "00";
|
elsif clock'event and clock = '1' then
|
elsif clock'event and clock = '1' then
|
if (ext_periph = '1' and data_we /= "0000") then -- XTEA is at 0xfa000000
|
if (ext_periph = '1' and data_we /= "0000") then -- XTEA is at 0xfa000000
|
case data_addr_cpu(7 downto 4) is
|
case address_cpu(7 downto 4) is
|
when "0000" => -- control 0xfa000000 (bit2 - ready (R), bit1 - encrypt (RW), bit0 - start (RW)
|
when "0000" => -- control 0xfa000000 (bit2 - ready (R), bit1 - encrypt (RW), bit0 - start (RW)
|
control <= data_write(1 downto 0);
|
control <= data_write(1 downto 0);
|
when "0001" => -- key[0] 0xfa000010
|
when "0001" => -- key[0] 0xfa000010
|
key(127 downto 96) <= data_write;
|
key(127 downto 96) <= data_write;
|
when "0010" => -- key[1] 0xfa000020
|
when "0010" => -- key[1] 0xfa000020
|
Line 121... |
Line 127... |
end case;
|
end case;
|
end if;
|
end if;
|
end if;
|
end if;
|
end process;
|
end process;
|
|
|
|
|
|
|
stall <= '0';
|
stall <= '0';
|
boot_enable <= '1' when address(31 downto 28) = "0000" else '0';
|
boot_enable <= '1' when address(31 downto 28) = "0000" else '0';
|
ram_enable_n <= '0' when address(31 downto 28) = "0100" else '1';
|
ram_enable_n <= '0' when address(31 downto 28) = "0100" else '1';
|
ext_periph <= '1' when address(31 downto 24) = x"fa" else '0';
|
ext_periph <= '1' when address(31 downto 24) = x"fa" else '0';
|
data_read <= data_read_xtea when ext_periph = '1' or ext_periph_dly = '1' else data_read_boot when address(31 downto 28) = "0000" and ram_dly = '0' else data_read_ram;
|
data_read <= data_read_xtea when ext_periph = '1' or ext_periph_dly = '1' else data_read_boot when address(31 downto 28) = "0000" and ram_dly = '0' else data_read_ram;
|
Line 135... |
Line 139... |
-- HF-RISC core
|
-- HF-RISC core
|
core: entity work.datapath
|
core: entity work.datapath
|
port map( clock => clock,
|
port map( clock => clock,
|
reset => reset,
|
reset => reset,
|
stall => stall_cpu,
|
stall => stall_cpu,
|
busy => busy_cpu,
|
|
irq_vector => irq_vector_cpu,
|
irq_vector => irq_vector_cpu,
|
irq => irq_cpu,
|
irq => irq_cpu,
|
irq_ack => irq_ack_cpu,
|
irq_ack => irq_ack_cpu,
|
inst_addr => inst_addr_cpu,
|
address => address_cpu,
|
inst_in => inst_in_cpu,
|
|
data_addr => data_addr_cpu,
|
|
data_in => data_in_cpu,
|
data_in => data_in_cpu,
|
data_out => data_out_cpu,
|
data_out => data_out_cpu,
|
data_w => data_w_cpu,
|
data_w => data_w_cpu,
|
data_access => data_access_cpu
|
data_access => data_access_cpu
|
);
|
);
|
Line 160... |
Line 161... |
reset => reset,
|
reset => reset,
|
|
|
stall => stall,
|
stall => stall,
|
|
|
stall_cpu => stall_cpu,
|
stall_cpu => stall_cpu,
|
busy_cpu => busy_cpu,
|
|
irq_vector_cpu => irq_vector_cpu,
|
irq_vector_cpu => irq_vector_cpu,
|
irq_cpu => irq_cpu,
|
irq_cpu => irq_cpu,
|
irq_ack_cpu => irq_ack_cpu,
|
irq_ack_cpu => irq_ack_cpu,
|
inst_addr_cpu => inst_addr_cpu,
|
address_cpu => address_cpu,
|
inst_in_cpu => inst_in_cpu,
|
|
data_addr_cpu => data_addr_cpu,
|
|
data_in_cpu => data_in_cpu,
|
data_in_cpu => data_in_cpu,
|
data_out_cpu => data_out_cpu,
|
data_out_cpu => data_out_cpu,
|
data_w_cpu => data_w_cpu,
|
data_w_cpu => data_w_cpu,
|
data_access_cpu => data_access_cpu,
|
data_access_cpu => data_access_cpu,
|
|
|
Line 263... |
Line 261... |
we_n => data_w_n_ram(3),
|
we_n => data_w_n_ram(3),
|
data_i => data_write(31 downto 24),
|
data_i => data_write(31 downto 24),
|
data_o => data_read_ram(31 downto 24)
|
data_o => data_read_ram(31 downto 24)
|
);
|
);
|
|
|
end interface;
|
end top_level;
|
|
|
|
|
No newline at end of file
|
No newline at end of file
|