• No se han encontrado resultados

9. Aplicación de demostración

9.2. Parte hardware

y mínimo configurables que se programan desde la parte software del diseño. El funcionamiento de la aplicación realizada se puede observar en las imáge- nes 9.2, 9.3 y 9.4.

9.2.

Parte hardware

La parte hardware del diseño se ha definido en un fichero vhdl, hwpart.vhd. Este módulo HW recibe, además de las señales globales de reset y clk, la señal de entrada del bus APB (apbi) y sus salidas son la señal de salida del bus APB (apbo) y las señales que encenderán los leds del display de siete segmentos. Las señales apbi y apbo son las entradas y salidas APB, y son de tipo APB_Slv_In_Type y APB_Slv_Out_Type, que son ‘records’, o conjunto de señales2: cada uno contie- ne todas las señales que se utilizan para la entrada (o salida) de señales APB al módulo.

Figura 9.1: Esquema de entradas y salidas del módulo HW

Los records APB_Slv_In_Type y APB_Slv_Out_Type se definen en el fichero

2Unir las señales por grupos funcionales es una muy buena idea y simplifica enormemente el conexionado de los elementos de la jerarquía de un diseño.

Aplicación de demostración 9.2 Parte hardware

amba.vhd del modelo de Leon 2:

--- -- Constant definitions for AMBA(TM) APB

--- constant PDMAX: Positive range 8 to 32 := 32; -- data width

constant PAMAX: Positive range 8 to 32 := 32; -- address width --- -- Definitions for AMBA(TM) APB Slaves

--- -- APB slave inputs (PCLK and PRESETn routed separately)

type APB_Slv_In_Type is record

PSEL: Std_ULogic; -- slave select PENABLE: Std_ULogic; -- strobe

PADDR: Std_Logic_Vector(PAMAX-1 downto 0); -- address bus (byte) PWRITE: Std_ULogic; -- write

PWDATA: Std_Logic_Vector(PDMAX-1 downto 0); -- write data bus end record;

-- APB slave outputs type APB_Slv_Out_Type is

record

PRDATA: Std_Logic_Vector(PDMAX-1 downto 0); -- read data bus end record;

El comportamiento del módulo ‘hwpart’ está definido básicamente por cuatro procesos concurrentes:

1. El proceso calc_p_value implementa el comportamiento del contador: cada segundo, si el valor del contador llega al máximo, se cambia el comporta- miento a decrecer (going_up = ’0’) y reduce su valor, y si llega al mínimo, cambia el comportamiento (going_up = ’1’ ). Además, si los valores míni- mo y máximo son el mismo, el contador toma ese valor, lo que nos permite precargar el contador a un valor concreto.

2. Los procesos calc_left_led y calc_right_led calculan las señales que irán a los displays de 7 segmentos a partir del valor del contador. Para aprovechar todo el rango entre 0 y 255, cada uno de los dígitos led representará un dígito en hexadecimal (es decir, tomará valores entre 0 y F).

3. Por último, el proceso sinc se encarga de capturar los valores de las señales síncronas.

El módulo hwpart interpreta la información que recibe por el bus APB de la siguiente forma: los 8 bits menos significativos del dato recibido serán el valor mínimo del contador, y los siguientes 8 bits serán el valor máximo. El resto de bits recibidos se descarta.

Por lo que a la salida respecta, el módulo hardware siempre está comunicando el valor del contador por el bus APB, pero sólo se podrá leer dicho valor cuando la dirección en el bus AMBA sea la del módulo hardware.

Aplicación de demostración 9.2 Parte hardware

--- --

-- This file is a heavily modified version of ioport.vhd

-- as a derived work of the file and also of the Leon 2 processor, -- the license which applies is

-- the GNU Lesser General Public License. -- See below for details.

--

--- --

-- The original file is a part of the LEON VHDL model -- and has Copyright (C) 1999 European Space Agency (ESA) --

-- This library is free software; you can redistribute it and/or -- modify it under the terms of the GNU Lesser General Public -- License as published by the Free Software Foundation; either -- version 2 of the License, or (at your option) any later version. --

-- See the file COPYING.LGPL for the full details of the license. -- -- --- -- -- Entity: hwpart -- File: hwpart.vhd

-- Author: Hipólito Guzmán Miranda (based on J. Gaisler’s ioport.vhd) -- Description: HW part of a sample codesign application.

