Verbindung zwischen std_logic und std_logic_vector(0 downto 0)

Ich versuche, einen meiner VHDL-Blöcke mit einem von Xilinx generierten Block (einem Dual-Port-RAM) zu verbinden.

Das Problem ist, dass die Schreibfreigabe des RAMs als std_logic_vector (0 bis 0) statt als std_logic definiert ist und ich nicht weiß, wie ich sie verbinden soll.

Der RAM-Block:

component bloque_4
    port(
        ...
        wea : in  std_logic_vector(0 downto 0);
        ...
        );
    end component;

Während die Komponente, die versucht, in diesen Speicher zu schreiben, Folgendes ist:

component bloque_3
    port(
        ...
        write_en_b3 : out std_logic;
        ...
        );
    end component;

In der Testbench, die ich zum Testen der Verbindung geschrieben habe, habe ich ein Signal definiert, um die Kommunikation zwischen den beiden herzustellen:

signal write_en_b34 : std_logic;

Bisher läuft alles super, das Problem tritt auf, wenn ich versuche, das write_en_b34-Signal dem Wea-Port zuzuordnen.

uut: bloque_4 
    port map (
        ...
        wea => write_en_b34,
        ..
        );

Ich verstehe, dass es einen Typenkonflikt gibt, aber ich weiß nicht, wie ich ihn lösen soll. Wie könnte man also einen std_logic_vector (0 bis 0) einer std_logic zuordnen?

Antworten (2)

Mach es so.

uut: bloque_4 
    port map (
        ...
        wea(0) => write_en_b34,
        ..
        );

Es ist völlig in Ordnung, Slices oder Port-Elemente mit einer Mischung aus Signalen und Konstanten zu verknüpfen. Die einzige Einschränkung besteht darin, dass Sie, wenn Sie eines der Portbits zuordnen, alle zuordnen müssen.

Hier ist ein Beispiel für die Entität foo mit einem 8-Bit-port_a.

signal s_1 : std_logic;
signal s_2 : std_logic_vector(3 downto 0);
...
x:  foo
port map(
  port_a(0)          => signal_1,
  port_a(4 downto 1) => signal_2,
  port_a(7 downto 5) => "000"
);

Im obigen Beispiel wäre es ein Fehler, wenn nur einige der Bits in port_a nicht an ein Signal oder einen konstanten Wert angehängt würden. Es wäre kein Fehler, wenn keines der Bits in port_a angehängt wäre, solange der Port einen Standardwert in der Entity-Definition hätte.

IEEE Std 1076-2008 6.5.7 Assoziationslisten, 6.5.7.1 "Ein formales Schnittstellenobjekt muss entweder ein explizit deklariertes Schnittstellenobjekt oder ein Mitglied (siehe 5.1) eines solchen Schnittstellenobjekts sein ... In letzteren Fällen muss eine benannte Assoziation sein wird verwendet, um das Formale und das Aktualität zuzuordnen; die Unterelemente eines solchen Formals werden einzeln zugeordnet. Außerdem muss jedes skalare Unterelement des explizit deklarierten Schnittstellenobjekts genau einmal mit einem Aktualitätselement (oder einem Unterelement davon) verbunden sein ..., und Alle diese Assoziationen müssen in dieser Assoziationsliste in fortlaufender Reihenfolge erscheinen.“

Sie können ein anderes Signal verwenden write_en_b34_vund ihm write_en_b34 zuweisen. Dann können Sie write_en_b34_v der Eingabe des Blocks von Xilinx zuweisen:

signal write_en_b34_v : std_logic_vector(0 downto 0);

(...)

write_en_b34_v(0) <= write_en_b34

(...)

uut: bloque_4 
    port map (
        ...
        wea => write_en_b34_v,
        ..
        );

Es gibt wahrscheinlich noch einen anderen, einfacheren Weg dafür. write_en_b34_vSie können versuchen, Ihren Block auf diese Weise zuzuweisen :

uut: bloque_3 
    port map (
        ...
        wea => write_en_b34_v(0),
        ..
        );

und dann wie oben verwenden. Aber ich bin mir sicher, dass es funktionieren wird.