не вичітаніе011 (3) Арифметичне умноженіе100 (4) Розподіл (ціла частина) 101 (5) Логічне «І» 110 (6) Логічне «АБО» 111 (7) Порозрядне інвертування
Серед наявних операцій можна виділити двухоперадние і однооперадние. До перших відносяться додавання, віднімання, множення, ділення, логічне «І» і «АБО». До других - пропуск і поразрядное інвертування. У однооперадних командах використовується тільки перший операнд Operand1 незалежно від другого Operand2.
Вихідний сигнал Result має розрядність в два рази більше, ніж вхідні операнди. Це необхідно у випадку множення, так як дана операція може призвести до подвоєння розрядності результату і запобігає переповнення.
Кожен вихідний результат супроводжується установкою відповідних біт-прапорів переповнення, нуля і від'ємного значення.
Прапор переповнення Flag0 встановлюється в стан «1», якщо сталося переповнення результату. Ця ситуація виникає при діленні на нуль, тобто коли на вхід другого операнда подати «0» і вибрати операцію ділення. Результат буде невідомий. У всіх інших випадках прапор скидається в нульовий стан.
Прапор нуля FlagZ встановлюється в «1», якщо отриманий результат приймає нульове значення. Така ситуація виникає, коли відбувається розподіл нуля на число, відмінне від нуля, або віднімання двох однакових чисел, а також в результаті побітових операцій. Якщо в результаті, не нуль, то встановлюється в нуль.
Прапор від'ємного значення FlagN встановлюється в «1», якщо результат операції негативний. При цьому вихідне значення Result має позитивне значення, рівне по модулю отриманому негативного. Нульове значення цей прапор приймає, якщо значення Result є позитивним.
Сигнал Clock використовується для синхронізації. За його позитивному фронту видається на вихід результат і прапори.
Розробка RS тригера
Для реалізації RS тригера необхідно додати ще одну операцію, яка буде виконувати роль даного тригера. При подачі на вході 00 значення буде зберігатися, при подачі на один з входів одиниці вихідне значення буде змінюватися, а при подачі 11 всі біти будуть встановлюватися в 1. Опис операції буде представлено нижче.
. Структура програми
Програма має наступну структуру: головний модуль ALU ВИКЛИКАЄ завдання-обробники операндів, тобто відповідні частини програми, які описують відповідну операцію. Завдання викликається головним модулем як функція з передачею відповідних параметрів головного модуля.
По результату виклику завдання головний модуль виробляє установку відповідних прапорів.
За позитивному фронту сигналу clock результат і прапори подаються на вихід пристрою.
4. Тіло програми
ALU (command_code, xdata, ydata, clock, result, flagZ, flagO, flagN); numbits=3; [3: 0] command_code; clock; [numbits: 0] xdata, ydata; [2 * numbits + 1:0] result; flagZ, flagO, flagN; [2 * numbits + 1: 0] res; z, o, n, temp; Disable; [2 * numbits + 1: 0] Disable; [numbits: 0] x, y;=x;=x; Summator; [2 * numbits + 1: 0] Summator; [numbits: 0] x, y; c_in; i; a, b, c, d, a1, b1, c1, bit, summa; (i=0; i lt;=numbits; i=i + 1)=~ x [i] amp; y [i] amp; c_in;=~ x [i] amp; y [i] amp; ~ c_in ;=c_in amp; x [i] amp; y [i];=x[i]amp;~y[i]amp;~c_in;[i]=a|b|c|d;=x[i]amp;y[i]amp;~c_in;=x[i]amp;~y[i]amp;c_in;=~x[i]amp;y[i]amp;c_in;=c|a1|b1|c1;_in=bit;[numbits+1]=bit;(i=numbits+2; i lt;=2 * numbits + 1; i=i + 1) [i]=0; Substance; [2 * numbits + 1: 0] Substance; [numbits: 0] x, y; (x gt;=y)=xy;=yx; Multiple; [2 * numbits + 1: 0] Multiple; [numbits: 0] x, y; ((x gt;=0 amp; amp; y gt;=0) || (x lt;=0 amp; amp; y lt;=0)) =x * y; ((x gt; 0 amp; amp; y lt; 0) || (x lt; 0 amp; amp; y gt; 0))=- x * y; Divide; [2 * numbits + 1: 0] Divide; [numbits: 0] x, y; (! y)='bx; ((x gt;=0 amp; amp; y gt; 0) || (x lt;=0 amp; amp; y lt; 0))= x/y; ((x gt; 0 amp; amp; y gt; 0) || (x lt; 0 amp; amp; y gt; 0))=- x/y; Operation_and; [2 * numbits + 1: 0] Operation_and ; [numbits: 0] x, y; i; (i=0; i lt;=numbits; i=i + 1) _and [i]=x [i] amp; amp; y [i]; (i=numbits +1; i lt;=2 * numbits + 1; i=i + 1) _and [i]=0; Operation_or; [2 * numbits + 1: 0] Operation_or; [numbits: 0] x, y; i; ( i=0; i lt;=numbits; i=i + 1) _or [i]=x [i] || y [i]; (i=numbits + 1; i lt;=2 * numbits + 1; i=i +1) _or [i]=0; Operation_not; [2 * numbits + 1: 0] Operation_not; [numbits: 0] x, y; i;=x; (i=0; i lt;=numbits; i=i +1) _not [i]=~ x [i]; (i=numbits + 1; i lt;=2 * numbits + 1; i=i + 1) _not [i]=0; Operation_RS; [2 * numbits + 1: 0] Operation_RS; [numbits: 0] x,y;i;temp;((x[0]==1)amp;amp;(y[0]==0))_RS[0]=0;((x[0]==0)amp;amp;(y[0]==1))_RS[0]=1;((x[0]==0)amp;amp;(y[0]==0))_RS[0]=Operation_RS[0];((x[...