B.7 Programmi in Abel delle PALs del sensore grossolano
 
 

Programma PAL0

MODULE onde_PAL0

TITLE 'Onde quadre sfasate di 1/16 di periodo '
 

CK                              pin 11; // clock
CK0                            node istype 'reg,buffer' ; // divisore di frequenza
CK1                            pin 18 istype 'reg,buffer'; // clock per la PAL1
[P11..P0]                    node istype 'reg,buffer' ;
[Wo11..Wo0]             node istype 'reg,buffer';
[W15..W0]                  pin     43,27,9,22,6,40,7,30,39,19,41,29,38,20,4,16  ;// onde sfasate
DLATCH                   node istype 'reg,buffer' ;
LATCH                      pin; LATCH per la lettura dello stato del contatore
[WW11..WW0]          pin; 17,21,15,3,25,37,26,31,28,42,5,44 uscite del contatore
                                     //entranti  nella PAL1.
 

Equations

[CK1..CK0].clk = CK;
[CK1..CK0] := [CK1..CK0] + 1;

[P11..P0].clk = CK0;
[P11..P0] := [P11..P0] + 1;

// Onde quadre sfasate di 1/16

W0 = ([P11..P0] >= 2048);
W1 = ([P11..P0] < 256) # ([P11..P0] >= 2304);
W2 = ([P11..P0] < 512) # ([P11..P0] >= 2560);
W3 = ([P11..P0] < 768) # ([P11..P0] >= 2816);
W4 = ([P11..P0] < 1024) # ([P11..P0] >= 3072);
W5 = ([P11..P0] < 1280) # ([P11..P0] >= 3328);
W6 = ([P11..P0] < 1536) # ([P11..P0] >= 3584);
W7 = ([P11..P0] < 1792) # ([P11..P0] >= 3840);
W8 = !W0;
W9 = !W1;
W10 = !W2;
W11 = !W3;
W12 = !W4;

W13 = !W5;
W14 = !W6;
W15 = !W7;

// uscite del contatore verso la PAL1 dove avverrà la codifica

DLATCH.clk = !CK0;
DLATCH.d = LATCH;
[Wo11..Wo0].clk = DLATCH.q;
[Wo11..Wo0].d = [P11..P0].fb;
[WW11..WW0] = [Wo11..Wo0].q;

End
 
 

Programma PAL1
 

MODULE serial_PAL1

TITLE 'serializzatore '
 

CK                            pin 11;
[CK6..CK0]              node istype 'reg,buffer';
[C6..C0]                    node istype 'reg,buffer'; // contatore per la generazione dei
                                 //segnali del serializzatore

[D9..D0]                    node istype 'com';
[Q9..Q0]                    node istype 'reg,buffer';
CKPISO                    pin ; clock per l’uscita del dato codificato (9.6 kHz)
AS0,BS0,AS1,BS1,E0,E1,S0,S1  pin ; // Selezioni per il MUX e la codifica ASCII
[WW11..WW0]              pin 20,25,7,37,4,27,5,44,6,9,19,41 ;
[WWW11..WWW0]            node istype 'reg_d';
[Y0..Y3]                          node istype 'com';
SOUT                            pin 15;  //  uscita seriale
CKIN                             pin; // clock per l’acquisizione del dato da codificare

A = [WWW3..WWW0];
B = [WWW7..WWW4];
C = [WWW11..WWW8];
Y = [Y3..Y0];
SELECT = [E1..E0];
X = .X.;
 
 

truth_table

([S1,S0,Q9,Q8,Q7,Q6,Q5,Q4,Q3,Q2,Y0,Y1,Y2,Y3] -> [D8..D1]);
 [0,0,X,X,X,X,X,X,X,X,X,X,X,X] -> ^H00;
 [0,1,X,X,X,X,X,X,X,X,X,X,X,X] -> ^H0A; codifica LF
 [1,0,X,X,X,X,X,X,X,X,X,X,X,X] -> ^H0D; codifica CR
 [1,1,X,X,X,X,X,X,X,X,0,0,0,0] -> ^H30;
 [1,1,X,X,X,X,X,X,X,X,1,0,0,0] -> ^H31;
 [1,1,X,X,X,X,X,X,X,X,0,1,0,0] -> ^H32;
 [1,1,X,X,X,X,X,X,X,X,1,1,0,0] -> ^H33;
 [1,1,X,X,X,X,X,X,X,X,0,0,1,0] -> ^H34;
 [1,1,X,X,X,X,X,X,X,X,1,0,1,0] -> ^H35;
 [1,1,X,X,X,X,X,X,X,X,0,1,1,0] -> ^H36;
 [1,1,X,X,X,X,X,X,X,X,1,1,1,0] -> ^H37;
 [1,1,X,X,X,X,X,X,X,X,0,0,0,1] -> ^H38;
 [1,1,X,X,X,X,X,X,X,X,1,0,0,1] -> ^H39;
 [1,1,X,X,X,X,X,X,X,X,0,1,0,1] -> ^H41;
 [1,1,X,X,X,X,X,X,X,X,1,1,0,1] -> ^H42;
 [1,1,X,X,X,X,X,X,X,X,0,0,1,1] -> ^H43;
 [1,1,X,X,X,X,X,X,X,X,1,0,1,1] -> ^H44;
 [1,1,X,X,X,X,X,X,X,X,0,1,1,1] -> ^H45;
 [1,1,X,X,X,X,X,X,X,X,1,1,1,1] -> ^H46;
 

Equations

[CK6..CK0].clk = CK;
[CK6..CK0] := [CK6..CK0] + 1;
[C6..C0].clk = CK4;
when ([C6..C0] >= 109) then [C6..C0] := 0 else [C6..C0] := [C6..C0] + 1;
CKIN = ([C6..C0] > 3) & ([C6..C0] < 7);
AS0 = (([C6..C0] > 7) & ([C6..C0] < 10)) # (([C6..C0] > 27) & ([C6..C0] < 30)) # (([C6..C0] > 47) & ([C6..C0] < 50));
BS0 = ([C6..C0] > 67) & ([C6..C0] < 70);
S0 = AS0 # BS0;
AS1 = (([C6..C0] > 7) & ([C6..C0] < 10)) # (([C6..C0] > 27) & ([C6..C0] < 30)) # (([C6..C0] > 47) & ([C6..C0] < 50));
BS1 = ([C6..C0] > 87) & ([C6..C0] < 90);
S1 = AS1 # BS1;
E0 = ([C6..C0] > 24) & ([C6..C0] < 45);
E1 = ([C6..C0] > 44);
CKPISO = ([C6..C0] > 8) & C0;

[WWW11..WWW0].clk = CKIN;
[WWW11..WWW0].d = [WW11..WW0];
when (SELECT == 0) then Y = C;
when (SELECT == 1) then Y = B;
when (SELECT == 2) then Y = A;

when (SELECT == 3) then Y = A;
 

D9 = 1; // stop bit
D0 = 0;  // start bit
Q9 := D9;

when (S1 == 0) & (S0 == 0) then [Q8..Q0] := [Q9..Q1].fb;       // configurazione di
                                                                                                     //shift-register
else [Q8..Q0] := [D8..D0];                // acquisizione parallela del dato già codificato
                                                           //da far uscire successivamente in modo seriale
 

SOUT = Q0; // uscita seriale collegata al MAX232 per adattare i livelli di tensione
                      //alla seriale del PC

[Q9..Q0].clk = CKPISO;
 

End
 
 

Il corrispondente schema circuitale espresso dai due programmi è riportato nella figura 1. (formato zip + doc 37Kb).


Home | Precedente | Successivo