Le microprocesseur 6809 et kit JHL68B09

Il s'agit ici de reconstituer une version modernisée d'un système informatique à base de 6809 construit dans les années 70. Modernisée en ce sens qu'à l'époque, par mesure d'économie, la RAM utilisée était dynamique et donc nécessitait un système de rafraichissement. Nous utiliserons une RAM statique. RAM et ROM occuperont tout l'espace possible de 64Ko du 68B09. Avec la limitation de la taille ROM à 32K. Taille (ROM) + Taille (RAM) = 64Ko
Modernisée aussi car, les signaux de sélection des composants seront issus d'un GAL au lieu de nombreux composants discrets de la famille 74LS...


Le synoptique du prototype

La technologie retenue est du type 68Bxx. Elle permet de faire travailler le CPU à 8MHZ, soit deux fois la fréquence du composant de base. Le prototype est conçu avec un seul composant d'entrée/sortie: l'ACIA 68B50. Il s'agit d'un contrôleur de communication série asynchrone. Il permettait de de communiquer avec un terminal (TTY) de type VT100 ou autre. Ce composants transforme les données binaires, composées de mots de 8bits, en un signal porté par un seul fil. Les 8 bits étant émis les uns à la suite des autres (en série). Ce principe sera décrit plus loin.


La communication avec ce type de terminal se faisait selon une norme physique nommée RS232. Dans cette norme, les 0 et 1 binaires se présentent sous la forme de tensions de -12V et +12V.
Aujourd'hui, il devient difficile de trouver ce type de terminal. On pourra utiliser un PC converti logiciellement en Terminal VT100 mais communiquant via son port USB. Dans les années 70, la conversion TTL (coté ACIA) vers RS232 (coté terminal) nécessitait une alimentation de ±12V en plus de l'alimentation électrique de 5V TTL. Les composants historiques de conversion étaient souvent le couple (MC1488 et MC1489). Aujourd'hui, les composants de conversion intègre un convertisseur 5/±12V comme le MAX232. Donc, plus besoin d'une alimentation supplémentaire de ±12V.

Conversion TTL Série / USB

Aujourd'hui, la conversion TTL/RS232/USB sera assurée par un circuit qui effectue toute la chaîne de conversion. On trouve dans le commerce, de petit module bon marché assurant cette conversion.
IL faut ajouter à cela l'installation d'un device driver sur le PC, faisant «croire» à celui-ci qu'il communique via un port série RS232. On pourra choisir de bien distinguer la conversion TTL/RS232 et RS232/USB. C'est l'option retenue ici.


Sérialisation

Cet opération est assurée par des composants appelés ACIA, USART, UART. L'Acia 68B50 est un sérialiseur. C'est à dire, qu'il transforme un mot de 8 bits émis en parallèle. sur le bus de donnée nommé Data sur la figure ci-contre en une série de bits transmis sur le fil nommé Tx. Les bits sont émis au rythme de l'horloge Clk.
A l'inverse, un signal de la même nature reçu sur Rx sera recomposé sur le bus Data.
La synchronisation des échanges est assurée par un bit de START et un bit de STOP entre les bits de données sérialisés sur Tx et Rx.

Les bits non obligatoires sont :
  • P (pas de contrôle de parité)
  • B7 ( les mots émis sont codés sut 7 bits).
L'Acia doit être paramétré pour :
  • la durée du bit de stop.
  • la taille du mot (7 ou 8 bits).
  • la présence d'un bit de parité et sa nature (odd ou even).
  • la fréquence d'émission en baud (bit/seconde) sous la forme d'une division de FClk /4 puis par 16 ou 64. Fbaud= FClk /(64 | 256).

  • 110 baud
  • 300 baud
  • 1 200 baud
  • 2 400 baud
  • 4 800 baud
  • 9 600 baud
  • 19 200 baud
  • 38 400 baud
  • 57 600 baud
  • 115 200 baud (10 500 octets/s)
La fréquence de communication choisie pour le prototype sera de 115 200 baud. L'horloge sera issue du signal E du CPU qui en théorie est de fréquence 8MHZ. Dans ce cas le rapport F(E)/F(baud) est 8 000 000/ 115 200 = 69.4.
Cette division étant devant être assurée par l'Acia et ne pouvant prendre que les valeurs 64 ou 256, il faudrait que F(E) soit égale à 64 x 115 200 = 7 372 800 Hz.>br /> Avec ue division par 256, on obtient une communication à 28 800 baud.
Le quartz qui cadence le CPU sera un 7,3728MHz et non un 8MHz. A cette cadence, un écran de 80 colonnes x 24 lignes est affiché en 0.18 s.

Norme RS232

On trouvera un article Wikipédia sur le sujet ici .
Elle porte sur
  • les niveaux électriques des signaux binaires (0/1). Avec 0 ==> +V et 1 ==> -V). V étant compris entre 3 et 15V.
  • des signaux de contrôle additionnels permettant de réguler le débit des données.
  • le câblage des connecteurs DB25 ou DB9 portant les signaux.
  DB9    DB25  SignalNom Direction
1 8 DCD Data Carrier Detect In
23 RXD Receive Data In
32 TXD Transmit Data Out
4 20 DTR Data Terminal Ready Out
5 7 GND Ground -
6 6 DSR Data Set Ready In
7 4 RTS Request to Send Out
8 5 CTS Clear to Send In
9 22 RI Ring Indicator In

