телевизори. Конзоли. Проектори и аксесоари. Технологии. Цифрова телевизия

4-битов фиксиращ регистър за преместване. Регистри. SHCP – вход за часовник

Този преглед е посветен всъщност на начинаещите потребители на Arduino или тези, които искат да се включат в този бизнес. Ще говорим за увеличаване на броя на изходите на микроконтролера с помощта на регистър за смяна и това не изисква големи разходи (в сравнение със закупуването на Arduino Mega, например). Най-простото приложение е да мигате светодиодите, така че нека опитаме това на практика.

Когато започнах да се запознавам с микроконтролерите (всъщност все още продължавам да „започвам да се запознавам“), един от първите въпроси беше: как можете да управлявате същите сто хиляди светодиода само с дузина изхода на контролера? Да, можете да използвате мултиплексиране на сигнали, обратно превключване и много други трикове, но все пак максимална сумаСвързваемите светодиоди са ограничени и трябва да се търси друго решение. И те ми предложиха една от опциите - „вземете един, два, десет чипа за сменен регистър и се забавлявайте“. Беше решено незабавно да ги поръчате и в бъдеще дори да сглобите LED куб с тях. Наистина трябваше да изоставя последното; намерих по-прост вариант, но това е тема на друг преглед.
Поръчах 20 броя 74HC595N наведнъж, за щастие те струват само стотинки. Буквата N в края на маркировката означава, че микросхемата е в пакет DIP-16, много удобен за експерименти върху макет, дори не е необходимо да запоявате нищо. Изглежда така:




Каква е тази микросхема? Това е осембитов сериен вход, сериен изход или паралелен изходен регистър за смяна с тригер с ключалка и изход с три състояния.
Казано по-просто, като използвате само 3 изхода на контролера, можете да управлявате 8 изхода на регистъра за преместване. И ако микросхемите са свързани последователно една след друга, тогава броят на контролираните изходи може да бъде увеличен до всяка разумна граница (не намерих максимален брой, но стотици изглежда се комбинират без проблеми; ако някой знае какъв е максимумът броят на микросхемите, включени в каскада, зависи от това, би било интересно да разберете в коментарите).
Данните се предават към чипа последователно. Битове 0 и 1 се прехвърлят в регистъра един след друг, битовете се четат, когато пристигне тактов импулс. Предадени 8 бита - получени 8 изходни състояния на изходите на регистъра. Когато 74HC595 е каскадно (ако са необходими 16, 24 и т.н. изхода), данните от първия регистър се прехвърлят към следващия.
Изходът на регистъра може не само да бъде в състояние на логическа 0 или 1, но и да бъде в състояние с висок импеданс, когато изходът е изключен от веригата. Само всички изходи могат да бъдат прехвърлени в това състояние наведнъж. Това се използва рядко, но може да бъде полезно при превключване на управлението към друг контролер, например.

Разпределение на входа/изхода

Q0…Q7 – регистрови изходи, могат да бъдат в състояние 0, 1 или висок импеданс
GND – земя
Q7′ – изход за последователно свързване на регистри.
MR – нулиране на регистъра
SH_CP – вход за часовник
ST_CP – вход за блокиране на данни
OE – вход, преобразуващ изходите от висок импеданс в работно състояние
DS – въвеждане на данни
VCC – захранване 2-6 волта

Остава само да проверим работата, за да направим това, ще съберем верига, която е популярна сред начинаещите. GND (щифт 8) е свързан към маса, Vcc (щифт 16) към 5V захранване, OE (пин 13) към маса, MR (пин 10) към 5V захранване. Регистърът за преместване вече е включен и всички изходи са активни. Сега е време да свържете микросхемата към Arduino: свържете входа за данни DS (щифт 14) към 9-ия цифров изход на Arduino, входа на часовника SH_CP (щифт 11) към 10-ия цифров изход, входа за резе ST_CP (щифт 12 ) към 8-ия щифт на Arduino. Препоръчително е да поставите кондензатор от 0,1 µF между земята и ключалката, за да минимизирате шума.
Остава да свържем светодиодите - чрез резистори 150-300 Ohm ги свързваме от изходите на регистъра към земята. Това е всичко. Ето една диаграма, която намерих за тези, които харесват визуални материали (моля, имайте предвид, че pinout на истинската микросхема и схематичното изображение на тази диаграма са различни!)


