-- <File header>
|
-- <File header>
|
-- Project
|
-- Project
|
-- pAVR (pipelined AVR) is an 8 bit RISC controller, compatible with Atmel's
|
-- pAVR (pipelined AVR) is an 8 bit RISC controller, compatible with Atmel's
|
-- AVR core, but about 3x faster in terms of both clock frequency and MIPS.
|
-- AVR core, but about 3x faster in terms of both clock frequency and MIPS.
|
-- The increase in speed comes from a relatively deep pipeline. The original
|
-- The increase in speed comes from a relatively deep pipeline. The original
|
-- AVR core has only two pipeline stages (fetch and execute), while pAVR has
|
-- AVR core has only two pipeline stages (fetch and execute), while pAVR has
|
-- 6 pipeline stages:
|
-- 6 pipeline stages:
|
-- 1. PM (read Program Memory)
|
-- 1. PM (read Program Memory)
|
-- 2. INSTR (load Instruction)
|
-- 2. INSTR (load Instruction)
|
-- 3. RFRD (decode Instruction and read Register File)
|
-- 3. RFRD (decode Instruction and read Register File)
|
-- 4. OPS (load Operands)
|
-- 4. OPS (load Operands)
|
-- 5. ALU (execute ALU opcode or access Unified Memory)
|
-- 5. ALU (execute ALU opcode or access Unified Memory)
|
-- 6. RFWR (write Register File)
|
-- 6. RFWR (write Register File)
|
-- Version
|
-- Version
|
-- 0.32
|
-- 0.32
|
-- Date
|
-- Date
|
-- 2002 August 07
|
-- 2002 August 07
|
-- Author
|
-- Author
|
-- Doru Cuturela, doruu@yahoo.com
|
-- Doru Cuturela, doruu@yahoo.com
|
-- License
|
-- License
|
-- This program is free software; you can redistribute it and/or modify
|
-- This program is free software; you can redistribute it and/or modify
|
-- it under the terms of the GNU General Public License as published by
|
-- it under the terms of the GNU General Public License as published by
|
-- the Free Software Foundation; either version 2 of the License, or
|
-- the Free Software Foundation; either version 2 of the License, or
|
-- (at your option) any later version.
|
-- (at your option) any later version.
|
-- This program is distributed in the hope that it will be useful,
|
-- This program is distributed in the hope that it will be useful,
|
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
-- GNU General Public License for more details.
|
-- GNU General Public License for more details.
|
-- You should have received a copy of the GNU General Public License
|
-- You should have received a copy of the GNU General Public License
|
-- along with this program; if not, write to the Free Software
|
-- along with this program; if not, write to the Free Software
|
-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
-- </File header>
|
-- </File header>
|
|
|
|
|
|
|
-- <File info>
|
-- <File info>
|
-- This tests pAVR's interrupts.
|
-- This tests pAVR's interrupts.
|
-- NOT DONE YET.
|
-- NOT DONE YET.
|
-- </File info>
|
-- </File info>
|
|
|
|
|
|
|
-- <File body>
|
-- <File body>
|
library ieee;
|
library ieee;
|
use ieee.std_logic_1164.all;
|
use ieee.std_logic_1164.all;
|
library work;
|
library work;
|
use work.std_util.all;
|
use work.std_util.all;
|
use work.pavr_util.all;
|
use work.pavr_util.all;
|
use work.pavr_constants.all;
|
use work.pavr_constants.all;
|
|
|
|
|
entity test_pavr_rf is
|
entity test_pavr_rf is
|
end;
|
end;
|
|
|
|
|
architecture test_pavr_rf_arch of test_pavr_rf is
|
architecture test_pavr_rf_arch of test_pavr_rf is
|
signal clk, res, syncres: std_logic;
|
signal clk, res, syncres: std_logic;
|
|
|
-- Clock counter
|
-- Clock counter
|
signal cnt: std_logic_vector(7 downto 0);
|
signal cnt: std_logic_vector(7 downto 0);
|
|
|
begin
|
begin
|
|
|
generate_clock:
|
generate_clock:
|
process
|
process
|
begin
|
begin
|
clk <= '1';
|
clk <= '1';
|
wait for 50 ns;
|
wait for 50 ns;
|
clk <= '0';
|
clk <= '0';
|
wait for 50 ns;
|
wait for 50 ns;
|
end process generate_clock;
|
end process generate_clock;
|
|
|
|
|
generate_reset:
|
generate_reset:
|
process
|
process
|
begin
|
begin
|
res <= '0';
|
res <= '0';
|
wait for 100 ns;
|
wait for 100 ns;
|
res <= '1';
|
res <= '1';
|
wait for 110 ns;
|
wait for 110 ns;
|
res <= '0';
|
res <= '0';
|
wait for 1 ms;
|
wait for 1 ms;
|
end process generate_reset;
|
end process generate_reset;
|
|
|
|
|
generate_sync_reset:
|
generate_sync_reset:
|
process
|
process
|
begin
|
begin
|
syncres <= '0';
|
syncres <= '0';
|
wait for 300 ns;
|
wait for 300 ns;
|
syncres <= '1';
|
syncres <= '1';
|
wait for 110 ns;
|
wait for 110 ns;
|
syncres <= '0';
|
syncres <= '0';
|
wait for 1 ms;
|
wait for 1 ms;
|
end process generate_sync_reset;
|
end process generate_sync_reset;
|
|
|
|
|
test_main:
|
test_main:
|
process(clk, res, syncres,
|
process(clk, res, syncres,
|
cnt,
|
cnt,
|
pavr_rf_rd1_addr,
|
pavr_rf_rd1_addr,
|
pavr_rf_rd2_addr,
|
pavr_rf_rd2_addr,
|
pavr_rf_wr_addr, pavr_rf_wr_di,
|
pavr_rf_wr_addr, pavr_rf_wr_di,
|
pavr_rf_x_di,
|
pavr_rf_x_di,
|
pavr_rf_y_di,
|
pavr_rf_y_di,
|
pavr_rf_z_di
|
pavr_rf_z_di
|
)
|
)
|
begin
|
begin
|
if res='1' then
|
if res='1' then
|
-- Async reset
|
-- Async reset
|
|
|
cnt <= int_to_std_logic_vector(0, cnt'length);
|
cnt <= int_to_std_logic_vector(0, cnt'length);
|
elsif clk'event and clk='1' then
|
elsif clk'event and clk='1' then
|
-- Clock counter
|
-- Clock counter
|
cnt <= cnt+1;
|
cnt <= cnt+1;
|
|
|
-- Initialize inputs.
|
-- Initialize inputs.
|
|
|
case std_logic_vector_to_nat(cnt) is
|
case std_logic_vector_to_nat(cnt) is
|
|
|
-- TEST 1
|
-- TEST 1
|
|
|
|
|
when others =>
|
when others =>
|
null;
|
null;
|
end case;
|
end case;
|
|
|
if syncres='1' then
|
if syncres='1' then
|
-- Sync reset
|
-- Sync reset
|
|
|
cnt <= int_to_std_logic_vector(0, cnt'length);
|
cnt <= int_to_std_logic_vector(0, cnt'length);
|
end if;
|
end if;
|
end if;
|
end if;
|
end process test_main;
|
end process test_main;
|
|
|
|
|
end;
|
end;
|
-- </File body>
|
-- </File body>
|
|
|