Cours:TP M1102 TP 5 Corr

De troyesGEII
Révision datée du 29 septembre 2020 à 15:21 par SergeMoutou (discussion | contributions) (Troisième façon : on remarque que le problème est de créer deux compteurs cascdés que l'on peut regrouper)
Aller à : navigation, rechercher

TP 5

Exercice 1

L'exercice 1 a déjà été corrigé dans Corrigé du TP4 (Exercice 4). Il ne sera donc réalisé en TP5 que s'il ne l'a pas été en TP 4.

Exercice 2

Question 1

On vous présente plusieurs corrections de cet exercice. L'enseignant les présentera toutes ou en choisira quelques unes.

Comme on utilise le même fichier de contraintes dans les trois façons de faire ci-dessous, on vous donne ce fichier ici :

To,Direction,Location,I/O Bank,VREF Group,Fitter Location,I/O Standard,Reserved,Current Strength,Slew Rate,Differential Pair,Strict Preservation

clk,Input,PIN_P11,,,,3.3-V LVTTL,,,,,

Leds8[0],Unknown,PIN_A8,7,B7_N0,PIN_A8,3.3-V LVTTL,,,,,
Leds8[1],Unknown,PIN_A9,7,B7_N0,,3.3-V LVTTL,,,,,
Leds8[2],Unknown,PIN_A10,7,B7_N0,,3.3-V LVTTL,,,,,
Leds8[3],Unknown,PIN_B10,7,B7_N0,,3.3-V LVTTL,,,,,
Leds8[4],Unknown,PIN_D13,7,B7_N0,,3.3-V LVTTL,,,,,
Leds8[5],Unknown,PIN_C13,7,B7_N0,,3.3-V LVTTL,,,,,
Leds8[6],Unknown,PIN_E14,7,B7_N0,,3.3-V LVTTL,,,,,
Leds8[7],Unknown,PIN_D14,7,B7_N0,,3.3-V LVTTL,,,,,

Première façon : on fait tout soi-même

Le compteur 8 bits utilisé ici était donné dans le TP4. On a simplement modifié le nom de son horloge.

-- Testé le 29/09/20
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
ENTITY compteur IS PORT (
  clk: IN std_logic;
  Leds8: OUT std_logic_vector(7 downto 0));
END compteur;

ARCHITECTURE arch_compteur OF compteur IS
-- les composants :
COMPONENT cmpt8bits IS
  PORT(clk : IN STD_LOGIC;
    cnt : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END COMPONENT cmpt8bits;

COMPONENT cmpt24bits IS
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée
    clk_slow : OUT STD_LOGIC); -- une seule sortie
END COMPONENT cmpt24bits;
-- LE FIL INTENE
SIGNAL s_horloge_lente : std_logic;
BEGIN
  i1 : cmpt24bits PORT MAP(
      clk_50MHz => clk,
      clk_slow => s_horloge_lente);
	 
  i2 : cmpt8bits PORT MAP (
         clk => s_horloge_lente,
	 cnt => leds8);
END arch_compteur;

-- Compteur 8 bits
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
ENTITY cmpt8bits IS
  PORT(clk : IN STD_LOGIC;
    cnt : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END cmpt8bits;
 
ARCHITECTURE arch_cmpt8bits OF cmpt8bits IS
  signal cmpt : std_logic_vector(7 downto 0);
BEGIN
  process(clk) begin
    if rising_edge(clk) then
      cmpt <= cmpt + 1;
    end if;
  end process;
  cnt <= cmpt;  
END arch_cmpt8bits;

-- horloge lente 3 Hz
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
ENTITY cmpt24bits IS
  PORT(clk_50MHz : IN STD_LOGIC; -- une seule entrée
    clk_slow : OUT STD_LOGIC); -- une seule sortie
END cmpt24bits;
 
ARCHITECTURE arch_cmpt24bits OF cmpt24bits IS
  signal cmpt : std_logic_vector(23 downto 0);
BEGIN
  process(clk_50MHz) begin
    if rising_edge(clk_50MHz) then
      cmpt <= cmpt + 1;
    end if;
  end process;
  clk_slow <= cmpt(23);  -- partie combinatoire de construction de l'horloge lente
END arch_cmpt24bits;

Deuxième façon : on utilise les LPM

-- Testé correct le 29/09/20
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
LIBRARY lpm; -- for LPM
USE lpm.lpm_components.ALL;

ENTITY compteur IS PORT (
  clk: IN std_logic;
  Leds8: OUT std_logic_vector(7 downto 0));
END compteur;

ARCHITECTURE arch_compteur OF compteur IS

  -- LE FIL INTENE
  SIGNAL s_horloge_lente : std_logic;

BEGIN
  -- compteur 24 bits
  ic1: lpm_counter GENERIC MAP (
            LPM_WIDTH => 24
  )
  PORT MAP (CLOCK => clk,
            q(23) => s_horloge_lente);
  -- compteur 8 bits
  ic2: lpm_counter GENERIC MAP (
            LPM_WIDTH => 8
  )
  PORT MAP (CLOCK => s_horloge_lente,
            q => Leds8);
END arch_compteur;

Remarquez comme cette façon de faire est compacte. Mais on va vous présenter encore plus compact dans la suite.

Troisième façon : on remarque que le problème est de créer deux compteurs cascdés que l'on peut regrouper

-- Testé correct le 29/09/20
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
LIBRARY lpm; -- for LPM
USE lpm.lpm_components.ALL;

ENTITY compteur IS PORT (
  clk: IN std_logic;
  Leds8: OUT std_logic_vector(7 downto 0));
END compteur;

ARCHITECTURE arch_compteur OF compteur IS

  -- LE FIL INTENE
  SIGNAL s_horloge_lente : std_logic;

BEGIN
  -- compteur 24 bits
  ic1: lpm_counter GENERIC MAP (
            LPM_WIDTH => 32
  )
  PORT MAP (CLOCK => clk,
            q(31 downto 24) => Leds8);  
END arch_compteur;

Non seulement cette façon de faire est la plus compacte, mais en plus c'est elle qui respecte au mieux les règles des horloges dans un FPGA.

Question 2

Question 3

Exercice 3

Exercice 4