1 |
2 |
DavidRAMBA |
--=============================================================================
|
2 |
|
|
-- TITRE : READMAC
|
3 |
|
|
-- DESCRIPTION :
|
4 |
|
|
-- Récupère le DNA du composant et génère l'adresse MAC du composant
|
5 |
|
|
|
6 |
|
|
-- FICHIER : readmac.vhd
|
7 |
|
|
--=============================================================================
|
8 |
|
|
-- CREATION
|
9 |
|
|
-- DATE AUTEUR PROJET REVISION
|
10 |
|
|
-- 10/04/2014 DRA SATURN V1.0
|
11 |
|
|
--=============================================================================
|
12 |
|
|
-- HISTORIQUE DES MODIFICATIONS :
|
13 |
|
|
-- DATE AUTEUR PROJET REVISION
|
14 |
|
|
-- 17/11/14 DRA SATURN V1.1
|
15 |
|
|
-- Suppression d'un coup de shift pour garder les 57 bits utiles en LSB
|
16 |
|
|
--=============================================================================
|
17 |
|
|
|
18 |
|
|
LIBRARY IEEE;
|
19 |
|
|
USE IEEE.STD_LOGIC_1164.ALL;
|
20 |
|
|
USE IEEE.STD_LOGIC_ARITH.ALL;
|
21 |
|
|
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
|
22 |
|
|
Library UNISIM;
|
23 |
|
|
use UNISIM.vcomponents.all;
|
24 |
|
|
|
25 |
|
|
ENTITY readmac IS
|
26 |
|
|
GENERIC (
|
27 |
|
|
-- Valeur utilisée pour la simulation
|
28 |
|
|
sim_dna_value : STD_LOGIC_VECTOR(59 DOWNTO 0) := X"023456789ABCDEF");
|
29 |
|
|
PORT (
|
30 |
|
|
-- Ports système
|
31 |
|
|
clk_sys : IN STD_LOGIC; -- Clock système
|
32 |
|
|
rst_n : IN STD_LOGIC; -- Reset général système
|
33 |
|
|
|
34 |
|
|
-- Résultat
|
35 |
|
|
mac : OUT STD_LOGIC_VECTOR(63 downto 0);
|
36 |
|
|
mac_rdy : OUT STD_LOGIC -- Indique que l'adresse MAC a été récupérée
|
37 |
|
|
);
|
38 |
|
|
END readmac;
|
39 |
|
|
|
40 |
|
|
ARCHITECTURE rtl of readmac is
|
41 |
|
|
SIGNAL cptbit : STD_LOGIC_VECTOR(5 downto 0); -- compteur de bit
|
42 |
|
|
SIGNAL shifter : STD_LOGIC_VECTOR(56 downto 0); -- Shifter pour réceptionner le DNA
|
43 |
|
|
SIGNAL gnd : STD_LOGIC; -- '0' logique
|
44 |
|
|
SIGNAL read : STD_LOGIC; -- Ordre de lecture du DNA
|
45 |
|
|
SIGNAL read_r : STD_LOGIC; -- Ordre de lecture retardé
|
46 |
|
|
SIGNAL shift : STD_LOGIC; -- Signal de shift d'un bit du DNA
|
47 |
|
|
SIGNAL dout : STD_LOGIC; -- Bit sorti du DNA
|
48 |
|
|
|
49 |
|
|
BEGIN
|
50 |
|
|
gnd <= '0';
|
51 |
|
|
|
52 |
|
|
--------------------------------------------
|
53 |
|
|
-- Comptage des bits et registre à décalage
|
54 |
|
|
--------------------------------------------
|
55 |
|
|
inst_cpt : PROCESS(clk_sys, rst_n)
|
56 |
|
|
BEGIN
|
57 |
|
|
IF (rst_n = '0') THEN
|
58 |
|
|
cptbit <= (OTHERS => '0');
|
59 |
|
|
read <= '1';
|
60 |
|
|
read_r <= '1';
|
61 |
|
|
mac_rdy <= '0';
|
62 |
|
|
ELSIF (clk_sys'EVENT AND clk_sys = '1') THEN
|
63 |
|
|
read <= '0';
|
64 |
|
|
read_r <= read; -- On assure que le signal de lecture à duré au moins 1 clk_sys
|
65 |
|
|
IF (read_r = '0') THEN -- Quand la lecture est finie
|
66 |
|
|
IF (cptbit /= "111001") THEN -- On shifte 57 bits
|
67 |
|
|
-- Si on a pas récupéré les 57 bits
|
68 |
|
|
shift <= '1'; -- On ordonne le shift au DNA
|
69 |
|
|
shifter <= shifter(55 DOWNTO 0) & dout; -- On prend un bit de plus
|
70 |
|
|
cptbit <= cptbit + 1;
|
71 |
|
|
ELSE
|
72 |
|
|
-- Si ona récupéré tous les bits
|
73 |
|
|
shift <= '0'; -- On annule le shift DNA
|
74 |
|
|
mac_rdy <= '1'; -- On indique que le MAC est prêt
|
75 |
|
|
END IF;
|
76 |
|
|
END IF;
|
77 |
|
|
END IF;
|
78 |
|
|
END PROCESS;
|
79 |
|
|
mac <= "1111111" & shifter; -- DNA sur 57 bits et MAC sur 64
|
80 |
|
|
|
81 |
|
|
-- Instantiation de la ressource DNA du FPGA
|
82 |
|
|
dn_port_inst : DNA_PORT
|
83 |
|
|
GENERIC MAP (
|
84 |
|
|
sim_dna_value => TO_BITVECTOR(sim_dna_value)
|
85 |
|
|
)
|
86 |
|
|
port map (
|
87 |
|
|
dout => dout,
|
88 |
|
|
clk => clk_sys,
|
89 |
|
|
din => gnd,
|
90 |
|
|
read => read_r,
|
91 |
|
|
shift => shift
|
92 |
|
|
);
|
93 |
|
|
|
94 |
|
|
END rtl;
|
95 |
|
|
|