⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plasma.vhd

📁 Plasma IP Core 你可以利用这个组件在FPGA中设计MIPS结构的CPU
💻 VHD
字号:
----------------------------------------------------------------------- TITLE: Plasma (CPU core with memory)-- AUTHOR: Steve Rhoads (rhoadss@yahoo.com)-- DATE CREATED: 6/4/02-- FILENAME: plasma.vhd-- PROJECT: Plasma CPU core-- COPYRIGHT: Software placed into the public domain by the author.--    Software 'as is' without warranty.  Author liable for nothing.-- DESCRIPTION:--    This entity combines the CPU core with memory and a UART.---- Memory Map:--   0x00000000 - 0x0000ffff   Internal RAM (8KB)--   0x10000000 - 0x100fffff   External RAM (1MB)--   Access all Misc registers with 32-bit accesses--   0x20000000  Uart Write (will pause CPU if busy)--   0x20000000  Uart Read--   0x20000010  IRQ Mask--   0x20000020  IRQ Status--   0x20000030  GPIO0 Out--   0x20000050  GPIOA In--   0x20000060  Counter--   IRQ bits:--      7   GPIO31--      6   GPIO30--      5  ^GPIO31--      4  ^GPIO30--      3   Counter(18)--      2  ^Counter(18)--      1  ^UartWriteBusy--      0   UartDataAvailable---------------------------------------------------------------------library ieee;use ieee.std_logic_1164.all;use work.mlite_pack.all;entity plasma is   generic(memory_type : string := "XILINX_16X"; --"DUAL_PORT_" "ALTERA_LPM";           log_file    : string := "UNUSED");   port(clk               : in std_logic;        reset             : in std_logic;        uart_write        : out std_logic;        uart_read         : in std_logic;        address           : out std_logic_vector(31 downto 2);        data_write        : out std_logic_vector(31 downto 0);        data_read         : in std_logic_vector(31 downto 0);        write_byte_enable : out std_logic_vector(3 downto 0);         mem_pause_in      : in std_logic;                gpio0_out         : out std_logic_vector(31 downto 0);        gpioA_in          : in std_logic_vector(31 downto 0));end; --entity plasmaarchitecture logic of plasma is   signal address_reg         : std_logic_vector(31 downto 2);   signal data_write_reg      : std_logic_vector(31 downto 0);   signal write_byte_enable_reg : std_logic_vector(3 downto 0);   signal mem_address         : std_logic_vector(31 downto 0);   signal mem_data_read       : std_logic_vector(31 downto 0);   signal mem_data_write      : std_logic_vector(31 downto 0);   signal mem_write_byte_enable : std_logic_vector(3 downto 0);   signal data_read_ram       : std_logic_vector(31 downto 0);   signal data_read_uart      : std_logic_vector(7 downto 0);   signal write_enable        : std_logic;   signal mem_pause           : std_logic;   signal enable_internal_ram : std_logic;   signal enable_misc         : std_logic;   signal enable_uart         : std_logic;   signal enable_uart_read    : std_logic;   signal enable_uart_write   : std_logic;   signal gpio0_reg           : std_logic_vector(31 downto 0);   signal uart_write_busy     : std_logic;   signal uart_data_avail     : std_logic;   signal irq_mask_reg        : std_logic_vector(7 downto 0);   signal irq_status          : std_logic_vector(7 downto 0);   signal irq                 : std_logic;   signal counter_reg         : std_logic_vector(31 downto 0);begin  --architecture   write_byte_enable <= write_byte_enable_reg;   data_write <= data_write_reg;   address  <= address_reg;   write_enable <= '1' when write_byte_enable_reg /= "0000" else '0';   mem_pause <= mem_pause_in or (uart_write_busy and enable_uart and write_enable);   irq_status <= gpioA_in(31 downto 30) & (gpioA_in(31 downto 30) xor "11") &                 counter_reg(18) & not counter_reg(18) &                 not uart_write_busy & uart_data_avail;   irq <= '1' when (irq_status and irq_mask_reg) /= ZERO(7 downto 0) else '0';   gpio0_out <= gpio0_reg;   enable_internal_ram <= '1' when mem_address(30 downto 28) = "000" else '0';   enable_misc <= '1' when address_reg(30 downto 28) = "010" else '0';   enable_uart <= '1' when enable_misc = '1' and address_reg(7 downto 4) = "0000" else '0';   enable_uart_read <= enable_uart and not write_enable;   enable_uart_write <= enable_uart and write_enable;   u1_cpu: mlite_cpu       generic map (memory_type => memory_type)      PORT MAP (         clk          => clk,         reset_in     => reset,         intr_in      => irq,          mem_address  => mem_address,         mem_data_w   => mem_data_write,         mem_data_r   => mem_data_read,         mem_byte_we  => mem_write_byte_enable,         mem_pause    => mem_pause);   misc_proc: process(clk, reset, mem_address, address_reg, enable_misc,      data_read_ram, data_read, data_read_uart, mem_pause,      irq_mask_reg, irq_status, gpio0_reg, write_enable,      gpioA_in, counter_reg, mem_data_write, data_write_reg)   begin      case address_reg(30 downto 28) is      when "000" =>      --internal RAM         mem_data_read <= data_read_ram;      when "001" =>      --external RAM         mem_data_read <= data_read;      when "010" =>      --misc         case address_reg(6 downto 4) is         when "000" =>      --uart            mem_data_read <= ZERO(31 downto 8) & data_read_uart;         when "001" =>      --irq_mask            mem_data_read <= ZERO(31 downto 8) & irq_mask_reg;         when "010" =>      --irq_status            mem_data_read <= ZERO(31 downto 8) & irq_status;         when "011" =>      --gpio0            mem_data_read <= gpio0_reg;         when "101" =>      --gpioA            mem_data_read <= gpioA_in;         when "110" =>      --counter            mem_data_read <= counter_reg;                 when others =>            mem_data_read <= gpioA_in;         end case;      when others =>         mem_data_read <= ZERO;      end case;      if reset = '1' then         address_reg <= ZERO(31 downto 2);         data_write_reg <= ZERO;         write_byte_enable_reg <= ZERO(3 downto 0);         irq_mask_reg <= ZERO(7 downto 0);         gpio0_reg <= ZERO;         counter_reg <= ZERO;      elsif rising_edge(clk) then         if mem_pause = '0' then            address_reg <= mem_address(31 downto 2);            data_write_reg <= mem_data_write;            write_byte_enable_reg <= mem_write_byte_enable;            if enable_misc = '1' and write_enable = '1' then               if address_reg(6 downto 4) = "001" then                  irq_mask_reg <= data_write_reg(7 downto 0);               elsif address_reg(6 downto 4) = "011" then                  gpio0_reg <= data_write_reg;               end if;            end if;         end if;         counter_reg <= bv_inc(counter_reg);      end if;   end process;   u2_ram: ram       generic map (memory_type => memory_type)      port map (         clk               => clk,         enable            => enable_internal_ram,         write_byte_enable => mem_write_byte_enable,         address           => mem_address(31 downto 2),         data_write        => mem_data_write,         data_read         => data_read_ram);   u3_uart: uart      generic map (log_file => log_file)      port map(         clk          => clk,         reset        => reset,         enable_read  => enable_uart_read,         enable_write => enable_uart_write,         data_in      => data_write_reg(7 downto 0),         data_out     => data_read_uart,         uart_read    => uart_read,         uart_write   => uart_write,         busy_write   => uart_write_busy,         data_avail   => uart_data_avail);end; --architecture logic

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -