Бродин В.Б., Калинин А.В., « Системы на микроконтролерах и БИС программируемой логики » - М.: Эконом, 2002.
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

3. Вицын Н. «Современные тенденции развития систем автоматизированного проектирования в области электроники» // Chip News, № 1, 1997. С. 12–15.

4. Губанов Д. А., Стешенко В. Б., Храпов В. Ю., Шипулин С. Н. «Перспективы реализации алгоритмов цифровой фильтрации на основе ПЛИС фирмы ALTERA» // Chip News, № 9–10, 1997, с. 26–33.

5. Тех. Док. «One Technology Way, P.O. Box9106, Norwood, MA 02062-9106, U.S.A.», http://www.analog.com

6. LCD Controller/Driver LSI. Data Book. © 1994 Hitachi America Ltd.

7. «Алфавитно-цифровые индицирующие ЖК-модули фирмы Powertip.» Каталог, 1-е издание, © 1998 КТЦ-МК.

8. Микросхема: СЕ110. Техническое описание, 1-е издание, © 1997 КТЦ-МК,

9. Микросхема: DB-CE110. Техническое описание, 1-е издание, © 1997 КТЦ-МК.

10. Тех. Док.«MC78TXX», Fairchild Semiconductor Corporation, 2002, http://www.fairchildsemi.com

11. Тех. Док. «LMS1585A», National Semiconductor Corporation, April, 2000, http://www.national.com, Email: europ.support@nsc.com

12. Тех. Док. «ByteBlasterMV Parallel Port Download Cable» Altera Corporation, July, 2002, Version 3.3


Приложение 1 (Принципиальная схема устройства)

 


Приложение 2 (Список портов ввода вывода ПЛИС epm 3256a)





Приложение 3 (Текст программы)

 

--Антидребезговая система

INCLUDE "LPM_COUNTER";

CONSTANT DELAY = 6;

SUBDESIGN ANTIBOUNCE

(

    IN          : INPUT;

    CLK      : INPUT;

    OUT      : OUTPUT;

)

VARIABLE

    CT         : LPM_COUNTER WITH(LPM_WIDTH=DELAY);

    TRIG : DFF;

BEGIN

    TRIG.D = !IN;

    CT.ACLR = !(!IN $ TRIG.Q);

    CT.CLOCK = CLK;

    TRIG.CLK=CT.Q[DELAY-1];

    OUT = !TRIG.Q;

END;

--Десятичнодвоичный счетчик

CONSTANT DIGITS = 6;

INCLUDE "LPM_COUNTER";

SUBDESIGN COUNTER10

(

    -- входные данные

    CLOCK                                                : INPUT;

    ACLR                                                   : INPUT;

    COUNT_ENA                                     : INPUT;

    -- выход

    Q[DIGITS-1..0][3..0]         : OUTPUT;

)

 

VARIABLE

    RESET[DIGITS-1..0]                 : NODE;

    COUNTER[DIGITS-1..0]           : LPM_COUNTER WITH (LPM_WIDTH=4);

BEGIN

    IF COUNTER[0].Q[3..0]==B"1010" THEN RESET[0]=vcc; ELSE RESET[0]=gnd; END IF;

    IF COUNTER[1].Q[3..0]==B"1010" THEN RESET[1]=vcc; ELSE RESET[1]=gnd; END IF;

    IF COUNTER[2].Q[3..0]==B"1010" THEN RESET[2]=vcc; ELSE RESET[2]=gnd; END IF;

    IF COUNTER[3].Q[3..0]==B"1010" THEN RESET[3]=vcc; ELSE RESET[3]=gnd; END IF;

    IF COUNTER[4].Q[3..0]==B"1010" THEN RESET[4]=vcc; ELSE RESET[4]=gnd; END IF;

    IF COUNTER[5].Q[3..0]==B"1010" THEN RESET[5]=vcc; ELSE RESET[5]=gnd; END IF;

    COUNTER[0].clock=clock;

    COUNTER[DIGITS-1..1].clock=RESET[DIGITS-2..0];

    Q[DIGITS-1..0][3..0]=COUNTER[DIGITS-1..0].Q[3..0];

    COUNTER[DIGITS-1..0].aclr=RESET[DIGITS-1..0]#aclr;

    COUNTER[0].cnt_en=COUNT_ENA;

END;

--Устройство управления индикатором

CONSTANT DATA_WITH = 8;

 

INCLUDE "LPM_COUNTER";

SUBDESIGN WH1602