Сглобих схемата на макетна платка и се получи така.

сглобена верига








В Arduino е удобно да се използва функцията shiftOut(), която извежда байт информация към входно/изходния порт последователно (бит по бит). . Зареждане тестов кодв Arduino и вземете брояч от 0 до 255 в двоична форма:
int latchPin = 8; //ST_CP int clockPin = 10; //SH_CP int dataPin = 9; //DS void setup() ( pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); ) void loop() ( for (int numberToDisplay = 0; numberToDisplay< 256; numberToDisplay++) { // установка синхронизации "защелки" на LOW digitalWrite(latchPin, LOW); // передаем последовательно на вход данных shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay); //"защелкиваем" регистр, устанавливаем значения на выходах digitalWrite(latchPin, HIGH); delay(500); } }
Ето как се случи при мен, всичко работи според очакванията:


По този начин, с минимално използване на щифтове на контролера, можете да контролирате голяма сумасветодиоди (или нещо друго). Всичко би било наред, но ще ви кажа и за недостатъците. Както можете да видите, токът за всеки светодиод трябва да бъде ограничен от резистор, а при изграждането на големи LED матрици това става доста трудоемко. Има по-интересно решение за управление на светодиоди - драйверът DM13A, който е регистър за смяна и също така ограничава тока на всеки изход. Ще ви разкажа за това следващия път и като бонус - моят първи LED куб, 5x5x5, сглобен на опростен елементна база, без да използвате 74HC595.

Смятам да си купя +37 Добави към любими Ревюто ми хареса +35 +61

В даден момент неизбежно ще се сблъскате с проблема да нямате достатъчно пинове на вашия Arduino, за да отговорите на нуждите на вашия проект или прототип. Решението на този проблем? Shift регистър, или по-скоро Arduino shift register 74hc595.

Всеки, който е правил проекти на Arduino, където използват много светодиоди, е осъзнал, че те са до голяма степен ограничени от щифтовете на Arduino и не могат да създават огромни проекти, които изискват голям брой щифтове. В нашия конкретен проект 16 светодиода се управляват само от три щифта на Arduino. Ключовият елемент е регистърът за смяна на Arduino 74hc595. Всеки преместващ регистър 74HC595 може да приеме до 8 светодиода и с помощта на последователни вериги от регистри можете да увеличите контактите на платката от конвенционални 3 до безкраен брой.

Преди да започнем да свързваме чипа, нека да разгледаме как работи процесът.

Първото нещо, което трябва да изясните е понятието "битове" за тези от вас, които не са запознати с двоичния код. Когато говорим за „битове“, имаме предвид едно от числата, които съставляват двоична стойност. За разлика от обикновените числа, обикновено считаме първия бит за най-голям. Така че, ако вземем двоичната стойност 10100010, първият бит всъщност е 0, а осмият бит е 1. Трябва също да се отбележи, освен ако не се подразбира, че всеки бит може да бъде само 0 или 1.

Чипът съдържа осем пина, които можем да използваме за изход, като всеки щифт е свързан с бит в регистър. В случая на регистъра за смяна 74HC595, ние ги разглеждаме от QA до QH.

За да напишем тези изходи чрез Arduino, трябва да изпратим двоична стойност към регистъра за смяна и от това число регистърът за смяна може да определи кои изходи да използва. Например, ако изпратим двоичната стойност 10100010, контактите, маркирани в зелено на изображението по-горе, ще бъдат активни, а тези, маркирани в червено, ще бъдат неактивни.

Това означава, че най-десният бит се нанася на QH, а най-левият на QA. Изходът се счита за активен, когато свързаният с него бит е настроен на 1. Важно е да запомните това, защото в противен случай ще ви е много трудно да разберете кои пинове използвате.

Сега, след като имаме основно разбиране за това как използваме битово отместване, за да уточним кои щифтове да използваме, можем да започнем да го свързваме към нашия Arduino.

Започваме с 8 светодиода

За първата част на урока ще ни трябват следните компоненти:

  • Ардуино Уно
  • Дъска за хляб
  • Регистър за смяна на Arduino 74HC595
  • 8 светодиода
  • 8 резистора - 220 ома трябва да са достатъчни
  • Проводници/джъмпери

Започнете, като поставите регистъра за смяна на оформлението, като се уверите, че всяка страна е на отделна страна на оформлението, както е показано по-долу.

С надписа нагоре забийте карфици 1-8 от лявата страна отгоре надолу и 16 - 9 от дясната страна отгоре надолу, както е показано на снимката по-долу.

Сглобяване на веригата

Първо свържете щифтове 16 (VCC) и 10 (SRCLR) към изхода 5v на Arduino и свържете щифтове 8 (GND) и 13 (OE) към щифта Gnd на Arduino. Пин 13 (OE) се използва за активиране на изходите, тъй като е активен нисък щифт, който можем да свържем директно към земята.

След това трябва да свържем три пина, които ще използваме за управление на регистъра за смяна:

  • Пин 11 (SRCLK) на регистъра за изместване 74HC595 към пин 11 на Arduino - това ще се нарича "пин за синхронизиране"
  • Пин 12 (RCLK) на регистъра за изместване към щифт 12 на Arduino - това ще се нарича "фиксиращ щифт"
  • Пин 14 (SER) на регистъра за изместване към пин 13 на Arduino - това ще се нарича "пин за данни"

И трите щифта се използват за извършване на преместването на битове, споменато по-рано в този урок. За щастие Arduino предоставя помощна функция специално за регистрите за преместване, наречена shiftOut, която ще се справи с почти всичко вместо нас, но ще се върнем към това, докато преглеждаме кода.

Сега просто трябва да свържем всички изходни щифтове към нашите светодиоди, като се уверим, че резистор е поставен пред светодиодите, за да се намали тока и че катодите на светодиодите са насочени към земята.

За да сведем бъркотията с кабели до минимум, поставихме резисторите и светодиодите на отделна макетна платка, но можете да използвате една макетна платка.

Когато поставяте светодиодите, уверете се, че са свързани по ред, така че QA да е свързан към първия светодиод, а QH да е свързан към последния светодиод, в противен случай нашият код няма да включи светодиодите в правилния ред. Когато приключите, трябва да имате нещо подобно:

Скица за Arduino

Сега сме готови да качим кода. Свържете вашия Arduino към вашия компютър и изтеглете следната скица за 74hc595 Arduino към него:

Int latchPin = 12; int clockPin = 11; int dataPin = 13; байт светодиоди = 0; int currentLED = 0; void setup() ( pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); leds = 0; ) void loop() (leds = 0; if (currentLED == 7) ( currentLED = 0; ) else ( currentLED++; ) bitSet(LEDs, currentLED); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, светодиоди); digitalWrite(latchPin, HIGH); delay(250); )

Първо, нека дефинираме следното в горната част на скицата:

  • Местоположение на щифтове: синхронизатор, резе и данни
  • Байт, който ще съхранява битовете, които казват на регистъра за смяна кой щифт да използва
  • Променлива, която ще следи кой светодиод трябва да включим

В метод настройвамние просто инициализираме режимите на пиновете и променливата на светодиода.

В метод цикъл(цикъл) изчистваме битовете в променливата светодиодив началото на всяка итерация, така че всички битове са зададени на 0, тъй като искаме да включваме само един светодиод наведнъж. След това увеличаваме или рестартираме текущата променлива currentLEDза да включите отново правилния светодиод.

След тези две операции преминаваме към по-важната част - преместване на битове. Първо започваме с извикване на метода bitSet. Преминаваме към метода bitSetбайт, който съхранява битове, и променлива currentLED.

Този метод ни позволява да зададем отделни битове от байт, като посочим тяхната позиция. Например, ако искаме ръчно да зададем байт на 10010 , можем да използваме следните извиквания, тъй като битовете, които трябва да зададем на 1, са вторият отдясно (което е позиция 1, когато започнем от позиция 0) и петият отдясно, който е на позиция 4:

BitSet (светодиоди, 1); bitSet(светодиоди, 4);

Така че всеки път, когато увеличаваме текущата променлива currentLEDи го предайте на метода bitSet, задаваме бита вляво от предишния на 1 всеки път и по този начин казваме на регистъра за смяна да активира изхода вляво от предишния.

