Xilinx y VHDL · ¿Por qué este puerto INOUT no está definido?

0

Estoy usando Xilinx ISE 13.1 x64 WebPack para una asignación universitaria y estoy implementando un BCT por el bien de ella. Es un ternario codificado en binario. Como un BCD, pero con solo tres dígitos (0, 1 y 2), para disminuir la cantidad de puertas lógicas. Hice todas las ecuaciones y se me ocurrió el circuito.

Pareceextrañoporque,alparecer,XilinxISEnopermitequelasredestenganmásdeunnombre.Entonces,comounaconvención,utilicélaletra'i'comopuntoycomayreunítodoslosnombresenunasolared.Lasredesquecomienzancon's'sonlossegmentosdeunapantalladesietesegmentos.'A'y'B'sonlasentradas.'Bisg'esINOUTporqueelsegmento'g'sigueelvalordelaentrada'B'.Elsegmento'b'siemprees'1'.Elsegmento'c'es'NOB'.Yasísucesivamente.

Prefieronousarunbúferparasepararlasentradasdelassalidasycrearredesconnombresdiferentes,porquequieroversiesposiblehacerlodeestamanera.Lared'Bisg'comoINOUTtienesentidoporqueelcircuitoexternoquelaalimentarátambiénalimentaráelcircuitoquenecesitalaseñal'g'delsegmento.

Sinembargo,cuandoprobéesto,nofuncionócomoseesperaba.Recordéacerolosvaloresalinicio,perocuandosesuponíaquedebíainvertirsuvalor,sefuea"indefinido" y se mantuvo allí. Aquí está el banco de pruebas:

-- Vhdl test bench created from schematic C:\Xilinx\projects\RelogioDigital\BCT.sch - Sat Mar 22 00:30:41 2014
--
-- Notes: 
-- 1) This testbench template has been automatically generated using types
-- std_logic and std_logic_vector for the ports of the unit under test.
-- Xilinx recommends that these types always be used for the top-level
-- I/O of a design in order to guarantee that the testbench will bind
-- correctly to the timing (post-route) simulation model.
-- 2) To use this template as your testbench, change the filename to any
-- name of your choice with the extension .vhd, and use the "Source->Add"
-- menu in Project Navigator to import the testbench. Then
-- edit the user defined section below, adding code to generate the 
-- stimulus for your design.
--
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
LIBRARY UNISIM;
USE UNISIM.Vcomponents.ALL;
ENTITY BCT_BCT_sch_tb IS
END BCT_BCT_sch_tb;
ARCHITECTURE behavioral OF BCT_BCT_sch_tb IS 

    COMPONENT BCT
    PORT( Bisg  :   INOUT   STD_LOGIC; 
             A  :   IN  STD_LOGIC; 
             Bnisc  :   OUT STD_LOGIC; 
             sf :   OUT STD_LOGIC; 
             saisdise   :   OUT STD_LOGIC; 
             sb :   OUT STD_LOGIC);
    END COMPONENT;

    SIGNAL Bisg :   STD_LOGIC := '0';
    SIGNAL A    :   STD_LOGIC := '0';
    SIGNAL Bnisc    :   STD_LOGIC;
    SIGNAL sf   :   STD_LOGIC;
    SIGNAL saisdise :   STD_LOGIC;
    SIGNAL sb   :   STD_LOGIC;

BEGIN

    UUT: BCT PORT MAP(
        Bisg => Bisg, 
        A => A, 
        Bnisc => Bnisc, 
        sf => sf, 
        saisdise => saisdise, 
        sb => sb
    );

-- *** Test Bench - User Defined Section ***
    A <= not A after 10 ns;
    Bisg <= not Bisg after 20 ns;
    tb : PROCESS
    BEGIN
        WAIT; -- will wait forever
    END PROCESS;
-- *** End Test Bench - User Defined Section ***

END;

Desordenado ISim y encontré una opción para mostrar los controladores para una señal dada. Dice que tanto el banco de pruebas como la descripción de VHDL están dirigiendo esta señal a 'U'. En caso de que sea útil, aquí está el VHDL generado:

--------------------------------------------------------------------------------
-- Copyright (c) 1995-2011 Xilinx, Inc.  All rights reserved.
--------------------------------------------------------------------------------
--   ____  ____ 
--  /   /\/   / 
-- /___/  \  /    Vendor: Xilinx 
-- \   \   \/     Version : 13.1
--  \   \         Application : sch2hdl
--  /   /         Filename : BCT.vhf
-- /___/   /\     Timestamp : 03/22/2014 00:31:07
-- \   \  /  \ 
--  \___\/\___\ 
--
--Command: sch2hdl -intstyle ise -family spartan3 -flat -suppress -vhdl C:/Xilinx/projects/RelogioDigital/BCT.vhf -w C:/Xilinx/projects/RelogioDigital/BCT.sch
--Design Name: BCT
--Device: spartan3
--Purpose:
--    This vhdl netlist is translated from an ECS schematic. It can be 
--    synthesized and simulated, but it should not be modified. 
--