(

    CLK                              : INPUT;

    IN[5..0][DATA_WITH-1..0]       : INPUT;

    D[DATA_WITH-1..0]                : BIDIR;

    E                                        : OUTPUT;

    RW                               : OUTPUT;

    RS                                     : OUTPUT;

)

VARIABLE

    clk_a                                  : NODE;

    Ddff[DATA_WITH-1..0]                     : dff;

    Din[DATA_WITH-1..0]                       : dff;

    Dmsh[DATA_WITH-1..0]          : NODE;

    _RW                                  : NODE;

    _RS                              : NODE;

    Eena                                  : NODE;

    Pause                                 : LPM_COUNTER WITH (LPM_WIDTH=9);

    STR                             : LPM_COUNTER WITH (LPM_WIDTH=4);

    LINE[DATA_WITH-1..0]          : NODE;

    ST                                     : MACHINE

              WITH STATES ( z0, p1, r1, p2, r2, p3, r3, p4,

                                                   r4, b4, c4, r5, b5, c5, r6, b6, c6, r7, b7, c7, r8, b8, c8,

                                                   ds, bs, cs, dz0, bz0, cz0, dz1, bz1, cz1 );

    Dtri[DATA_WITH-1..0]                      : TRI;

    OE                                     : NODE;

    INC[3..0]                           : NODE;

    INBUF[5..0][DATA_WITH-1..0]        : DFF;

    READ                                         : DFF;

 