След като зададем битовете, ние записваме на щифта на резето, за да посочим на регистъра за смяна, че ще изпратим данни към него. След като направим това, извикваме метода shiftOut, което е Arduino. Този метод е проектиран специално за използване на регистри за преместване и ви позволява просто да премествате битове в едно извикване. За да направим това, предаваме данни и синхронизация като първите два параметъра, след което предаваме константа LSBFIRST, което казва на метода, че първият бит трябва да бъде най-малкият бит и след това преминаваме през байта, съдържащ битовете, които всъщност искаме да преместим в регистъра за преместване.

След като приключим с преместването на битовете, влизаме отново в фиксатора (този път като използваме HIGH), за да покажем, че сме изпратили всички данни. След като операцията по запис приключи, съответният Лед индикатори след това прави пауза за 250 милисекунди, преди да се повтори.

16 светодиода

Сега нека преминем към по-сложна схема, използваща 74hc595 Arduino за 16 светодиода.

Подробности

Като цяло в в такъв случайУдвояваме броя на всички компоненти, с изключение, разбира се, на Arduino Uno:

  • Arduino UNO (x1)
  • 74HC595 смяна регистър (x2)
  • светодиоди (x16)
  • резистори 220 ома (x16)
  • Проводници/джъмпери
  • Две развойни платки (едната с 400 пина, втората с 830 пина)
  • Потенциометър за контрол на яркостта (опция)

Схема на свързване

Схемата на свързване вече е по-голяма, отколкото с 8 светодиода и един регистър за смяна 74HC595.

Сглобете веригата, както е на фигурата по-горе, и свържете първия регистър за смяна, както следва:

  • GND (щифт 8) към маса
  • Vcc (пин 16) - 5V
  • OE (щифт 13) към маса (GND)
  • MR (пин 10) - 5 V
  • DS (щифт 14) - щифт 11 на Arduino
  • SH_CP (щифт 11) към щифт 12 на Arduino
  • ST_CP (щифт 12) към щифт 8 на Arduino

Свържете втория регистър за смяна по същия начин, но свържете DS (щифт 14) към първия щифт 9 на регистъра. След това свържете щифтове 1, 2, 3, 4, 5, 6, 7 и 15 от двата регистъра и светодиодите. Тази връзка прави всички пинове винаги активни и адресируеми, но когато включите Arduino, някои от светодиодите може да са включени. Решението за това е да свържете MR (пин 10) и OE (пин 13) към Arduino директно, но по този начин трябва да пожертвате 2 пина на Arduino.

За да добавите още регистри за преместване, свържете ги заедно като втори регистър. Винаги свързвайте щифтовете MR и OE директно към щифта Arduino и щифта DS към предишния регистър. Ако искате да регулирате яркостта на светодиодите, свържете потенциометър, както е показано на снимката по-горе, за да контролирате съпротивлението на всички светодиоди. Това обаче не е задължително и можете да го направите без него.

Скица за Arduino

Вариантите на скица обикновено са предназначени за ограничен брой регистри за преместване, т.к Няма универсална функция/метод за това. Този кодпо-долу е преработен, така че да можете да използвате неограничен брой смени регистри:

