multiplexer_3to1.vhdl

library ieee;
use ieee.std_logic_1164.all;

-- uzywamy mojego_pakietu
use work.moj_pakiet.all;


-- deklarujemy multiplexer 3 wejsciowy
entity mux_3to1 is
  port (
    -- tryb jest wartoscia 2 bitowa
    MODE: in std_logic_vector (1 downto 0);
    -- mamy 3 wejscia
    a,b,c: in std_logic;
    -- i jedno wyjscie
    DATA_OUT: out std_logic
  );
end;


-- definiujemy architekture naszego multipleksera
architecture z_N_bitowego of mux_3to1 is
  -- gdy chcemy wykorzystac jakis element musimy przytoczyc
  -- (lekko zmodyfikowana) tresc jego entity w postaci opisu komponentu:
  component mux is
    generic (
      M: natural := 4
      -- nadpisujemy domyslna ilosc bitow
    );
    port (
      MODE: in integer range 0 to M-1;
      DATA_IN: in std_logic_vector (M-1 downto 0);
      DATA_OUT: out std_logic
    );
  end component;
  
  -- deklaujemy wewnetrzne pomocnicze sygnaly
  signal tryb: integer range 0 to 2;
  signal wejscie: std_logic_vector (3 downto 0);
  
  begin
    wejscie <= '-' & c & b & a;
    -- musimy podac tez najwyzszy bit (aby jego bitowosc byla 2^N)
    -- jako ze nie jest on nam potrzebny a korzystamy z std_logic to podajemy "don't cary"
    
    -- przy pomocy funkcji to_int z moj_pakiet konwertujemy wartosc binarna na integer
    tryb<=to_int(MODE);
    
    -- mapujemy odpowiednie wejscia i wyjscia dla egzemplarza komponentu multiplexer
    -- okreslonego etykieta mux_31
    mux_31: mux port map (MODE=>tryb, DATA_IN=>wejscie, DATA_OUT=>DATA_OUT);
    -- etykiety mozemy podac w kazdej linii vhdl, ale tylko w niektorych wypadkach jest
    -- to wymagane (wlasnie taka sytuacja ma tutaj miejsce)
end;


-- mozna takze okreslic konfiguracje komponentow uzywanych do budowy architektury
configuration mux_3to1_config of mux_3to1 is
  for z_N_bitowego -- dla architektury "z_N_bitowego"
    for mux_31: mux use entity
      work.multiplexer(logic);
    end for;
    -- tu muglbybyc kolejny for dla kolejnych komponentow
  end for;
  -- tu muglby byc kolejny for dla kolejnej architektury
end;
-- gdyby w architekturze zamiast mux podac nazwe komonentu zgodna z jego entity
-- to blok ten bylby niepotrzebny bo uzyta bylaby konfiguracja domyslna


-- architektur moze byc kilka ...
architecture wybierany_case of mux_3to1 is
  begin
    with MODE select DATA_OUT <=
      a when "00",
      b when "01",
      c when "10",
      '-' when others;
      -- w przypadku std_logic formalnie (część kompilatorów tego nie wymaga)
      -- praktycznie zawsze konieczne jest podawanie "when others"
      -- gdyż mamy inne niż 0 i 1 wartości sygnału
end;

architecture proces_case of mux_3to1 is
  begin
    process (a,b,c,MODE)
      begin
        case MODE is
          when "00" => DATA_OUT <= a;
          when "01" => DATA_OUT <= b;
          when "10" => DATA_OUT <= c;
          when others => DATA_OUT <= '-';
        end case;
    end process;
end;

-- UWAGA ze wzgledu na kolejnosc wykonywania instrukcji w ponizszych konstrukcjach
-- oba uklady opisane ponizej moga sie zsyntezowac jako hierarchiczna struktura
-- multiplekserow 2 wejsciowych
--
-- NIE JEST to zatem zalecany opis multipleksera 3 na 1
architecture wybierany_if_else of mux_3to1 is
  begin
    DATA_OUT <= 
      a when MODE = "00" else
      b when MODE = "01" else
      c when MODE = "10" else
      '-';
end;

architecture proces_if_else of mux_3to1 is
  begin
    process (a,b,c,MODE)
      begin
        if MODE="00" then
          DATA_OUT <= a;
        elsif MODE="01" then
          DATA_OUT <= b;
        elsif MODE="10" then
          DATA_OUT <= c;
        else
          DATA_OUT <= '-';
        end if;
    end process;
end;

XHTML generated by highlight (http://www.andre-simon.de/) from multiplexer_3to1.vhdl



Copyright (c) 1999-2015, Robert Paciorek (http://www.opcode.eu.org/), BSD/MIT-type license


Redystrybucja wersji źródłowych i wynikowych, po lub bez dokonywania modyfikacji JEST DOZWOLONA, pod warunkiem zachowania niniejszej informacji o prawach autorskich. Autor NIE ponosi JAKIEJKOLWIEK odpowiedzialności za skutki użytkowania tego dokumentu/programu oraz za wykorzystanie zawartych tu informacji.

This text/program is free document/software. Redistribution and use in source and binary forms, with or without modification, ARE PERMITTED provided save this copyright notice. This document/program is distributed WITHOUT any warranty, use at YOUR own risk.

Valid XHTML 1.1 Dokument ten (URL: http://www.opcode.eu.org/programing/vhdl/multiplexer_3to1.vhdl) należy do serwisu OpCode. Autorem tej strony jest Robert Paciorek, wszelkie uwagi proszę kierować na adres e-mail serwisu: webmaster@opcode.eu.org.
Data ostatniej modyfikacji artykulu: '2014-01-07 19:27:39 (UTC)' (data ta może być zafałszowana niemerytorycznymi modyfikacjami artykułu).