library ieee;
use ieee.std_logic_1164.ALL;
use ieee.numeric_std.ALL;
library UNISIM;
use UNISIM.Vcomponents.ALL;

entity BCT is
    port ( A        : in    std_logic; 
             Bnisc    : out   std_logic; 
             saisdise : out   std_logic; 
             sb       : out   std_logic; 
             sf       : out   std_logic; 
             Bisg     : inout std_logic);
end BCT;

architecture BEHAVIORAL of BCT is
    attribute BOX_TYPE   : string ;
    signal An          : std_logic;
    signal Bnisc_DUMMY : std_logic;
    component INV
        port ( I : in    std_logic; 
                 O : out   std_logic);
    end component;
    attribute BOX_TYPE of INV : component is "BLACK_BOX";

    component AND2
        port ( I0 : in    std_logic; 
                 I1 : in    std_logic; 
                 O  : out   std_logic);
    end component;
    attribute BOX_TYPE of AND2 : component is "BLACK_BOX";

    component OR2
        port ( I0 : in    std_logic; 
                 I1 : in    std_logic; 
                 O  : out   std_logic);
    end component;
    attribute BOX_TYPE of OR2 : component is "BLACK_BOX";

    component VCC
        port ( P : out   std_logic);
    end component;
    attribute BOX_TYPE of VCC : component is "BLACK_BOX";

begin
    Bnisc <= Bnisc_DUMMY;
    XLXI_1 : INV
        port map (I=>A,
                     O=>An);

    XLXI_5 : INV
        port map (I=>Bisg,
                     O=>Bnisc_DUMMY);

    XLXI_20 : AND2
        port map (I0=>An,
                     I1=>Bnisc_DUMMY,
                     O=>sf);

    XLXI_41 : OR2
        port map (I0=>An,
                     I1=>Bisg,
                     O=>saisdise);

    XLXI_42 : VCC
        port map (P=>sb);

end BEHAVIORAL;

Entonces, ¿hay un error en lo que hice o es imposible superar la "falta de característica" de ISE y tener que recurrir a puertas lógicas adicionales?

    
pregunta GuiRitter

1 respuesta

1

Bisg es una señal de ENTRADA y no una ENTRADA a pesar de que tiene otros usos (segmento de conducción G en el nivel superior).

Para ver esto; refleja que NADA en tu componente en realidad impulsa BISG.

Por lo tanto, se considera que su componente lo impulsa con un nivel inicial indefinido; es decir, 'U', y la combinación de esa 'U' con cualquier nivel de conducción externo es, como dice ISIM, 'U'.

Tienes 2 opciones para solucionarlo:

(1) haga que BISG sea una ENTRADA ya que no lo está conduciendo. Este es el más simple y, en este caso, correcto.

(2) Conduzca BISG en su componente con 'Z', es decir, elimine la salida 'U' del componente. 'Z' significa "alta impedancia: es decir, no luches contra ninguna fuente externa (tu banco de pruebas) que maneja el pin. Esto generalmente se hace para permitir la comunicación bidireccional en una señal. Los dos extremos deben coincidir (de alguna manera) qué extremo es permitido para conducir la señal y el otro extremo debe conducir 'Z'.

En su caso, agregando la línea

BISG <= 'Z';

(después de "comenzar") a su componente BCT debería resolver el problema. (Sí, está modificando el archivo etiquetado "no modificar", y la modificación desaparecerá la próxima vez que compile el esquema en VHDL).

Luego vuelva a ejecutar la simulación y todo debería estar bien.

No sé si hay una manera de implementar la solución 2 en el esquema, y no me importa: en estos días el enfoque esquemático es una pérdida total de tiempo. Todo su esquema se reduce a (la entidad original, y)

architecture HDL of BCT is
begin
   Bisg     <= 'Z';
   Bnisc    <= not Bisg;
   sf       <= not Bisg and not A;
   saisdise <= Bisg or not A;
   sb       <= '1';
end HDL;

Y se simplifica aún más si Bisg es una entrada ...

¿Cuál crees que es más rápido de crear y más fácil de leer?

EDITAR: si necesita una salida para controlar el segmento G, no hay nada malo con un puerto G separado, dirigido directamente desde la entrada B, como G <= B; o un cable en el esquema.

    
respondido por el Brian Drummond

Lea otras preguntas en las etiquetas