int latchPin = 8; int clockPin = 12; int dataPin = 11; int numOfRegisters = 2; байт* registerState; дълъг ефектId = 0; дълъг превЕфект = 0; дълъг ефект Повторение = 0; дълъг ефект Скорост = 30; void setup() ( //Инициализиране на масив registerState = нов байт; за (size_t i = 0; i< numOfRegisters; i++) { registerState[i] = 0; } //set pins to output so you can control the shift register pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { do{ effectId = random(6); } while (effectId == prevEffect); prevEffect = effectId; switch (effectId) { case 0: effectRepeat = random(1, 2); break; case 1: effectRepeat = random(1, 2); break; case 3: effectRepeat = random(1, 5); break; case 4: effectRepeat = random(1, 2); break; case 5: effectRepeat = random(1, 2); break; } for (int i = 0; i < effectRepeat; i++) { effectSpeed = random(10, 90); switch (effectId) { case 0: effectA(effectSpeed); break; case 1: effectB(effectSpeed); break; case 3: effectC(effectSpeed); break; case 4: effectD(effectSpeed); break; case 6: effectE(effectSpeed); break; } } } void effectA(int speed){ for (int i = 0; i < 16; i++){ for (int k = i; k < 16; k++){ regWrite(k, HIGH); delay(speed); regWrite(k, LOW); } regWrite(i, HIGH); } } void effectB(int speed){ for (int i = 15; i > < i; k++){ regWrite(k, HIGH); delay(speed); regWrite(k, LOW); } regWrite(i, HIGH); } } void effectC(int speed){ int prevI = 0; for (int i = 0; i < 16; i++){ regWrite(prevI, LOW); regWrite(i, HIGH); prevI = i; delay(speed); } for (int i = 15; i >= 0; i--)( regWrite(prevI, LOW); regWrite(i, HIGH); prevI = i; delay(speed); ) ) void effectD(int speed)( for (int i = 0; i< 8; i++){ for (int k = i; k < 8; k++) { regWrite(k, HIGH); regWrite(15 - k, HIGH); delay(speed); regWrite(k, LOW); regWrite(15 - k, LOW); } regWrite(i, HIGH); regWrite(15 - i, HIGH); } } void effectE(int speed){ for (int i = 7; i >= 0; i--)( for (int k = 0; k<= i; k++) { regWrite(k, HIGH); regWrite(15 - k, HIGH); delay(speed); regWrite(k, LOW); regWrite(15 - k, LOW); } regWrite(i, HIGH); regWrite(15 - i, HIGH); } } void regWrite(int pin, bool state){ //Determines register int reg = pin / 8; //Determines pin for actual register int actualPin = pin - (8 * reg); //Begin session digitalWrite(latchPin, LOW); for (int i = 0; i < numOfRegisters; i++){ //Get actual states for register byte* states = ®isterState[i]; //Update state if (i == reg){ bitWrite(*states, actualPin, state); } //Write shiftOut(dataPin, clockPin, MSBFIRST, *states); } //End session digitalWrite(latchPin, HIGH); }

Кодът добавя няколко ефекта за тези 16 светодиода. Ако искате да добавите повече светодиоди, свържете повече регистри за преместване, както по-горе, и променете стойността numOfRegistersв кода.

Можете също да използвате този код за повече от светодиоди, ако просто имате нужда от повече щифтове за вашия Arduino, използвайте функцията regWrite(int pin, bool state), за да запишете състоянието на всеки щифт. И няма ограничение за това колко регистри за преместване използвате, просто променете стойността на numOfRegisters и останалото вече е автоматизирано.

Shift регистрите се използват широко за съхраняване и обработка на информация в микрокомпютрите. Регистърът за преместване се състои от поредица от тригери (по един за всеки бит информация), свързани така, че изходът на всеки тригер да е свързан към входа на следващия. Информацията в регистъра се измества с един бит надясно или наляво с всеки тактов импулс. Това устройство е идеално за обработка на серийна информация (подавана един бит наведнъж), преобразуване на паралелна информация (всички битове, пристигащи едновременно) в серийна и серийна в паралелна.

Shift регистрите се реализират на SIS устройства, направени с RS, JK или D тригери, като разликите между тях са свързани главно с метода на обработка на входни и изходни данни. Този раздел описва основните видове тези регистри.

Ориз. 2.29. Типичен 4-битов регистър със сериен вход.

Ориз. 2.30. Времева диаграма на работата на 4-битов преместващ регистър.

Регистър за смяна на сериен вход.

Регистърът за смяна на серийния вход е устройство, в което данните се въвеждат последователно, както е показано на фиг. 2.29 за 4-битов преместващ регистър. В този случай се използват D-тригери. Регистърът работи по следния начин. В първоначалната позиция импулсът за нулиране (логическа 0) се прилага към входа „Настройка на 0“, настройвайки изходите Q 0 -Q 3 на 0. След това първият бит данни се подава към серийния вход. Когато е изложен на нарастващия фронт на първия тактов импулс, Q 0 приема стойност, равна на D 1 . Тогава D 2 се подава към серийния вход. Когато е изложен на предния фронт на втория тактов импулс, Q 0 =D 2 и Q 1 =D 1 . Този процес продължава, след четири тактови импулса имаме Q 0 =D 4, Q 1 =D 3, Q 2 =D 3, Q 3 =D 1. Времевата диаграма за последователно пристигащи входни данни е показана на фиг. 2.30.

Изходните данни могат да бъдат последователни или паралелни. В последния случай преместващият регистър работи като сериен към паралелен преобразувател. Очевидно за регистрите за смяна, които имат голям брой битове (повече от осем), паралелните изходи не са практични поради големия брой изходи в пакета IC. Има регистри за преместване с повече от 1000 бита.

Регистър за смяна на паралелен вход

Регистър за смяна с паралелен вход е устройство, в което входните данни пристигат едновременно през паралелни информационни канали (фиг. 2.31).Данните се записват в регистъра, както следва. Първо, съдържанието на регистъра се нулира чрез прилагане на импулс (логическа 0) към входа „Настройка на 0“. След това D 1 -D 4 се подават към входовете и импулс (логическа 1) се подава към входа за запис. Това кара информацията да се записва във всички регистри, използвайки предварително зададените входове. След това с всеки тактов импулс информацията се измества с един бит надясно. Изходът на данни може да бъде сериен или паралелен. Много регистри за преместване, базирани на IC, имат паралелен вход и сериен изход. Тези устройства са известни като паралелни към последователни преобразуватели.

В регистрите за изместване, описани по-горе, изместването се извършва в една посока при всеки тактов импулс. В много случаи обаче е желателно информацията да може да се измества както наляво, така и надясно. Регистрите, които имат тази възможност, се наричат ​​обратими регистри за изместване. Контролът на преместването в такива регистри се осъществява чрез свързване на изходите на тригерите към съответните входове при преместване наляво или надясно. Посоката на превключване се контролира от входа "Метод на работа". Реверсивните преместващи регистри с последователни и паралелни входове и изходи се наричат ​​универсални преместващи регистри.

Ориз. 2.31. Типичен 4-битов преместващ регистър с паралелен изход.

Пример за регистрация

В микросхемата IR1 всеки бит се формира от синхронен двустепенен RS тригер с входна логика (фиг. 2.32). Регистърът за смяна ви позволява да реализирате следните режими на работа: запис на информация с помощта на паралелен код; изместване надясно; изместване наляво. Режимът на работа на регистъра се управлява чрез входове VI, V2, C1, C2 (изводи 1, 6, 9, 8).

Ориз. 2.32. Логическа структура на микросхемата IR1

За да запишете в информационния регистър с помощта на паралелен код, приложете напрежение с високо ниво към входа за управление на режим V2, напрежение с ниско ниво към входа C2 и информационни сигнали към входовете D1 - D8. Напрежението на входовете C1, VI може да бъде всяко. За да се измести информацията, записана в паралелния код надясно, към вход C2 (щифт 8) се прилагат тактови импулси. В този случай напрежението на входа V2 (пин 6) трябва да се поддържа на високо ниво. При извършване на операции с данни, представени в сериен код, входната информация под формата на последователност от импулси се подава към информационния вход VI (пин 1), тактови импулси към входа за синхронизация C1 (пин 9) и ниско ниво на напрежение се поддържа на входове V2, D1 - D8. Режимите на работа на IS IR1 за различни видове запис на информация са представени в табл. 2.11.

При преместване наляво към входа за избор на режим V2 се подава високо напрежение, което блокира преминаването на тактови импулси за преместване надясно. Ако в този случай паралелният код на число не се подава към входовете на паралелния код на битове D1 - D8, но изходът на последния бит е свързан с входа на паралелния код на предходния бит, неговият изход с подобен вход на предишния бит и т.н., тогава получаваме ляв регистър за изместване. Входът на серийния код в този случай е входът на паралелния код на последния бит на регистъра за смяна.

Микросхемите IR1 могат да се използват като основен елемент в устройства с аритметична буферна памет, елемент на забавяне за n тактови цикъла, преобразувател на серийни кодове в паралелни и обратно, делител на честота, разпределител на импулси с контур и др.

За изграждане на регистри се използва последователно свързване на тези елементи.

Сериен регистър (регистър за смяна или регистър за смяна) обикновено се използва за преобразуване на сериен код в паралелен код и обратно. Използването на сериен код е свързано с необходимостта от предаване на голямо количество двоична информация през ограничен брой свързващи линии. При паралелно предаване на разряди е необходим голям брой свързващи проводници. Ако двоичните битове се предават последователно, бит по бит, по един проводник, тогава размерът на свързващите линии на платката (и размерът на пакетите с чипове) могат да бъдат значително намалени.

Схематична диаграма на сериен (изместващ) регистър, сглобен на базата и позволяващ преобразуването на сериен код в паралелен, е показана на Фигура 1. Моля, имайте предвид, че ако и тригери, базирани на потенциал (тригери с резе), и тригери, работещи на ръба , тогава само D тригери, работещи на ръба, са подходящи за прилагане на последователен (изместващ) регистър!


Фигура 1. Схема на последователен (изместващ) регистър

Вътре в регистъра за смяна тригерите са свързани последователно, т.е. изходът на първия е свързан към входа на втория и т.н. Разглежданият сериен регистър е показан на фигура 2.


Фигура 2. Графично обозначение на последователен (изместващ) регистър

Входовете за часовник в последователни (изместващи) регистри, както и в паралелни регистри, се комбинират. Това осигурява едновременната промяна на състоянието на всички тригери, включени в последователния (изместващ) регистър.

Преобразуването на сериен код в паралелен в сериен (шифт) регистър се извършва по следния начин. Индивидуални битове двоична информация се подават последователно на входа на преместващия регистър D0. Всеки бит е придружен от отделен тактов импулс, който се прилага към тактовия вход на серийния регистър C.

След като пристигне първият тактов импулс, логическото ниво, присъстващо на входа D0, се съхранява в първия тригер на серийния (променлив) регистър и отива към неговия изход и тъй като е свързан към входа на втория тригер, също към неговия вход. Ако серийният (променлив) регистър беше сглобен на D тригери, работещи с потенциал, тогава този бит веднага ще бъде записан във втория D тригер! В нашия случай това не се случва, тъй като до този момент фронтът на тактовия вход C вече е приключил.

След като пристигне вторият тактов импулс, логическото ниво, присъстващо на входа на втория тригер на серийния (променлив) регистър, се съхранява в него и отива на неговия изход, и тъй като е свързано към входа на третия тригер, също към неговия вход. В същото време следващият бит от входния сериен код се съхранява в първия тригер на серийния (сместващ) регистър.

След пристигането на четвъртия тактов импулс, логическите нива на битовете, които са били последователно присъстващи на неговия вход D0, ще бъдат записани в тригерите на серийния (променлив) регистър. Сега тези битове могат да се използват например за показване на индикатори.

Нека сигналът пристигне на входа на сериен (смяна) регистър, чиято времева диаграма е показана на фигура 3, тогава състоянието на изходите на този регистър последователно ще приеме стойностите, записани в таблица 1.



Фигура 3. Времева диаграма на операцията в регистъра за преместване

На фигура 3, заедно с логическите нива, се записват битовите стойности, които се предават по свързващата линия или присъстват на изходите на регистъра за смяна.

Номер на лентата 1 2 3 1
Q0 1 0 1 1
Q1 х 1 0 1
Q2 х х 1 0
Q3 х х х 1

Като пример за внедряване на последователен (изместващ) регистър може да се назове вътрешната микросхема 1564IR1 или чуждата 74NS164.

jk тригерите могат да се включват последователно един след друг, за да се запази последователността от цифри. Този дизайн, наречен смяна регистър, показано на фиг. 13.27. Схемата получи името си въз основа на

Ориз. 13.27. 4-битов преместващ регистър, образуван от JK тригери, свързани последователно.

гарантирайки, че получава една нова цифра при всеки тактов импулс, плъзганепредварително запаметени цифри на едно място, за да поставите нова.

Този регистър работи на принципа първи влязъл, първи излязъл(First-In First-Out, FIFO).

Нека разгледаме работата на регистъра за смяна, показан на фиг. 13.27. Линията за нулиране първо се задвижва до логическо 1 и след това се нулира до 0. Сега приемете, че входните данни първоначално са 1 и че последователност от тактови импулси е приложена към входа на часовника. В този случай тригерът FF1 има високо ниво на входа и ниско ниво на входа, така че след първия тактов импулс изходът Qнивото е зададено високо. Да предположим, че междувременно входният сигнал се е върнал на стойност 0 и остава такъв. По време на втория тактов импулс високото ниво на входа/тригера на FF2 се прехвърля към неговия изход и Въпрос 2приема стойността на логическа 1. В същото време логическа 0 работи на входа / на тригер FF1, така че вторият тактов импулс задава изхода нисък; Ако входните данни останат 0, изходът ще остане нисък с всеки тактов импулс. Въпреки това, логическият 1 бит се придвижва с един бит напред с всеки тактов импулс, така че след четири импулса ще достигне изхода Q4.Сега се съхраняват общо 4 бита входни данни. Следващите тактови импулси ще доведат до загуба на тези данни, докато по-новите данни ще бъдат запазени.

В регистъра за смяна, показан на фиг. 13.27 е възможно, ако е необходимо, да наблюдавате съхранените данни в паралелна форма, осигурявайки достъп до изходите Q срещу Q 2, Q 3И Q4.Този дизайн е известен като сериен входящ, паралелен изходящ регистър: данните трябва да се въвеждат последователно през един вход, след което те са достъпни паралелно на изходите на регистъра. Това серийно към паралелно преобразуване е много често срещана операция, използвана например за преобразуване на програмни битове, прочетени от компютърен диск, в паралелен код за въвеждане в основната памет.

Ако всеки тригер е снабден с отделен наборен вход в допълнение към общия вход за нулиране, тогава данните могат да се въвеждат паралелно през тези входове. Данните, „заредени“ по този начин, могат да бъдат получени на изхода Q 4 в последователна форма чрез прилагане на тактови импулси. Такъв регистър служи като паралелен към сериен преобразувател и често се използва за преобразуване на изходни данни от микропроцесор, представени от сигнали, появяващи се едновременно на голям брой изходи (например 16 изхода), в сериен код за предаване през a единична двойка кабели към мрежа или модем. Популярен дизайн, който може да се използва за преобразуване на данни от паралелен към сериен и обратно, е универсалният асинхронен приемо-предавател; той съдържа в една интегрална схема необходимите регистри за преместване, схема за управление и драйвери за работа по линията.

Ако в диаграмата, показана на фиг. 13.27, изход Q 4 е свързан към входа за данни, тогава данните, които могат да бъдат въведени паралелно през входовете на инсталацията, никога няма да могат да напуснат регистъра, а просто ще циркулират в него. Тази схема се нарича регистър с цикличен трансферили брояч на пръстени.С помощта на 10 тригера, свързани в пръстен брояч и номерирани от 0 до 9, може да се получи десетичен брояч. Първоначално тригер номер 0 е настроен на високо ниво, а останалите се нулират на нула. След това импулсите, които трябва да бъдат преброени, се прилагат към входа на часовника, така че с пристигането на всеки входен импулс, логика 1 се премества от единия тригер към другия. След девет импулса ще бъде записано логическо 1 за задействане номер 9 и следващият импулс ще възстанови първоначалното състояние. Свързването на изхода на тригер номер 9 към входа на друг пръстеновиден брояч ще позволи записването на десетки в него, а друг пръстеновиден брояч ще може да записва стотици. Въпреки очевидната елегантност на тази схема, почти винаги е по-удобно да се брои в двоична система и след това да се преобразува изхода на двоичния брояч в десетична.

Друго приложение на измервателния уред е да замени разпределител в електронната система за запалване на автомобила. Вместо механична гърбица за отваряне и затваряне на контактните точки за създаване на искра за запалване, часовниковите импулси се генерират с помощта на оптичен или магнитен сензор, разположен на маховика на двигателя. Тук се използва логическа 1 смяна в кръг в кръгов брояч, който има една цифра за всеки цилиндър на двигателя. Фазата на часовниковия импулс може да бъде внимателно регулирана, така че логическа 1 да се появи на всеки етап в точното време за запалване на сместа. По този начин корекцията на момента на запалване се настройва без затруднения и нещо повече, веднъж зададена, тя никога няма да се промени, тъй като няма механично износване в електронния разпределител.

Схемата на регистъра за смяна, показана на фиг. 13.27 може да се използва като основа за експерименти с всички видове регистри за преместване и пръстеновидни броячи. IC 74LS76 се препоръчва като I^-тригер: всяка микросхема съдържа два тригера, задействани от отрицателен фронт с отделни входове за настройка и нулиране. pinout на тази схема е даден в Приложение 4.



Свързани публикации