Gioco di logica

« Older   Newer »
  Share  
Elemento 38
view post Posted on 24/4/2018, 12:07




Praticamente una PLD/FPGA manuale :)
 
Top
view post Posted on 24/4/2018, 16:18
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Il tempo è poco, e come detto sono parecchio arrugginito. Sto cercando di capire il metodo, a dire il vero di
minimitermini non so nulla.
Qui si sta facendo riferimento ad un implementazione hardware, cioè costruire un circuito in grado di fare quello
descritto sopra, quindi non software, non un programma C, Python o quello che è...
Però domanda (spero di non dire eresie e non andare fuori tema): quando ci si trova di fronte a stabilire se un stringa di dati
(caratteri numeri ecc) è vera o falsa, non conoscendo a priori come sarà la stringa, non vengono comodi gli automi a stati finiti?
Non so l'implementazione hardware se è complicata o cosa.
Mi spiego: se io ho una stringa che è vera, se inizia con 0000, ma poi ha 1 e poi 00 e finisce con 1-->0000100
Ma può essere vera anche se finisce con 555 ecc...
Si corre il rischio di fare una montagna di if.
Gli automi a stati finiti risolvono il problema. Non so se si usano in campo hardware. Ma magari l'esempio sopra potrebbe
calzare.
Io li avevo trovati comodi in certe situazioni (in C intendo però)
Per il resto sto cercando di leggere attentamente.
 
Top
Elemento 38
view post Posted on 24/4/2018, 19:20




(Se ho capito bene il thread) l’obiettivo del circuito logico non penso sia risolvere il problema. Il problema era solo per iniziare il discorso ..? La funzione logica descritta qualche messaggio fa può essere usata (negata) per dare possibile mosse successive, ad esempio.

Macchine a stati finiti sono molto usate in HW, ma in questo caso che la lunghezza del dato da analizzare è finita, fare una rete logica combinatoria è più semplice.

QUOTE
Mi spiego: se io ho una stringa che è vera, se inizia con 0000, ma poi ha 1 e poi 00 e finisce con 1-->0000100
Ma può essere vera anche se finisce con 555 ecc...

Ogni stringa in hardware è rappresentata in binario, il “5” sarà comunque una sequenza di 1 e 0 (110101 se esprimiamo il carattere in ASCII)
 
Top
view post Posted on 24/4/2018, 21:06
Avatar

GWFstory

Group:
Administrator
Posts:
359
Location:
da qui...., quo, qua. Siete curiosi di saperlo, vero? No? Beh, tanto non ve l'avrei detto.

Status:


CITAZIONE
Qui si sta facendo riferimento ad un implementazione hardware, cioè costruire un circuito in grado di fare quello
descritto sopra, quindi non software, non un programma C, Python o quello che è...

CITAZIONE
(Se ho capito bene il thread) l’obiettivo del circuito logico non penso sia risolvere il problema. Il problema era solo per iniziare il discorso

E' proprio così, Ele.
Il discorso dei cannibali e dei missionari era solo un punto di inizio per sviluppare il discorso delle reti logiche e dei metodi per risolverle, che in questo forum non è mai stato trattato.

Si potrebbe arrivare anche a realizzare via hardware il gioco così come l'ho descritto, ma sarebbe un discorso complicato, perchè occorrerebbe creare anche la rete logica "Barca", da caricare e scaricare con vari pulsanti e anche nelle 2 sponde bisognerebbe mettere un selezionatore della persona da far salire sulla barca. Sinceramente non credo che ne valga la pena.

Nel futuro vorrei fare anche questo: (se non volete rovinarvi la sorpresa è meglio che non apriate lo spoiler :rolleyes: )

Dopo questa implementazione hardware (vedremo fino a dove ci spingeremo), vorrei realizzarlo via software, magari usando il linguaggio assembler (così me lo ripasso) e il C, applicati a qualche microcontrollore (probabilmente un PIC, visto che sono quelli che uso spesso).
Vorrei usare entrambi i linguaggi per potere confrontare le caratteristiche di ognuno di essi.