-- --- library IEEE; use IEEE.std_logic_1164.all; --use IEEE.std_logic_signed."-"; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all; use work.config.all; use work.iface.all; use work.macro.genmux; use work.amba.all; entity hwpart is port ( rst : in std_logic; clk : in clk_type; apbi : in apb_slv_in_type; apbo : out apb_slv_out_type;

left_led : out std_logic_vector (6 downto 0); right_led : out std_logic_vector (6 downto 0) );

end;

architecture rtl of hwpart is

constant CYCLESPERSECOND : integer := 20000000;

signal value, p_value : integer range 0 to 255; -- 8 bits signal value_max, value_min : integer range 0 to 255; -- 8 bits signal value_bits : std_logic_vector (7 downto 0);

signal left_digit, right_digit : std_logic_vector (3 downto 0); --digits signal cyclecount, p_cyclecount : integer range 0 to 33554432; -- 25 bits

-- this is not optimal and could be split into a cycle counter -- and a msec counter

Aplicación de demostración 9.2 Parte hardware

signal filler : std_logic_vector(PDMAX-1 downto 8); signal received_APB_data, p_received_APB_data :

std_logic_vector(PDMAX-1 downto 0); signal going_up, p_going_up : std_logic; -- direction of the count begin

filler <= (others => ’0’);

p_cyclecount <= 0 when cyclecount = CYCLESPERSECOND else cyclecount + 1; value_bits <= conv_std_logic_vector(value,8);

left_digit(3 downto 0) <= value_bits(7 downto 4); right_digit(3 downto 0) <= value_bits(3 downto 0); -- The APB input:

p_received_APB_data <= apbi.pwdata when

(apbi.psel and apbi.penable and apbi.pwrite) = ’1’ else received_APB_data; value_max <= conv_integer(received_APB_data (15 downto 8));

value_min <= conv_integer(received_APB_data (7 downto 0)); sinc: process (rst, clk) begin if (rst=’0’) then value <= 0; cyclecount <= 0; received_APB_data <= (others => ’0’); going_up <= ’1’;

elsif (clk=’1’ AND clk’event) then value <= p_value;

cyclecount <= p_cyclecount;

received_APB_data <= p_received_APB_data; going_up <= p_going_up;

end if; end process sinc;

calc_p_value: process (cyclecount, value, value_max, value_min) begin

if (cyclecount = CYCLESPERSECOND) then if (value_max = value_min) then

p_value <= value_max; -- this allows us to preload the counter p_going_up <= going_up;

elsif (value = value_max) then p_going_up <= ’0’;

p_value <= value - 1; elsif (value = value_min) then

p_going_up <= ’1’; p_value <= value + 1; else if (going_up = ’1’) then p_value <= value + 1; else p_value <= value - 1; end if; p_going_up <= going_up; end if; else p_value <= value; end if;

end process calc_p_value;

-- Here we convert HEX to BCD calc_left_led: process (left_digit)

Aplicación de demostración 9.2 Parte hardware begin case left_digit is when "0000" => left_led <= "1110111"; -- 0 when "0001" => left_led <= "0010010"; -- 1 when "0010" => left_led <= "1011101"; -- 2 when "0011" => left_led <= "1011011"; -- 3 when "0100" => left_led <= "0111010"; -- 4 when "0101" => left_led <= "1101011"; -- 5 when "0110" => left_led <= "1101111"; -- 6 when "0111" => left_led <= "1010010"; -- 7 when "1000" => left_led <= "1111111"; -- 8 when "1001" => left_led <= "1111010"; -- 9 when "1010" => left_led <= "1111110"; -- A when "1011" => left_led <= "0101111"; -- b when "1100" => left_led <= "1100101"; -- C when "1101" => left_led <= "0011111"; -- d when "1110" => left_led <= "1101101"; -- E when "1111" => left_led <= "1101100"; -- F when others => left_led <= "0000000"; -- default end case;

end process calc_left_led;

calc_right_led: process (right_digit) begin case right_digit is when "0000" => right_led <= "1110111"; -- 0 when "0001" => right_led <= "0010010"; -- 1 when "0010" => right_led <= "1011101"; -- 2 when "0011" => right_led <= "1011011"; -- 3 when "0100" => right_led <= "0111010"; -- 4 when "0101" => right_led <= "1101011"; -- 5 when "0110" => right_led <= "1101111"; -- 6 when "0111" => right_led <= "1010010"; -- 7 when "1000" => right_led <= "1111111"; -- 8 when "1001" =>

Aplicación de demostración 9.3 Parte software

Documento similar