# CORRECTION
# Ebauche de Testeur de CI logique
# P. Mariano
# Lycée PE Martin
# le 5/12/2023
# Raspberry Pi Pico https://webge.fr/dokuwiki/doku.php?id=microc:uc:rp2
# Bibliothèques
from machine import Pin
import time
time.sleep(0.1) # Attente nécessaire pour l'affichage en console
# GPIO
# Stimulis en sortie
S_A15 = Pin(19, Pin.OUT) # Stimuli A15
S_A14 = Pin(18, Pin.OUT) # Stimuli A14
S_A13 = Pin(17, Pin.OUT) # Stimuli A13
S_A12 = Pin(16, Pin.OUT) # Stimuli A12
S_PSEN = Pin(21, Pin.OUT) # Stimuli PSEN
S_RD = Pin(20, Pin.OUT) # Stimuli RD
# Signaux à analyser en entrée
E_RAM = Pin(26, Pin.IN) # signal RAM issu du circuit testé
E_ROM = Pin(27, Pin.IN) # signal ROM issu du circuit testé
E_OE = Pin(28, Pin.IN) # signal OE issu du circuit testé
# Table de vérité de RAM
# [A15,PSEN] -> RAMa
# V0 [0 , 0] -> 1
# V1 [0 , 1] -> 0
# V2 [1 , 0] -> 1
# V3 [1 , 1] -> 1
# Table de vérité de ROM
# [A15,RD,PSEN] -> ROMa
# V0 [0,0,0] -> 0
# V1 [0,0,1] -> 1
# V2 [0,1,0] -> 0
# V3 [0,1,1] -> 1
# V4 [1,0,0] -> 0
# V5 [1,0,1] -> 0
# V6 [1,1,0] -> 0
# V7 [1,1,1] -> 1
# Table de vérité de OE
# [A15,A14,A13,A12] -> OEa
# V0 [0,0,0,0] -> 0
# |
# |
# V15 [1,1,1,1] -> 1
# Une liste de tuples matérialise la table des vecteurs de test
Vecteurs_RAM = [(0, 0, 1), (0, 1, 0), (1, 0, 1), (1, 1, 1)]
Vecteurs_ROM = [(0, 0, 0, 0), (0, 0, 1, 1), (0, 1, 0, 0), (0, 1, 1, 1), (1, 0, 0, 0), (1, 0, 1, 0), (1, 1, 0, 0), (1, 1, 1, 1)]
# Fonction
def creerVecteursTest(n, vs): # 2^n : nombre de vecteurs, vs : sorties attendues
vecteurs = []
# Correction
vecteur_i = [] # Vecteur de la ligne i dans la table
for i in range(2**n): # Pour n entrées, la table contient les lignes 0 <= i <= (2^n) - 1
# Suppression de '0b' dans la représentation binaire de i
binaire_i = bin(i)[2:] # pour i = 3 binaire_i='11'
# conversion du nombre binaire_i en une liste de booléens
for j in binaire_i:
vecteur_i.append(int(j)) # pour i = 3 vecteur_i = [1,1]
# si la taille du vecteur < n, il est complété par des 0
for _ in range(n-len(vecteur_i)):
vecteur_i.insert(0, 0) # pour i = 3 et n = 3 vecteur_i = [0,1,1]
vecteur_i.append(vs[i]) # Ajout de la valeur attendue pour s
# pour i = 3, n = 3 et vs[i] = 1 vecteur_i = [0,1,1,1]
# Ajout du vecteur i à la table des vecteurs
vecteurs.append(tuple(vecteur_i)) # sous la forme d'un tuple
# pour i = 3, n = 3 et vs[i] = 1, on ajoute (0,1,1,1) à vecteurs
vecteur_i = [] # on vide le vecteur i en cours pour le calcul du vecteur i+1
return vecteurs
# Tests
# Test de la sortie logique RAM
print("[A15,PSEN] -> RAMa,RAMo")
for A15, PSEN, RAMa in Vecteurs_RAM: # RAMa : RAM attendue
if A15 == 0 :
S_A15.off()
else:
S_A15.on()
if PSEN == 0 :
S_PSEN.off()
else:
S_PSEN.on()
RAMo = E_RAM.value() # RAMo : RAM obtenue
if RAMa == RAMo:
print(f"[{A15},{PSEN}] -> {RAMa},{RAMo} ")
else:
print(f"[{A15},{PSEN}] -> {RAMa},Erreur")
# Test de la sortie logique ROM
print("[A15,RD,PSEN] -> ROMa,ROMo")
for A15, RD, PSEN, ROMa in Vecteurs_ROM: # ROMa : ROM attendue
if A15 == 0 :
S_A15.off()
else:
S_A15.on()
if RD == 0 :
S_RD.off()
else:
S_RD.on()
if PSEN == 0 :
S_PSEN.off()
else:
S_PSEN.on()
ROMo = E_ROM.value() # ROMo : sortie obtenue
if ROMa == ROMo:
print(f"[{A15},{RD},{PSEN}] -> {ROMa},{ROMo}")
else:
print(f"[{A15},{RD},{PSEN}] -> {ROMa},Erreur")
# Test de la sortie logique OE
OEattendu = [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]
Vecteurs_OE = creerVecteursTest(4, OEattendu)
print("[A15,A14,A13,A12] -> OEa,OEo ")
for A15, A14, A13, A12, OEa in Vecteurs_OE: # OEa : OE attendue
if A15 == 0 :
S_A15.off()
else:
S_A15.on()
if A14 == 0 :
S_A14.off()
else:
S_A14.on()
if A13 == 0 :
S_A13.off()
else:
S_A13.on()
if A12 == 0 :
S_A12.off()
else:
S_A12.on()
OEo = E_OE.value() # OEo : OE obtenue
if OEa == OEo:
print(f"[{A15},{A14},{A13},{A12}] -> {OEa},{OEo}")
else:
print(f"[{A15},{A14},{A13},{A12}] -> {OEa},Erreur")
RAM
ROM
OE
PSEN
RD
A15
A14
A13
A12