Temo che il discorso stia prendendo una deriva più elettronica che informatica, quindi finiremo probabilmente per andare in OT. Dopo tutto già lo sapevo che sarebbe finita così, dato che era proprio mia intenzione portare avanti una discussione trasversale a varie materie.

CITAZIONE
Per il resto sto cercando di leggere attentamente.

Vai, vai, Gila che dopo i PIC ti impari anche le reti logiche. All'epoca facesti veramente dei begli esperimenti.
 
Top
Elemento 38
view post Posted on 24/4/2018, 22:42




L'algoritmo per la soluzione a pelle mi sembra qualcosa di ricorsivo:
- hai un set di possibili situazioni (il tuo insieme senza i 22 allarmi)
- hai una situazione iniziale (111 111) e una finale (000 000)
- vuoi forzare il sistema ad avere sempre meno cannibali su una sponda

E' semplice da implementare con brute-force ricorsivo in SW, ma non ho una soluzione semplice e veloce in HW ...

Per trovare i possibili allarmi per il tuo circuito, un modo molto veloce e' scrivere uno script per un SAT (https://it.wikipedia.org/wiki/Soddisfacibilità_booleana). Questo caso e' molto semplice perche' ha poche variabili, ma reti booleane moderne possono averne fino a qualche migliaio!
Piccolo script in Python in basso. I vincoli che do' al programma sono:
- variabili intere, con valori possibili 0 o 1 (avrei potuto usare dei booleani, ma sarebbe stato piu' complesso sommarli)
- somma delle variabili c maggiore della somma di variabili m (allarme)

SPOILER (click to view)
CODE
from z3 import *
m1 = Int('m1')
m2 = Int('m2')
m3 = Int('m3')
c1 = Int('c1')
c2 = Int('c2')
c3 = Int('c3')

s = Solver()

s.add(m1+m2+m3<c1+c2+c3)
for v in [m1, m2, m3, c1, c2, c3]:
   s.add(Or(
           (v==0),
           (v==1)))

solutions = []

while s.check() == z3.sat:
   m = s.model()
   solutions.append(m)
   # remove current solution, so I will get the next one
   s.add(Or((m1!=m[m1]), (m2!=m[m2]), (m3!=m[m3]), (c1!=m[c1]), (c2!=m[c2]), (c3!=m[c3])))

print len(set(solutions)) , ' solutions found'

for m in set(solutions):
   print 'M: %s%s%s C: %s%s%s'%(m[m1],m[m2],m[m3],m[c1],m[c2],m[c3])


QUOTE
python bridge.py
22 solutions found
M: 010 C: 101
M: 000 C: 110
M: 010 C: 111
M: 010 C: 110
M: 101 C: 111
M: 100 C: 110
M: 100 C: 111
M: 011 C: 111
M: 000 C: 001
M: 110 C: 111
M: 000 C: 011
M: 000 C: 010
M: 010 C: 011
M: 001 C: 011
M: 100 C: 011
M: 100 C: 101
M: 001 C: 101
M: 001 C: 111
M: 000 C: 101
M: 000 C: 111
M: 000 C: 100
M: 001 C: 110

(spero che non ce ne siano di sbagliate .... :) )

QUOTE
Vai, vai, Gila che dopo i PIC ti impari anche le reti logiche. All'epoca facesti veramente dei begli esperimenti.

E dopo puoi costruirti il tuo 16F84 :D

Edited by Elemento 38 - 4/24/2018, 11:59 PM
 
Top
view post Posted on 25/4/2018, 08:53
Avatar

GWFstory

Group:
Administrator
Posts:
359
Location:
da qui...., quo, qua. Siete curiosi di saperlo, vero? No? Beh, tanto non ve l'avrei detto.

Status:


