Date post: | 20-Dec-2015 |
Category: |
Documents |
View: | 220 times |
Download: | 1 times |
• The purpose of this project is to build a coded Hex Calculator that does the following operations:
- Multiply-Square of a number
- Addions of signed and Unsigned Numbers- Subtractions of signed and Unsigned Numbers
- Division
- Signed Division
case 1: - Multiplying two negative numbers--> will give the answer in positve so we will take the abs of the two numbers and then multiply:
the abs function (Absolute Value Function): -This function will take the 2s’ complement of the number if the number is negative (signed)
case 2: If a positive number is multiplied by a negative number then for surethe ans is going to be negative. For the ans to be negative we willtake the abs of that negative number and then do a normal multiply and to show that the ans is negative will turn on the LED showing the negative sign.
case 3: when both are positive then we will do the regular multiply
Sigmul.Whp: SM* (A B -- +(A*B))OVER OVER /2Dup A B A BXOR 80 AND /n = ((A xor B) and 80h) -- To check wheather only /one of them is negative DUP /A B n n>R /A B n?ABS /call to the routine ?ABS to take the absolute /values of negative numbers either A or B or /both* /call to the normal unsigned multiplication routine
/for multiplying / C = |A|*|B|R> /C nIF /if n = 1 the answer is negative indicated by
/pushing 80h into 80 LD! / LED registerTHEN ;
This routine multiplies the input number by itself. The following is the whyp file for square.
: SQUARE (A -- A*A ) DUP / A A * ; /call to unsigned multiplication routine for multiplying A*A
How to do Unsigned Division to get 16-bit Quotient and a 8-bitremainder.
* In order to get a 16-bit quotient we need to carry out the normal division two times.
* Each time we will get a 8-bit quotient.
* This routine will not give us an overflow unless a number is divided by 00h.
unsigndiv.whp
: MU/MOD (NL NH D -- R Q) /THIS ROUTINE DIVIDES /16-BIT NUMERATOR WITH /8-BIT DENOMINATOR TO /GIVE 8-BIT QIUOTIENT AND /8-BIT REMAINDER -ROT /D NL NH DIV DIV DIV DIV DIV DIV DIV DIV ROT_DROP_SWAP ; /R Q
: UM/MOD (NL NH D -- R QL QH) >R 00 R@ /NL NH 00 D D MU/MOD /R QH D R> /R QH D SWAP /R D QH >R /R D QH MU/MOD /R2 QL QH R> ; /R2 QL QH
This takes in a 16-bit signed numerator and an 8-bit DenominatorTherefore, the sign numbers can be broken down into the followingcategories:1. 0000h to 7FFFh --> Positive numbers2. 8000h to FFFFh --> Negative numbersThe following are the cases for signed division:
Divident Divisor Quotient Remainder Negative Negative Positive Negative Negative Positive Negative Negative Positive Negative Negative Positive Positive Positive Positive Positive
Signdiv.whp
: DIVIDE* (NL NH D -- R QL QH) OVER OVER AND /NL NH D NH D 80 AND IF /NH<0 D<0 --> QLQH>0 AND R<0 ABS -ROT DABS /|D| |NL| |NH| ROT UM/MOD /R QL QH WAITBTN3 /R QL QH DROP DROP 0= /R IF /IF R = 0 NO NEED TO SHOW NEGATIVE SIGN 00 LD! /ELSE LIGHT UP THE SIG LED ELSE 80 LD! /SHOWS REMAINDER IS NEGATIVE THEN
ELSE /EITHER NUMERATOR OR DENOMINTOR < 0 OR BOTH > 0 0< IF /D<0 AND NLNH >0 --> QLQH<0 AND R>0 ABS /NL NH |D| UM/MOD /R QL QH 0= >R SWAP 0= /CHECKS WHEATHER QUOTIENT IS ZERO OR NOT >R SWAP R> R> AND
IF /IF QUOTIENT IS ZERO NO NEED TO SHOW THE /NEGATIVE SIGN 00 LD! ELSE 80 LD!
THEN WAITBTN3 00 LD! /R QL QH DROP DROP /R
ELSE -ROT /D NL NH 0< /CHECKS WHEATHER NUMERATOR < 0 IF /D>0 AND NLNH<0 --> R<0 AND QLQH<0 DABS /D |NLNH| ROT UM/MOD /R QL QH
0= >R SWAP 0= /CHECKS WHEATHER QUOTIENT IS ZERO OR NOT >R SWAP R> R> AND
Cont...
IF /IF QUOTIENT IS ZERO NO NEED TO SHOW THE /NEGATIVE SIGN
00 LD! ELSE 80 LD! THEN
WAITBTN3 /R QL QH DROP DROP /R 0= IF /CHECKS WHEATHER QUOTIENT IS ZERO OR NOT 00 LD! ELSE 80 LD! THEN ELSE /D>0 NLNH>0 --> R>0 QLQH>0 ROT /NL NH D UM/MOD /R QL QH WAITBTN3 /R QL QH DROP DROP /R THEN THEN THEN ;
Cont...
Case 1:Subtracting when both the numbers are negative:
subcase 1:if B>A then get a positive answerelse get a negative answer
Case 2:When one of A or B is a negative number
subcase 1:if A ‘+ve’ and B ‘-ve’ then ans = A + Belse if A ‘-ve’ and B is ‘+ve’ then ans = -(A+B)
Case 3:when both are positive ans = A-B and the ans is postive or neg depending on the magnitude of A and B
: S- (A B -- A-B) 0< /checks wheather B<0 IF /B<0
SWAP /B A 0< /checks wheather A<0IF /A<0 and B<0 - 0< / C = B-A IF /checks wheather C<0 ABS ELSE 80 LD! THEN ELSE /B<0 and A>0 SWAP ABS + /C = A-(-B) 0< /if C<0 It is a overflow IF FF LD! /Indicates a overflow THEN THEN
ELSE SWAP 0< IF /B>0 and A<0 ABS + /C = -A-B 0< /If C is negative indicates a overflow
/else answer is negative and 2'scomplement /of C
Signsub.whp
IF FF LD! ELSE
80 LD! THEN
ELSE /A>0 and B>0 SWAP - /C = A - B 0< IF /if B>A then answer is negative and 2'scomplement of ABS /of C 80 LD! THEN
THEN THEN ;
Cont...
Changes Made to The W8Y controller
DS
T
N
Tmux
Tregclkclr
Nregclkclr
ALU3
T1
N
Tin
alusel(3:0)
tsel(1:0)
tload
nload
y
Nmux
Nin
nsel
T1
Smux
stack16x8
N1
N1
N2
N2y
T1
N2
clkclr
pop
push
empty
full
d
ssel
0 1 2 3
0
0
1
1
DataStack_ALU
Changed fromMux2g to mux 3g
Output Y2 of ALU4
N2
ALU4
Input from 16x8Dpram
Whyp Words Added to W8Y controller
* mpp : Carries out the multiplication of the numbers in the data stack when called 8 times
* divide: carries out the division of the numbers in the data stack when called 8 times to leave a 8-bit quotient and 8-bit remainder
* ABS: takes the absoloute value of the number in T-Reg
* DABS: Takes the 2s complement of a 16-bit number and leaves the higher 8-bit in T-Reg and the lower 8-bits in N-Reg
User’s Guide
1. First enter the code for the operation to be carried out.
Project 1 operations:hex code operation01h signed subtraction02h unsigned multiplication03h Square04h signed multiplication
Project 2 operations:hex code operations01h unsigned division02h signed division
If the entered hex code is different from the above codes all the LEDs will Light upindicating a NULL operation.
2. Enter the required hex values
Cont … user guide
* For division enter the lower 8-bits of numerator first and followed by higher 8-bits followed by the denominator
* Press BTN3 to enter the values through the switches.
* Negative numbers will be indicated by turning on the most significant LED by pushing 80h in the LD-reg
* Overflow is indicated by lighting up all the LEDs