Cartographie mémoire

Cette cartographie est gérée via un circuit GAL 20V8, dont les broches sont fixées comme ci-contre.
Les broches (SIZE_1, SIZE_0) permettent de choisir la cartographie.

SIZE_1SIZE_0ROM SIZEIO SIZERAM SIZE *
0 0 2KB 512B 61.5KB
0 1 4KB 512B 59.5KB
1 0 8KB 512B 55.5KB
1 1 16KB 512B 47.5KB

(*) RAM SIZE = 64KB - 0.5KB - ROM SIZE

Les étendues des espaces ROM, RAM et IO sont

ROM SIZEIO SIZERAM SIZE *RAM RANGE IO RANGE ROM RANGE
2KB 512B 61.5KB 0000 - F5FFF600 - F7FFF800 - FFF
4KB 512B 59.5KB 0000 - EDFFEE00 - EFFFF000 - FFF
8KB 512B 55.5KB 0000 - DDFFDE00 - DFFFE000 - FFF
16KB 512B 47.5KB 0000 - BDFFBE00 - BFFFC000 - FFF


Programmation du GAL

L'espace IO de 512 octets est divisé en 4 sous-espace de 128 octets (I00 à IO3).
On trouvera ici le fichier JED pour la programmation du GAL

Un extrait du code VHDL ayant permit la programmation du GAL est donné ci-dessous. le code complet est téléchargeable ici.
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity test1 is
  port(A : in  std_logic_vector(15 downto 7); 
   SIZE: in  std_logic_vector(1 downto 0);
   E   : in std_logic;
   RW  : in std_logic;
   RAM, ROM, IO0, IO1, IO2, IO3, READ, WRITE : out std_logic);
  ATTRIBUTE LOC : string;
-- Inputs
  ATTRIBUTE LOC OF  A    : SIGNAL IS "1 2 3 4 5 6 7 8 9";
  ATTRIBUTE LOC OF  E    : SIGNAL IS "14";
  ATTRIBUTE LOC OF  RW   : SIGNAL IS "23";
  ATTRIBUTE LOC OF  SIZE : SIGNAL IS "10 11";

-- Outputs
  ATTRIBUTE LOC OF  READ  : SIGNAL IS "22";
  ATTRIBUTE LOC OF  WRITE : SIGNAL IS "21";  
  ATTRIBUTE LOC OF  ROM   : SIGNAL IS "20";
  ATTRIBUTE LOC OF  RAM   : SIGNAL IS "19";  
  ATTRIBUTE LOC OF  IO0   : SIGNAL IS "18";
  ATTRIBUTE LOC OF  IO1   : SIGNAL IS "17";
  ATTRIBUTE LOC OF  IO2   : SIGNAL IS "16";
  ATTRIBUTE LOC OF  IO3   : SIGNAL IS "15";
end;

architecture test1 of test1 is
begin
  process(SIZE)
  variable IO : std_logic := '0';
  begin
  case SIZE is
  -- ROM de 2Ko
  when "00" =>
    ROM <= not (A(15) and A(14) and A(13) and A(12) and A(11));
    IO  := A(15) and A(14) and A(13) and A(12) and  not A(11) and A(10) and A(9);
  when "01" =>
    ROM <= not (A(15) and A(14) and A(13) and A(12));
    IO  := A(15) and A(14) and A(13) and not A(12) and  A(11) and A(10) and A(9) ;
  when "10" =>
    ROM <= not (A(15) and A(14) and A(13));
    IO  := not A(15) and A(14) and  A(13) and A(12) and A(12) and A(11) and A(9);
  when "11" =>
    ROM <= not (A(15) and A(14));
    IO  := A(15) and not A(14) and A(13) and A(12) and A(11) and A(10) and A(9);
    end case;
    IO0 <= not (IO and not A(8)  and not A(7)); 
    IO1 <= not (IO and not A(8) and A(7)); 
    IO2 <= not (IO and A(8) and not A(7)); 
    IO3 <= not (IO and A(8) and A(7));
    RAM <= not(ROM) or not(IO);  -- to /CS of RAM
    WRITE <= not(E and not(RW)); -- to /WE of RAM
    READ  <= not(E and RW);       -- to /CE of ROM

  end process;
end test1;
		

ROM

Le composant ROM choisi est une EEPROM ATMEL AT28C256-15PU / DIP-28 d'une capacité de 32,768 mots de 8 bits. Programmable et effaçable électriquement. Dans la version du prototype actuel, seuls 2, 4 , 8 ou 16K seront utilisés. Ce choix pourra varier dans le future.
Les signaux /READ, /ROM sont issus du circuit GAL.

Pour la première mise en œuvre, la configuration ROM sera minimale : 2Ko.pour cela les entrées de GAL (SIZE_1, SIZE_0) = (0,0). L'ACIA sera sélectionné par le signal /IO0.

RAM

La RAM statique choisie est une K6T4008C1B-DL70 / DIP-32 d'une capacité de 512 Koctets.Seuls 64Ko seront utlisés (les bits A18, A17 et A16 seront forcés à 0).
Les signaux /WRITE, /RAM sont issus du circuit GAL. E st issu du CPU 68B09.

ACIA (USART)

Le composant ACIA

Sources et références

[ 1] The Missing 6809 UniFLEX Archive (K. R. Lewis)

[ 2] GAL20V8 : Datasheet