Bella l'idea dello script per cercarsi le soluzioni.
Direi che il suo lavoro l'abbia fatto bene, visto che le soluzioni trovate sono 22 come nella mia tabella della verità (fatta "a mano").

Io il Phyton non lo conosco. Avevo iniziato a studiarmelo, perchè è molto usato, ma non mi ha preso il fatto che le identazioni decidono quali istruzioni sono dipendenti da altre (for, while, ecc.), quindi basta un'identazione in più o in meno per scombussolare completamente il flusso del programma.
Certo, se uno ci sta attento ed è ordinato il discorso è aggirabile, ma quando si copia/incolla una parte di codice si rischia fortemente di perdere la prima tabulazione, con risultati tanto imprevedibili quanto sgraditi.
Questo lo sento in modo particolare, dato che quando scrivo programmi ben difficilmente riesco ad isolarmi completamente dai distrurbi esterni e le interruzioni, quindi creare dei danni a causa di un call-center che ti chiama per proporti un nuovo contratto (spesso già esistente con lo stesso operatore :angry: ) oppure per rispondere ad un cliente che dopo 12 anni non ha capito che una spia verde lampeggiante è normale quando è mancata la rete d'alimentazione, è un attimo.

Magari prima o poi mi ci metterò dietro, dato che non potrò continuare a scrivere programmi in Visual Basic 6 (ho anche guardato le versioni più recenti, ma ho rischiato di diventare un serial killer, perchè vedere che microsoft aveva scombussolato completamente non solo l'ambiente di sviluppo, ma anche il set di istruzioni, mi ha fatto girare i cosiddetti).

Edited by GWFstory - 25/4/2018, 10:16
 
Top
Elemento 38
view post Posted on 25/4/2018, 11:12




QUOTE
Io il Phyton non lo conosco. Avevo iniziato a studiarmelo, perchè è molto usato, ma non mi ha preso il fatto che le identazioni decidono quali istruzioni sono dipendenti da altre (for, while, ecc.), quindi basta un'identazione in più o in meno per scombussolare completamente il flusso del programma.

Ti obbliga ad essere ordinato, aiutando chiunque modifichi lo script dopo di te :)
IDE moderni aiutano abbastanza con le tabulazioni incorrette. Solitamente uso emacs come editor e non ho mai avuto grossi problemi, ma sara' che ci ho fatto l'abitudine a scrivere scripts Python :)
 
Top
view post Posted on 25/4/2018, 11:41
Avatar

GWFstory

Group:
Administrator
Posts:
359
Location:
da qui...., quo, qua. Siete curiosi di saperlo, vero? No? Beh, tanto non ve l'avrei detto.

Status:


Com'è l'ambiente grafico di Python? Non l'ho mai visto (oppure l'ho visto ma l'ho confuso con quello di un'altro linguaggio).

Sinceramente vorrei svecchiare il mio modo di programmare lato PC, ma non vorrei buttarmi su qualcosa che dopo 3 mesi si rivela inutile per quello che devo fare io.....
.....Qui però stiamo andando in OT, forse sarebbe meglio aprire un'altra discussione.
 
Top
view post Posted on 26/4/2018, 10:17
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


@GWF: non ho capito però se qui si parla di un circuito a integrati, quindi porte logiche and,xor ecc oppure applicato a microcontrollori, dove comunque hai un software e puoi gestire diversamente.
Non so se mi spiego: es veloce: hai un pic fare 1 maggiore di 2 ? è una cosa.
A integrati non puoi fare un if, ma devi costruirti un circuito.
 
Top
view post Posted on 26/4/2018, 10:29
Avatar

GWFstory

Group:
Administrator
Posts:
359
Location:
da qui...., quo, qua. Siete curiosi di saperlo, vero? No? Beh, tanto non ve l'avrei detto.

Status:


Qui si sta parlando di porte logiche o, in alternativa, di logiche programmabili come PAL, GAL, PLD, ecc.

