summaryrefslogtreecommitdiff
path: root/2004
diff options
context:
space:
mode:
authorprot2004-02-24 10:11:14 +0000
committerprot2004-02-24 10:11:14 +0000
commit6e76f25f84a7a7be37057ca09ccd99b83aa4ded8 (patch)
treeb8098259b2dcb7ca1e17e7b8045a365edcca1887 /2004
parent273b35dc4e1accf4f3c702cdd5b2869305e8e7ef (diff)
création du répertoire spécial registre
Diffstat (limited to '2004')
-rw-r--r--2004/n/fpga/src/registre/isa_const.vhd27
-rw-r--r--2004/n/fpga/src/registre/nono_const.vhd52
-rw-r--r--2004/n/fpga/src/registre/registre.vhd105
-rw-r--r--2004/n/fpga/src/registre/test_reg.vhd76
4 files changed, 260 insertions, 0 deletions
diff --git a/2004/n/fpga/src/registre/isa_const.vhd b/2004/n/fpga/src/registre/isa_const.vhd
new file mode 100644
index 0000000..12ab384
--- /dev/null
+++ b/2004/n/fpga/src/registre/isa_const.vhd
@@ -0,0 +1,27 @@
+-- isa_const.vhd
+-- Eurobot 2004 : APB Team
+-- Auteur : Pierre-André Galmes
+-- Fichier de déclaration de constantes.
+
+-- RQ : pour une indentation bien sous vim :
+-- 1 - ":set shiftwidth=4"
+-- 2 - se placer sous "package nono_const is"
+-- 3 - tapez : = puis shift+G
+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.std_logic_arith.all;
+use ieee.std_logic_unsigned.all;
+
+
+-- Constantes relatives au bus ISA
+package isa_const is
+
+ -- Temps d'une période d'horloge sur le bus ISA
+ constant ISA_CK_PERIOD : time := 50 ns;
+
+ -- Ligne RW : lecture et écriture
+ constant ISA_READ : std_logic := '0';
+ constant ISA_WRITE : std_logic := '1';
+end isa_const;
+
diff --git a/2004/n/fpga/src/registre/nono_const.vhd b/2004/n/fpga/src/registre/nono_const.vhd
new file mode 100644
index 0000000..5c2e04a
--- /dev/null
+++ b/2004/n/fpga/src/registre/nono_const.vhd
@@ -0,0 +1,52 @@
+-- nono_const.vhd
+-- Eurobot 2004 : APB Team
+-- Auteur : Pierre-André Galmes
+-- Fichier de déclaration de constantes.
+
+-- RQ : pour une indentation bien sous vim :
+-- 1 - ":set shiftwidth=4"
+-- 2 - se placer sous "package nono_const is"
+-- 3 - tapez : = puis shift+G
+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.std_logic_arith.all;
+use ieee.std_logic_unsigned.all;
+
+package nono_const is
+
+ -- Temps d'une période d'horloge
+ constant CK_PERIOD : time := 10 ns;
+
+ -- Taille d'une addresse sur la carte
+ -- RQ : 10 = nb suffisant
+ -- 12 = 3 digit en héxa
+ constant NB_BIT_ADDRESS : integer := 10;
+
+ -- Taille des données sur la carte
+ constant NB_BIT_DATA : integer := 8;
+
+ -- Définition d'un nouveau type : ADDRESS
+ subtype T_ADDRESS is unsigned ((NB_BIT_ADDRESS - 1) downto 0);
+
+ -- Les différentes banques d'adresses (4 x 256)
+ -- Rq pour Pierre : ça va influer sur le bloc de gestion du bus
+ constant START_ADDR_B0 : T_ADDRESS := "0000000000";
+ constant START_ADDR_B1 : T_ADDRESS := "0100000000";
+ constant START_ADDR_B2 : T_ADDRESS := "1000000000";
+ constant START_ADDR_B3 : T_ADDRESS := "1100000000";
+
+ -- Les addresses des différents registres.
+
+ -- gestion des interruptions
+ constant A_INTERRUPT_MANAGER : T_ADDRESS := START_ADDR_B0 + x"00";
+ -- Bloc d'IO
+ constant A_REG_IO_DIRECTION : T_ADDRESS := START_ADDR_B0 + x"01";
+ constant A_REG_IO_DATA : T_ADDRESS := START_ADDR_B0 + x"02";
+ constant A_REG_IO_INTERRUPT_MASK : T_ADDRESS := START_ADDR_B0 + x"03";
+ -- Bloc port série
+ -- Bloc caméra
+ -- Bloc PWM
+ -- Bloc I²C
+ -- Bloc servo-moteurs
+end nono_const;
diff --git a/2004/n/fpga/src/registre/registre.vhd b/2004/n/fpga/src/registre/registre.vhd
new file mode 100644
index 0000000..23a0079
--- /dev/null
+++ b/2004/n/fpga/src/registre/registre.vhd
@@ -0,0 +1,105 @@
+-- txserie.vhd
+-- Eurobot 2004 : APB Team
+-- Auteur : Pierre Prot
+-- registre IO adressable sur bus ISA
+
+-- MARCHE
+
+-- -------------------------------------------
+-- Registre générique à brancher sur un bus
+-- -------------------------------------------
+--
+-- * on peut écrire ou lire dans le registre depuis le bus :
+-- . Positionner l'adresse
+-- . Mettre 'rw' à 1=>read 0=>write
+-- . Front montant sur 'ck'
+-- Remarque : on ne peut pas écrire via le bus si 'load' est activé
+-- * on peut lire la valeur en permanence sur 'output'
+-- * on peut écrire dans le registre en permanence grâce à 'load'. Cette
+-- action est prioritaire sur l'écriture via le bus
+-- . Mettre 'load' à 1
+-- . Ecrire dans 'input' (actualisation immédiate)
+-- . Mettre 'load' à 0 pour latcher
+
+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.std_logic_arith.all;
+use ieee.std_logic_unsigned.all;
+
+use work.nono_const.all;
+
+entity regIO is
+ generic(adr : unsigned);
+ port(
+ bus_data: inout unsigned ((NB_BIT_DATA - 1) downto 0);
+ bus_address: in unsigned ((NB_BIT_ADDRESS - 1) downto 0);
+ input: in unsigned(7 downto 0);
+ output: out unsigned(7 downto 0);
+ rw: in std_logic;
+ load: in std_logic;
+ ck: in std_logic;
+ rst: in std_logic
+ );
+end entity;
+
+
+architecture rtl of regIO is
+signal REG : unsigned((NB_BIT_DATA - 1) downto 0):=(others => '1');
+
+begin
+ p_w:process(ck,load,input,rst)
+ begin
+ if(ck='1') then
+ if(bus_address=adr) then
+ if(rw='0') then
+ if(load='0') then
+ REG<=bus_data;
+ end if;
+ else -- RW=1 : la CM lit => on écrit sur le bus
+ bus_data<=REG;
+ end if;
+ else
+ bus_data<=(others => 'Z');
+ end if;
+ else
+ bus_data<=(others => 'Z');
+ end if;
+
+-- chargement : prioritaire sur l'écriture via le bus
+ if(load='1') then
+ REG<=input;
+ end if;
+
+-- reset : prioritaire sur tout
+ if(rst'event and rst='1') then
+ REG<=(others => '0');
+ bus_data<=(others => 'Z');
+ end if;
+
+ end process p_w;
+
+-- p_load : process(load,input)
+-- begin
+-- if(load='1') then
+-- REG<=input;
+-- end if;
+-- end process p_load;
+
+-- p_reset : process(rst)
+-- begin
+-- if(rst'event and rst='1') then
+-- REG<=(others => '0');
+-- bus_data<=(others => 'Z');
+-- end if;
+-- end process p_reset;
+
+ output<=REG;
+end rtl;
+
+
+
+
+
+
+
diff --git a/2004/n/fpga/src/registre/test_reg.vhd b/2004/n/fpga/src/registre/test_reg.vhd
new file mode 100644
index 0000000..7573ba4
--- /dev/null
+++ b/2004/n/fpga/src/registre/test_reg.vhd
@@ -0,0 +1,76 @@
+-- testbench pour le registre
+
+-- MARCHE
+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.std_logic_arith.all;
+use ieee.std_logic_unsigned.all;
+
+use work.nono_const.all;
+
+entity testreg is
+constant adr_w : integer :=10;
+constant data_w : integer :=8;
+end testreg;
+
+architecture sim1 of testreg is
+component regIO
+ generic(adr:unsigned);
+ port(
+ bus_data: inout unsigned ((NB_BIT_DATA - 1) downto 0);
+ bus_address: in unsigned ((NB_BIT_ADDRESS - 1) downto 0);
+ input: in unsigned((data_w - 1) downto 0);
+ output: out unsigned((data_w - 1) downto 0);
+ rw: in std_logic;
+ load: in std_logic;
+ ck: in std_logic;
+ rst: in std_logic
+ );
+end component;
+
+signal bus_address: unsigned((adr_w - 1) downto 0):="0000000000";
+signal bus_data: unsigned((data_w - 1) downto 0):="00000000";
+signal input: unsigned((data_w - 1) downto 0):="00000000";
+signal output: unsigned((data_w - 1) downto 0);
+signal rw: std_logic:='0';
+signal load: std_logic:='0';
+signal ck: std_logic:='0';
+signal rst: std_logic:='1';
+
+begin
+ R0: regIO
+ generic map(adr => "0000000001")
+ port map(
+ bus_address=>bus_address,
+ bus_data=>bus_data,
+ input=>input,
+ output=>output,
+ rw=>rw,
+ load=>load,
+ ck=>ck,
+ rst=>rst
+ );
+
+ bus_address <= "0001001100" ,
+ "0000000001" after 40 ns;
+-- "0000001101" after 100 ns;
+-- "0000001100" after 100 ns;
+
+ input <= input + 1 after 3 ns;
+ bus_data <= "01010101", "ZZZZZZZZ" after 2 ns;
+ rw <= not rw after 11 ns;
+ load <= not load after 7 ns;
+ ck <= not ck after 5 ns;
+ rst <= '0','1' after 1 ns,'0' after 2 ns;
+
+end sim1;
+
+
+configuration cf1 of testreg is
+ for sim1
+ for all : regIO use entity work.regIO(rtl); end for;
+ end for;
+end cf1;
+
+