4 Stimmen

Verwenden Sie ein Generikum, um die Größe des (de)mux in VHDL zu bestimmen?

Ich möchte ein generisches 'p' verwenden, um festzulegen, wie viele Ausgänge ein Demux haben wird. Eingang und alle Ausgänge sind 1 Bit. Die Ausgänge, die Steuerung und der Eingang können etwas Einfaches wie folgt sein:

signal control: std_logic_vector(log 2 p downto 0); -- Ich kann ein Generikum für das Log2 verwenden.
signal input: std_logic;
signal outputs: std_logic_vector(p-1 downto 0);

Aber wie würde der Mux-Implementierungscode aussehen? Ist das überhaupt möglich?

3voto

Martin Thompson Punkte 16036

Keine Generika erforderlich:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity demux is
    port(
        control : in unsigned;
        input   : in std_logic;
        outputs : out std_logic_vector
        );
end entity demux;

architecture rtl of demux is
    -- Überprüfen Sie die Größe der Eingabevektoren
    assert 2**control'length = outputs'length 
           report "Die Länge der Ausgänge muss 2**Control-Länge betragen" 
           severity failure;
    -- tatsächlich das Demultiplexen durchführen - dadurch werden Feedback-Latches abgeleitet
    outputs(to_integer(unsigned(control))) <= input;

end architecture;

(Ungetestet, nur aus dem Gedächtnis eingegeben...)

Dies wird jedoch Rückfalllatches ableiten - ist das das, was Sie wollen?

0voto

Philippe Punkte 3645

Sie müssen log_p als generisch angeben und p während des Vorgangs berechnen.

library ieee;
use ieee.std_logic_1164.all;
entity demux is
    generic (
        log_p: integer);
    port(
        control : in std_logic_vector(log_p downto 0);
        input :in std_logic;
        outputs : out std_logic_vector(2**log_p - 1 downto 0)
        );
end entity demux;

0voto

Sie müssen sowohl die Anzahl der Ausgänge als auch die Größe des Steuerarrays als Generics übergeben, es sei denn, Sie verwenden immer Potenzen von zwei.

Außerhalb Ihres (De-)Mux-Moduls (d. h. wenn Sie instanziieren), können Sie Code verwenden, um die Anzahl der Bits für den Steuerbus zu berechnen. Ich habe eine Funktion in einem gemeinsamen Paket, das ich verwende, um verschiedene Konfigurationskonstanten und Generics zu initialisieren, die an Code ähnlich wie Ihre (De-)Mux-Anwendung übergeben werden:

-- Berechnen der Anzahl der Bits, die zur Darstellung eines bestimmten Werts erforderlich sind
function NumBits(val: integer) return integer is
    variable result: integer;
begin
    if val=0 then
        result := 0;
    else
        result := natural(ceil(log2(real(val))));
    end if;
    return result;
end;

...was es Ihnen ermöglicht, Dinge wie folgt zu tun:

constant NumOut: integer := 17;
signal CtrlBus: std_logic_vector(NumBits(NumOut)-1 downto 0);

my_mux: demux
generic map (
    NumOut => NumOut,
    NumCtrl => NumBits(NumOut) )
port map (
    control => CtrlBus,
...
...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X