TTL74185

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Nachbau eines Standard TTL, des 74185 (6 bit binary zu BCD). Siehe Forum: http://www.mikrocontroller.net/topic/55594 .

Code ist nicht simuliert, läuft aber einwandfrei durch Synthese.

Wandelt man Eingang zu integer wird der code besser lesbar.

Dann werden hier zwei Varianten gezeigt, zuerst die mit logischen Gleichungen für die Ausgänge. Um es dem Synthese-Tool leichter zu machen, wird das untere Eingangsbit nicht mit ausgewertet. Durch die select Anweisung beschreibt man eine Wahrheitstabelle die einfach in LUTs und Multiplexer umgewandelt wird (Xilinx). Bei Altera mit den 6 Input LUTs spart man sich die Multiplexer.

<vhdl> LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.numeric_std.ALL;

--vhdl description of 74185 --6bit binary to 2 digits BCD decoder

ENTITY ttl74185 IS

 PORT (
   binary_i : IN  STD_LOGIC_VECTOR(5 DOWNTO 0);
   bcd_o    : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));

END ttl74185;

ARCHITECTURE behave OF ttl74185 IS

 --integers are better readable for humans
 SIGNAL conv_input : integer RANGE 2**5-1 DOWNTO 0;
 

BEGIN -- behave

conv_input <= to_integer(unsigned(binary_i(5 DOWNTO 1)));
 
 bcd_o(0) <= binary_i(0);
 WITH conv_input SELECT
   bcd_o(1) <=
   '1' WHEN    1,'1' WHEN  3, '1' WHEN  6, '1' WHEN  8,
   '1' WHEN   11,'1' WHEN 13, '1' WHEN 16, '1' WHEN 18,
   '1' WHEN   21,'1' WHEN 23, '1' WHEN 26, '1' WHEN 28,
   '1' WHEN   31,
   '0' WHEN OTHERS;
 WITH conv_input SELECT
   bcd_o(2) <=
   '1' WHEN    2,'1' WHEN  3, '1' WHEN  7, '1' WHEN 8,  
   '1' WHEN   12,'1' WHEN 13, '1' WHEN 17, '1' WHEN 18, 
   '1' WHEN   22,'1' WHEN 23, '1' WHEN 27, '1' WHEN 28, 
   '0' WHEN OTHERS;
             
 WITH conv_input SELECT
   bcd_o(3) <=
   '1' WHEN    4,'1' WHEN  9, '1' WHEN 14, '1' WHEN 19,  
   '1' WHEN   24,'1' WHEN 29,
   '0' WHEN OTHERS;
 WITH conv_input SELECT
   bcd_o(4) <=
   '1' WHEN  5,'1' WHEN  6, '1' WHEN  7, '1' WHEN  8, '1' WHEN  9,  
   '1' WHEN 15,'1' WHEN 16, '1' WHEN 17, '1' WHEN 18, '1' WHEN 19,  
   '1' WHEN 25,'1' WHEN 26, '1' WHEN 27, '1' WHEN 28, '1' WHEN 29,  
   '0' WHEN OTHERS;
WITH conv_input SELECT
   bcd_o(5) <=
   '1' WHEN 10,'1' WHEN 11, '1' WHEN 12, '1' WHEN 13, '1' WHEN 14,  
   '1' WHEN 15,'1' WHEN 16, '1' WHEN 17, '1' WHEN 18, '1' WHEN 19,  
   '1' WHEN 30,'1' WHEN 31,
   '0' WHEN OTHERS;

 WITH conv_input SELECT
   bcd_o(6) <=
   '1' WHEN 20,'1' WHEN 21, '1' WHEN 22, '1' WHEN 23, '1' WHEN 24,  
   '1' WHEN 25,'1' WHEN 26, '1' WHEN 27, '1' WHEN 28, '1' WHEN 29,  
   '1' WHEN 30,'1' WHEN 31,
   '0' WHEN OTHERS;
  
  bcd_o(7) <= '0';
 END behave;

</vhdl>

Jetzt eine zweite Variante als ROM-Feld. Diese ist im Xilinx FPGA größer (5 statt 4 slices). Und ungünstiger im Routing die die Signale auf einen Punkt (ROM) und dann wieder von diesem weg geführt werden. Aber dafür auf den ersten Blick verständlich, besonders wenn man den Ausgangsvektor in hex schreibt. Das verstehen auch die Tools besser, diese Variante läuft schneller durch.

<vhdl> ARCHITECTURE behave2 OF ttl74185 IS

   SIGNAL conv_input : INTEGER RANGE 2**6-1 DOWNTO 0;
   TYPE T_BIN2_TO_BCD_TABLE IS ARRAY (natural RANGE <>) OF STD_LOGIC_VECTOR(7 DOWNTO 0);
     CONSTANT C_BIN2_TO_BCD_TABLE  : T_BIN2_TO_BCD_TABLE(0 TO 2**6 - 1) :=
     (X"00", X"01", X"02", X"03", X"04", X"05", X"06", X"07", X"08", X"09",
      X"10", X"11", X"12", X"13", X"14", X"15", X"16", X"17", X"18", X"19",
      X"20", X"21", X"22", X"23", X"24", X"25", X"26", X"27", X"28", X"29",
      X"30", X"31", X"32", X"33", X"34", X"35", X"36", X"37", X"38", X"39",
      X"40", X"41", X"42", X"43", X"44", X"45", X"46", X"47", X"48", X"49",
      X"50", X"51", X"52", X"53", X"54", X"55", X"56", X"57", X"58", X"59",
      X"60", X"61", X"62", X"63");
 BEGIN  -- behave
  conv_input <= to_INTEGER(unsigned(binary_i));
  bcd_o      <= C_BIN2_TO_BCD_TABLE(conv_input);
 END behave2;

</vhdl>