Problema para que la sintaxis de VHDL sea correcta

2

Estoy tratando de aprender VHDL antes de regresar a la escuela. He estado usando el texto Diseño digital con aplicaciones CPLD y VHDL ISBN-13: 978-1401840303 Otras referencias son: enlace y enlace

Lo que estoy tratando de lograr es crear un proyecto que se usará para programar un cpld para que sea un reloj digital independiente. El pin del reloj del cpld se manejará a una base de tiempo de 2 hz desde un cristal de 32768 hz dividido por un contador de rizado de 14 bits (HC4020). Las salidas de cpld dirigirán siete pantallas de segmento.

Para asegurarme de que estoy aprendiendo conceptos importantes, estoy tratando de implementar este proyecto como múltiples entidades que están conectadas entre sí para que el diagrama de bloques sea esencialmente idéntico al de la Fig. 8-10 en El libro de cocina TTl. Intenté comenzar con un ejemplo directamente del libro de texto de Dueck y no se compilará:

—— bcd_7seg.vhd
—— BCD-to-seven-segment decoder
ENTITY bcd_7seg IS
PORT(
d3, d2, d1, d0 : IN BIT;
a, b, c, d, e, f, g : OUT BIT);
END bcd_7seg;
ARCHITECTURE seven_segment OF bcd_7seg IS
SIGNAL input : BIT_VECTOR (3 downto 0);
SIGNAL output: BIT_VECTOR (6 DOWNTO 0);
BEGIN
input <= d3 & d2 & d1 & d0;
WITH input SELECT
output <= “0000001” WHEN “0000”,
“1001111” WHEN “0001”,
“0010010” WHEN “0010”,
“0000110” WHEN “0011”,
“1001100” WHEN “0100”,
“0100100” WHEN “0101”,
“1100000” WHEN “0110”,
“0001111” WHEN “0111”,
“0000000” WHEN “1000”,
“0001100” WHEN “1001”,
“1111111” WHEN others;
—— Separate the output vector to make individual pin outputs.
a <= output(6);
b <= output(5);
c <= output(4);
d <= output(3);
e <= output(2);
f <= output(1);
g <= output(0);
END seven_segment;

comentarios de texto: ¿Por qué no simplemente definir d como un vector? Si deseamos crear un símbolo gráfico para el decodificador de siete segmentos, el método anterior crea un símbolo que se muestra con cuatro entradas separadas pone, en lugar de una sola línea gruesa para una entrada de bus de 4 bits. El diseño funcionará de cualquier manera.

Estoy usando Altera Quartus II 13.0.1 (una versión anterior) ya que es compatible con el EPM7032slc44, que es barato y abundante de digikey. Tengo un chipmaster 6000xp de dispositivos lógicos para programar partes. He intentado cambiar la configuración del proyecto en el ide para cambiar entre vhdl 87 y vhdl 93 y este ejemplo todavía tiene varios errores de sintaxis. Me resulta desconcertante que el compilador solo ladra en las primeras líneas (14-19) de las declaraciones seleccionadas. Cambié las comas finales a punto y coma sin efecto.

Tengo tres cosas que deseo aclarar aquí: A La sintaxis correcta para definir puertos de entidad. B La sintaxis correcta para hacer declaraciones de arquitectura en esos puertos C ¿Cómo hago para hacer declaraciones de entidad y arquitectura para la entidad A a las que puede acceder la entidad B independientemente de si la entidad B usa el vector std_logic (6 abajo a 0) u ocho líneas discretas, por ejemplo, std_logic, b std_logic, etc.

Gracias por su tiempo para leer y comentar.

    
pregunta steverino

1 respuesta

6

VHDL acepta el conjunto de caracteres ISO 8859-1, esto es UTF-8.

Su analizador VHDL está teniendo problemas con algunos de los caracteres como resultado de que copie el texto directamente de un libro.

Sus comentarios no están delimitados por dos guiones (por ejemplo, -- ), sus comillas dobles deben reemplazarse por " .

Después de lo cual se analiza el código VHDL.

No hay una razón discernible por la que d3 , d2 , d1 y d0 no puedan ser reemplazados por un bit_vector. Puede haber usos con la interfaz de puerto presente en el libro.

Los puertos formales están asociados con señales reales en una lista de asociación. Es posible asociar elementos individuales de un vector con un elemento base.

La conversión entre tipos no relacionados estrechamente se puede hacer con rutinas de conversión:

-- bcd_7seg.vhd
-- bcd-to-seven-segment decoder
entity bcd_7seg is
    port(
    d3, d2, d1, d0: in bit;
    a, b, c, d, e, f, g: out bit
    );
end entity;
architecture seven_segment of bcd_7seg is
    signal input : bit_vector (3 downto 0);
    signal output: bit_vector (6 downto 0);
begin
    input <= d3 & d2 & d1 & d0;
    with input select
        output <= "0000001" when "0000",
                  "1001111" when "0001",
                  "0010010" when "0010",
                  "0000110" when "0011",
                  "1001100" when "0100",
                  "0100100" when "0101",
                  "1100000" when "0110",
                  "0001111" when "0111",
                  "0000000" when "1000",
                  "0001100" when "1001",
                  "1111111" when others;
-- separate the output vector to make individual pin outputs.
    a <= output(6);
    b <= output(5);
    c <= output(4);
    d <= output(3);
    e <= output(2);
    f <= output(1);
    g <= output(0);
end architecture;

library ieee;
use ieee.std_logic_1164.all;

entity bcd_tb is
end entity;

architecture foo of bcd_tb is
    signal d:  std_logic_vector (3 downto 0) := "0100";
    signal output:    std_logic_vector (6 downto 0);
begin
DUT:
    entity work.bcd_7seg
        port map (
            d3 => to_bit(d(3)),
            d2 => to_bit(d(2)),
            d1 => to_bit(d(1)),
            d0 => to_bit(d(0)),
            to_stdulogic(a) => output(6),
            to_stdulogic(b) => output(5),
            to_stdulogic(c) => output(4),
            to_stdulogic(d) => output(3),
            to_stdulogic(e) => output(2),
            to_stdulogic(f) => output(1),
            to_stdulogic(g) => output(0)
        );
end architecture;

También puede asociar elementos individuales de un puerto de tipo de matriz con el tipo de elemento base o usar las funciones de conversión como se muestra arriba para convertir entre el bit de tipo y el tipo de elemento para std_logic_vector.

    
respondido por el user8352

Lea otras preguntas en las etiquetas