BEGIN

    clk_a = dff(!clk_a, clk, vcc, vcc);

    Pause.clock = clk_a;

    -- outputs

    Ddff[DATA_WITH-1..0].d = Dmsh[DATA_WITH-1..0];

    Ddff[DATA_WITH-1..0].clk = !clk_a;

    Dtri[DATA_WITH-1..0].in = Ddff[DATA_WITH-1..0].q;

    D[DATA_WITH-1..0] = Dtri[DATA_WITH-1..0].out;

    Din[DATA_WITH-1..0].d = D[DATA_WITH-1..0];

    Din[DATA_WITH-1..0].clk = !dff (clk_a & Eena , clk, vcc, vcc);

    Dtri[DATA_WITH-1..0].oe = dff (OE, !clk_a, vcc, vcc);

 

    RW = dff (_RW, !clk_a, vcc, vcc);

    RS = dff (_RS, !clk_a, vcc, vcc);

    E = dff (clk_a & Eena , clk, vcc, vcc);

    -- machine

    ST.clk = clk_a;

    CASE ST IS

              WHEN z0 =>

                       Dmsh[DATA_WITH-1..0] = H"FF";   OE = vcc;

                       Eena = gnd;              _RW = gnd;             _RS = gnd;     Pause.aclr = vcc;

                       ST = p1;

              -- загрузка индикатора после включения питания

              -- пауза перед включением 21мс

              WHEN p1 =>

                       Dmsh[DATA_WITH-1..0] = H"38";    OE = vcc;

                       Eena = gnd;    _RW = gnd;    _RS = gnd; Pause.aclr = gnd;

                       IF Pause.q[]==200 THEN ST = r1; ELSE ST = p1; END IF;

              -- INITIAL SETTING ONCE 00111000

              WHEN r1 =>

                       Dmsh[DATA_WITH-1..0] = H"38";    OE = vcc;

                       Eena = vcc; _RW = gnd;    _RS = gnd; Pause.aclr = vcc;

                       ST = p2;

              -- пауза 7 мс > 4.1 мс

              WHEN p2 =>

                       Dmsh[DATA_WITH-1..0] = H"38";    OE = vcc;

                       Eena = gnd;    _RW = gnd;    _RS = gnd; Pause.aclr = gnd;

                       IF Pause.q[]==100 THEN ST = r2; ELSE ST = p2; END IF;

              -- INITIAL SETTING TWICE 00111000

              WHEN r2 =>

                       Dmsh[DATA_WITH-1..0] = H"38";    OE = vcc;

                       Eena = vcc; _RW = gnd;    _RS = gnd; Pause.aclr = vcc;

                       ST = p3;

              -- пауза 0.7 мс > 0.1 мс

              WHEN p3 =>

                       Dmsh[DATA_WITH-1..0] = H"38";    OE = vcc;

                       Eena = gnd;    _RW = gnd;    _RS = gnd; Pause.aclr = gnd;

                       IF Pause.q[]==10 THEN ST = r3; ELSE ST = p3; END IF;

              -- INITIAL SETTING THIRD 00111000

              WHEN r3 =>

                       Dmsh[DATA_WITH-1..0] = H"38";    OE = vcc;

                       Eena = vcc; _RW = gnd;    _RS = gnd; Pause.aclr = vcc;

                       ST = p4;

              -- пауза 0.7 мс > 0.1 мс

              WHEN p4 =>

                       Dmsh[DATA_WITH-1..0] = H"38";    OE = vcc;

                       Eena = gnd;    _RW = gnd;    _RS = gnd; Pause.aclr = gnd;

                       IF Pause.q[]==10 THEN ST = r4; ELSE ST = p4; END IF;

              -- Function Set 0011NF**

              WHEN r4 =>

                       Dmsh[DATA_WITH-1..0] = H"3C";   OE = vcc;

                       Eena = vcc; _RW = gnd;    _RS = gnd; Pause.aclr = vcc;

                       ST = b4;

              WHEN b4 =>

                       Dmsh[DATA_WITH-1..0] = H"00";    OE = gnd;

                       Eena = vcc; _RW = vcc; _RS = gnd; Pause.aclr = vcc;

                       ST = c4;

              WHEN c4 =>

                       Dmsh[DATA_WITH-1..0] = H"00";    OE = gnd;

                       Eena = gnd;    _RW = vcc; _RS = gnd; Pause.aclr = gnd;

                       IF Din[DATA_WITH-1].q==0 THEN ST = r5; ELSE ST = b4; END IF;

              -- Display ON/OFF = 00001DCB, Display ON,Cursor&Blink OFF

              WHEN r5 =>

                       Dmsh[DATA_WITH-1..0] = H"0C";   OE = vcc;

                       Eena = vcc; _RW = gnd;    _RS = gnd; Pause.aclr = vcc;

                       ST = b5;

              WHEN b5 =>

                       Dmsh[DATA_WITH-1..0] = H"00";    OE = gnd;

                       Eena = vcc; _RW = vcc; _RS = gnd; Pause.aclr = vcc;

                       ST = c5;

              WHEN c5 =>

                       Dmsh[DATA_WITH-1..0] = H"00";    OE = gnd;

                       Eena = gnd;    _RW = vcc; _RS = gnd; Pause.aclr = gnd;

                       IF Din[DATA_WITH-1].q==0 THEN ST = r6; ELSE ST = b5; END IF;

              -- Entry Mode Set = 000001IS, Increment & Shift OFF

              WHEN r6 =>

                       Dmsh[DATA_WITH-1..0] = H"06";    OE = vcc;

                       Eena = vcc; _RW = gnd;    _RS = gnd; Pause.aclr = vcc;

                       ST = b6;

              WHEN b6 =>

                       Dmsh[DATA_WITH-1..0] = H"00";    OE = gnd;

                       Eena = vcc; _RW = vcc; _RS = gnd; Pause.aclr = vcc;

                       ST = c6;

              WHEN c6 =>

                  Dmsh[DATA_WITH-1..0] = H"00";    OE = gnd;

                       Eena = gnd;    _RW = vcc; _RS = gnd; Pause.aclr = gnd;

                       IF Din[DATA_WITH-1].q==0 THEN ST = r7; ELSE ST = b6; END IF;

              -- Return Home

              WHEN r7 =>

                       Dmsh[DATA_WITH-1..0] = H"02";    OE = vcc;

                       Eena = vcc; _RW = gnd;    _RS = gnd; Pause.aclr = vcc;

                       ST = b7;

              WHEN b7 =>

                       Dmsh[DATA_WITH-1..0] = H"00";    OE = gnd;

                       Eena = vcc; _RW = vcc; _RS = gnd; Pause.aclr = vcc;

                       ST = c7;

              WHEN c7 =>

                       Dmsh[DATA_WITH-1..0] = H"00";    OE = gnd;

                       Eena = gnd;    _RW = vcc; _RS = gnd; Pause.aclr = gnd;

                       IF Din[DATA_WITH-1].q==0 THEN ST = r8; ELSE ST = b7; END IF;

              -- Clear Display

              WHEN r8 =>

                       Dmsh[DATA_WITH-1..0] = H"01";    OE = vcc;

                       Eena = vcc; _RW = gnd;    _RS = gnd; Pause.aclr = vcc;

                       ST = b8;

              WHEN b8 =>

                       Dmsh[DATA_WITH-1..0] = H"00";    OE = gnd;

                       Eena = vcc; _RW = vcc; _RS = gnd; Pause.aclr = vcc;

                       ST = c8;

              WHEN c8 =>

                       Dmsh[DATA_WITH-1..0] = H"00";    OE = gnd;

                       Eena = gnd;    _RW = vcc; _RS = gnd; Pause.aclr = gnd;

                       IF Din[DATA_WITH-1].q==0 THEN ST = ds; ELSE ST = b8; END IF;

              --формирование изображения

              WHEN ds =>

                       Dmsh[DATA_WITH-1..0] = LINE[];   OE = vcc;

                       Eena = vcc; RW = gnd; _RS = vcc; Pause.aclr = vcc;

                       ST = bs;

              WHEN bs =>

                       Dmsh[DATA_WITH-1..0] = H"00";    OE = gnd;

                       Eena = vcc; _RW = vcc; _RS = gnd; Pause.aclr = vcc;

                       ST = cs;

              WHEN cs =>

                       Dmsh[DATA_WITH-1..0] = H"00";    OE = gnd;

                       Eena = gnd;    _RW = vcc; _RS = gnd; Pause.aclr = gnd;

                       IF STR.q==H"F" THEN ST=dz0;

                       ELSIF Din[DATA_WITH-1].q==0 THEN ST = ds; ELSE ST = bs; END IF;

              --перемещение в начало

              WHEN dz0 =>

                       Dmsh[DATA_WITH-1..0] = H"40";    OE = vcc;

                       Eena = gnd;    _RW = gnd;    _RS = gnd; Pause.aclr = vcc;

                       ST = bz0;

              WHEN bz0 =>

                       Dmsh[DATA_WITH-1..0] = H"00";    OE = gnd;

                       Eena = vcc; _RW = vcc; _RS = gnd; Pause.aclr = vcc;

                       ST = cz0;

              WHEN cz0 =>

                       Dmsh[DATA_WITH-1..0] = H"00";    OE = gnd;

                       Eena = gnd;    _RW = vcc; _RS = gnd; Pause.aclr = gnd;

                       IF Din[DATA_WITH-1].q==0 THEN ST = dz1; ELSE ST = bz0; END IF;

 

              WHEN dz1 =>

                       Dmsh[DATA_WITH-1..0] = H"80";    OE = vcc;

                       Eena = vcc; _RW = gnd;    _RS = gnd; Pause.aclr = vcc;

                       ST = bz1;

              WHEN bz1 =>

                       Dmsh[DATA_WITH-1..0] = H"00";    OE = gnd;

                       Eena = vcc; _RW = vcc; _RS = gnd; Pause.aclr = vcc;

                       ST = cz1;

              WHEN cz1 =>

                       Dmsh[DATA_WITH-1..0] = H"00";    OE = gnd;

                       Eena = gnd;    _RW = vcc; _RS = gnd; Pause.aclr = gnd;

                       IF Din[DATA_WITH-1].q==0 THEN ST = ds; ELSE ST = bz1; END IF;

    END CASE;

 

 

    INBUF[5..0][DATA_WITH-1..0].clk=READ.q;

    INBUF[5..0][DATA_WITH-1..0].d=IN[5..0][DATA_WITH-1..0];

    IF ST==dz1 THEN READ.d=vcc; ELSE READ.d=gnd; END IF;

    READ.clk=clk;

    IF ST==ds THEN STR.clock=vcc; ELSE STR.clock=gnd; END IF;

    STR.aclr=READ.q;

    CASE STR.q[] IS

              WHEN H"1" => LINE[]=INBUF[5][DATA_WITH-1..0];

              WHEN H"2" => LINE[]=INBUF[4][DATA_WITH-1..0];

              WHEN H"3" => LINE[]=INBUF[3][DATA_WITH-1..0];

              WHEN H"4" => LINE[]=INBUF[2][DATA_WITH-1..0];

              WHEN H"5" => LINE[]=INBUF[1][DATA_WITH-1..0];

              WHEN H"6" => LINE[]=INBUF[0][DATA_WITH-1..0];

              WHEN H"7" => LINE[]=H"20";

              WHEN H"8" => LINE[]=H"43";

              WHEN H"9" => LINE[]=H"44";

              WHEN H"A" => LINE[]=H"45";

              WHEN H"B" => LINE[]=H"46";

              WHEN H"C" => LINE[]=H"47";

              WHEN H"D" => LINE[]=H"48";

              WHEN H"E" => LINE[]=H"49";

              WHEN H"F" => LINE[]=H"4A";

    END CASE;

END;

 


* промиль (миллионная часть, 10-6). Стабильность частоты
Допустимое отклонение частоты от номинального значения. Измеряется в процентах или в "ppm"



Дата: 2019-12-22, просмотров: 263.