Con i microcontrollori si fa ben di più (anche lo stesso gioco dei cannibali e dei missionari, magari simulati con led rossi e blu).
Questo vuole essere un primo approccio alle reti logiche, prendendo lo spunto dal quesito iniziale.

L'intenzione sarebbe poi passare all'implementazione su un microcontrollore in un secondo tempo.
 
Top
view post Posted on 26/4/2018, 10:33
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


ok, capito, grazie
 
Top
view post Posted on 26/4/2018, 18:33
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Mi sfugge qualcosa:
CITAZIONE
Bene, ora sugli ingressi della porta AND andranno portati i livelli logici di C1-C3 e M1-M3, considerando che gli ingressi saranno portati direttamente se sono a 1 e negati (quindi invertite di livello perchè passanti attraverso un NOT) se sono a 0.

Prendendo, ad esempio, il mintermine della riga Num.8, in cui gli ingressi sono 0 0 0 1 0 0 l'AND sarà composto dalla seguente formula:
ALM Num8 = !M1 & !M2 & !M3 & C1 & !C2 & !C3

Ma se nego i bit a 0 mi diventano 1, mentre quelli a 1 stanno a 1.
Così facendo però avrò sempre uscita 1. 1&1&1&1...=1
es
000 000
li nego e ho
111 111
1&1&1&1&1&1=1
ma l'allarme non dovrebbe esserci.
Ma sicuramente intendo male io...
 
Top
view post Posted on 26/4/2018, 20:47
Avatar

GWFstory

Group:
Administrator
Posts:
359
Location:
da qui...., quo, qua. Siete curiosi di saperlo, vero? No? Beh, tanto non ve l'avrei detto.

Status:


Praticamente ognuno dei mintermini è una moltiplicazione (booleana, non algebrica, quindi una funzione AND) di tutti gli ingressi. Per ottenere l'1 in uscita da un mintermine (quindi dalla porta AND) devi fare in modo che tutti gli ingressi siano a 1, quindi i bit che sono già a 1 li porti all'AND così come sono, mentre quelli che sono a 0 li inverti col NOT.

mintermini

Questo sopra è un esempio dei mintermini relativi alle 2 combinazioni
M1=M2=M3=0 C1=1 e C2=C3=0 (000 100)
M1=M2=0 M3=1 C1=C2=1 C3=0 (001 110)

Ovviamente mancano tutti gli altri 20 minternini. Sinceramente non li ho disegnati perchè non aveva molto senso, anche perchè stato usando un programma online gratuito che a un certo punto mi ha segato le gambe e ha cominciato ha chiedere soldi. :B):

Il programma che ho usato non aveva AND a 6 ingress, per questo me li sono creati mettendo 2 AND a 3 ingressi e riunendoli con un AND a 2 ingressi (praticamente AND1,AND2 e AND3 formato il primo AND a 6 ingressi, mentre AND4, AND5 e AND7 formano il secondo).

Le uscite dei 2 AND a 6 ingressi entrano in OR1, che, se fosse stato creato lo schema completo, avrebbe avuto 22 ingressi, uno per ogni uscita di ognuno dei 22 mintermini.
Come vedi il primo AND ha (NOT)M1 sul primo ingresso, (NOT)M2 sul secondo, (NOT)M3 sul terzo, C1 sul quarto, (NOT)C2 sul quinto e (NOT)C3 sul sesto, quindi la sua uscita sarà alta (livello logico 1) quando si avrà la combinazione 000 100, mentre con tutte le altre combinazioni l'uscita sarà bassa (livello logico 0).

Spero di essere stato chiaro.
 
Top
Elemento 38
view post Posted on 26/4/2018, 21:06




QUOTE
Ma se nego i bit a 0 mi diventano 1, mentre quelli a 1 stanno a 1.

Secondo me stai facendo confusione con le funzioni logiche. Wiki ha un buon riassunto: https://it.m.wikipedia.org/wiki/Porta_logica
 
Top
50 replies since 14/4/2018, 11:35   659 views
  Share