home *** CD-ROM | disk | FTP | other *** search
- module unictr3
- title 'Universal counter / Shift register
- Bjorn Benson Data I/O Corp 9 Mar 1984'
-
- IFL3 device 'F82S105';
-
- " Assign pin and node names
-
- Clk pin 1;
- I3 pin 6; " Clear
- I2 pin 7; " Down/Left
- I1 pin 8; " Up/Right
- I0 pin 9; " Count
- OE pin 19; " Output Enable
-
- F0 pin 18; RF0 node 29;
- F1 pin 17; RF1 node 30;
- F2 pin 16; RF2 node 31;
- F3 pin 15; RF3 node 32;
-
- " Internal state counter
- P0 node 37; RP0 node 43;
- P1 node 38; RP1 node 44;
- P2 node 39; RP2 node 45;
- P3 node 40; RP3 node 46;
-
- " Define special constants
- H,L,X,Z,Ck = 1, 0, .X., .Z., .C.;
- HiZ = [Z,Z,Z,Z];
- " Define counter/shift modes
- mode = [I3,I2,I1,I0]; " [I3,I2,I1,I0]
- Down = [ 0, 1, 0, 1]; Left = [ 0, 1, 0, 0];
- Up = [ 0, 0, 1, 1]; Right = [ 0, 0, 1, 0];
- Clear = [ 1, X, X, X];
-
- " Group register outputs into sets
- count = [P3,P2,P1,P0];
- output = [F3,F2,F1,F0];
-
- SET0 = [F0,P0]; RESET0 = [RF0,RP0];
- SET1 = [F1,P1]; RESET1 = [RF1,RP1];
- SET2 = [F2,P2]; RESET2 = [RF2,RP2];
- SET3 = [F3,P3]; RESET3 = [RF3,RP3];
-
- @page
- equations
- ENABLE output = !OE;
-
- " Count Down
- SET0 := (mode == Down ) & !P0;
- RESET0 = (mode == Down ) & P0;
- SET1 := (mode == Down ) & !P1 & !P0;
- RESET1 = (mode == Down ) & P1 & !P0;
- SET2 := (mode == Down ) & !P2 & !P1 & !P0;
- RESET2 = (mode == Down ) & P2 & !P1 & !P0;
- SET3 := (mode == Down ) & !P3 & !P2 & !P1 & !P0;
- RESET3 = (mode == Down ) & P3 & !P2 & !P1 & !P0;
-
- " Count Up
- SET0 := (mode == Up ) & !P0;
- RESET0 = (mode == Up ) & P0;
- SET1 := (mode == Up ) & !P1 & P0;
- RESET1 = (mode == Up ) & P1 & P0;
- SET2 := (mode == Up ) & !P2 & P1 & P0;
- RESET2 = (mode == Up ) & P2 & P1 & P0;
- SET3 := (mode == Up ) & !P3 & P2 & P1 & P0;
- RESET3 = (mode == Up ) & P3 & P2 & P1 & P0;
-
- " Shift Left
- SET0 := (mode == Left ) & P3;
- RESET0 = (mode == Left ) & !P3;
- SET1 := (mode == Left ) & P0;
- RESET1 = (mode == Left ) & !P0;
- SET2 := (mode == Left ) & P1;
- RESET2 = (mode == Left ) & !P1;
- SET3 := (mode == Left ) & P2;
- RESET3 = (mode == Left ) & !P2;
-
- " Shift Right
- SET0 := (mode == Right) & P1;
- RESET0 = (mode == Right) & !P1;
- SET1 := (mode == Right) & P2;
- RESET1 = (mode == Right) & !P2;
- SET2 := (mode == Right) & P3;
- RESET2 = (mode == Right) & !P3;
- SET3 := (mode == Right) & P0;
- RESET3 = (mode == Right) & !P0;
-
- " Clear
- RESET0 = (mode == Clear);
- RESET1 = (mode == Clear);
- RESET2 = (mode == Clear);
- RESET3 = (mode == Clear);
-
- @page
- test_vectors
- ([Clk,OE,mode ] -> [count ,output])
- [ Ck, H,Clear] -> [ 0 , HiZ ]; "Power on clock
- [ Ck, L,Clear] -> [ 0 , 0 ];
- [ Ck, L,Up ] -> [ 1 , 1 ];
- [ Ck, L,Up ] -> [ 2 , 2 ];
- [ Ck, L,Left ] -> [ 4 , 4 ];
-
- test_vectors 'test shift right'
- ([Clk,OE,mode ] -> [count ,output])
- [ Ck, L,Clear] -> [ 0 , 0 ];
- [ Ck, L,Clear] -> [ 0 , 0 ];
- [ Ck, L,Down ] -> [ 15 , 15 ];
- [ Ck, L,Down ] -> [ 14 , 14 ];
- [ Ck, L,Right] -> [^b0111,^b0111];
- [ Ck, L,Right] -> [^b1011,^b1011];
- [ Ck, L,Right] -> [^b1101,^b1101];
- [ Ck, L,Right] -> [^b1110,^b1110];
-
- test_vectors 'test shift left'
- ([Clk,OE,mode ] -> [count ,output])
- [ Ck, L,Clear] -> [^b0000,^b0000];
- [ Ck, L,Up ] -> [^b0001,^b0001];
- [ Ck, L,Left ] -> [^b0010,^b0010];
- [ Ck, L,Left ] -> [^b0100,^b0100];
- [ Ck, L,Left ] -> [^b1000,^b1000];
- [ Ck, L,Left ] -> [^b0001,^b0001];
-
- test_vectors 'test up counter'
- ([Clk,OE,mode ] -> [count ,output])
- [ Ck, L,Clear] -> [ 0 , 0 ];
- [ Ck, L,Up ] -> [ 1 , 1 ];
- [ Ck, L,Up ] -> [ 2 , 2 ];
- [ Ck, L,Up ] -> [ 3 , 3 ];
- [ Ck, H,Up ] -> [ 4 , HiZ ];
- [ Ck, H,Up ] -> [ 5 , HiZ ];
- [ Ck, H,Up ] -> [ 6 , HiZ ];
- [ Ck, L,Up ] -> [ 7 , 7 ];
- [ Ck, L,Up ] -> [ 8 , 8 ];
- [ Ck, L,Up ] -> [ 9 , 9 ];
- [ Ck, L,Up ] -> [ 10 , 10 ];
- [ Ck, L,Up ] -> [ 11 , 11 ];
- [ Ck, L,Up ] -> [ 12 , 12 ];
- [ Ck, L,Up ] -> [ 13 , 13 ];
- [ Ck, L,Up ] -> [ 14 , 14 ];
- [ Ck, L,Up ] -> [ 15 , 15 ];
- [ Ck, L,Up ] -> [ 0 , 0 ];
- end unictr3
-