From 6e76f25f84a7a7be37057ca09ccd99b83aa4ded8 Mon Sep 17 00:00:00 2001 From: prot Date: Tue, 24 Feb 2004 10:11:14 +0000 Subject: création du répertoire spécial registre --- 2004/n/fpga/src/registre/isa_const.vhd | 27 ++++++++ 2004/n/fpga/src/registre/nono_const.vhd | 52 ++++++++++++++++ 2004/n/fpga/src/registre/registre.vhd | 105 ++++++++++++++++++++++++++++++++ 2004/n/fpga/src/registre/test_reg.vhd | 76 +++++++++++++++++++++++ 4 files changed, 260 insertions(+) create mode 100644 2004/n/fpga/src/registre/isa_const.vhd create mode 100644 2004/n/fpga/src/registre/nono_const.vhd create mode 100644 2004/n/fpga/src/registre/registre.vhd create mode 100644 2004/n/fpga/src/registre/test_reg.vhd (limited to '2004') 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; + + -- cgit v1.2.3