You are on page 1of 44

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

VIỆN ĐIỆN TỬ - VIỄN THÔNG

BÀI TẬP LỚN MÔN THIẾT KẾ TỔNG HỢP HỆ THÔNG SỐ

ĐỀ TÀI: Thiết kế khối số học số thực dấu phẩy động

Giáo viên hướng dẫn : TS. Võ Lê Cường.

Nhóm 20:

Sinh Đinh Văn Nam 20091814


viên ĐTVT 01 K54

Nguyễn Mạnh Trung 20115803 CNĐT-


TT 1-k56

Hà Nội, 12/2014

1
Mục Lục.

Mục Lục …………………………………………………………………………1

Danh mục hình ảnh. ……………………………………………………………..2

Lời cảm ơn……………………………………………………………………… 3

Tóm tắt. …………………………………………………………………………4

Chương 1. Giới thiệu……………………………………………………. ..5

1.1 Giới thiệu……………………………………………………………5


1.2 FPU là gì? …………………………………………………………..5
1.3 Tiêu chuẩn IEEE754……………………………………………… ..7
1.4 Giới thiệu đề tài……………………………………………………..8
1.5 Kết luận chương. ……………………………………………………9

Chương 2. Lý Thuyết……………………………………………………. 10

2.1 Giới thiệu. …………………………………………………………..10


2.2 Số thực dấu phẩy động……………………………………………… 10

2.3 Biểu diễn số thực dấu chấm động thực hiện trong dự án…………….11

2.3.1 Biểu diễn số bù 2 của số nhi phân 4 bít. ……………………11


a. Phần phân số F(fraction). ……………………………..12
b. Phần số mũ E(exponent)……………………………….13

2.4 Nhân hai số thực dấu phẩy động. ……………………………………13

2.5 Cộng số thực dấu phẩy động………………………………………….18


2.6 Trừ hai số thực dấu phẩy động. ………………………………………19

2.7Kết luận chương………………………………………………………21

2
Chương 3 Mô phỏng và kết quả…………………………………………..22

3.1 Giới thiệu chương……………………………………………………22

. 3.2 Sơ đồ khối……………………………………………………………23

3.3 Kết quả mô phỏng……………………………………………………24

3.3.1 Kết quả mô phỏng trên quartus……………………………24

3.3.2 Kết quả mô phỏng trên Modulesim………………………..25

3.4 Kết luận chương……………………………………………..29

Chương 4 Kết Luận………………………………………………………30


Tài liệu tham khảo………………………………………………………………32

Phụ Lục …………………………………………………………………………33

Danh mục hình ảnh, bảng biểu.

3
Hình vẽ, Bảng biểu Mô tả
Hình 2.1 Thuật toán nhân số thực dấu phẩy động.
Hình 2.2 Thuật toán nhân hai số nguyên không dấu
Hình 2.3 Thuật toán cộng số thực dấu phẩy động.
Hình 2.4 Thuật toán trừ số thực dấu phẩy động.
Hình 3.1 Sơ đồ khối của chương trình.
Bảng 3.1 Mô tả chân dữ liệu trong sơ đồ khối.
Bảng 3.2 Bảng mô tả giá trị của mã phép toán.
Bảng 3.3 Bảng chuyển đổi số nhị phân 4 bít hiển thị trên led 7 thanh.
Hình 3.1 Kết quả mô phỏng thành công trên quartus
Hình 3.4 Sơ đồ luồng dữ liệu dataflow
Hình 3.5 Bảng kết quả trancript.
Bảng 3.4 Tổng hợp kết quả mô phỏng.

Lời cảm ơn.

Chúng tôi muốn bày tỏ lòng biết ơn chân thành đối với người hướng dẫn của
chúng tôi TS Võ Lê Cương, Viện Điện Tử Viễn Thông, Đại Học Bách Khoa Hà Nội đã

4
giám sát, tạo động lực và trên tất cả là sự giúp đỡ ở trong toàn bộ thời gian của dự án của
chúng tôi mà nếu không có thì dự án không thể hoàn thành.
Chúng tôi thực sự biết ơn đến tất cả bạn bè của chúng tôi, những người đã có
những góp ý quý báu trong thời gian chúng tôi làm dự án. Chúng tôi cũng phải thừa nhận
các nguồn tài nguyên học tập mà chúng tôi đã nhận được từ nhiều nguồn khác nhau.

Chúng tôi xin gửi lời cảm ơn tới gia đình, chính là nguồn lực động viên chúng tôi
phấn đấu trong học tập và cuộc sống.

Tuy có nhiều cố gắng trong quá trình học tập cũng như thời gian làm dự án nhưng
không thể tránh khỏi những thiếu sót, tôi rất mong được sự góp ý quý báu của tất cả các
thầy cô giáo và các bạn để dự án của chúng tôi được hoàn thiện.

Chúng tôi xin chân thành cảm ơn!!

Hà Nội, ngày 4 tháng 5 năm 2015.

Sinh Viên

Đinh Văn Nam

Nguyễn Mạnh Trung

Tóm tắt.

5
Khối số thực dấu phẩy động rất thông dụng trong bộ đồng xử lý toán học. Nó là
một phần của một hệ thống máy tính được thiết kế đặc biệt để thực hiện các hoạt động
tính toán trên các số thực dấu chấm động. Một số hoạt động tính toán trên khối FPU như:
cộng, trừ, nhân, chia. Mục đích là để xây dựng một CPU hiệu quả để thực hiện các chức
năng cơ bản cũng như chức năng siêu việt với việc làm giảm độ phức tạp của logic được
sử dụng làm giảm hoặc ít nhất giới hạn thời gian tương đương như dòng x87 và làm giảm
bộ nhớ càng nhiều càng tốt. Để thực hiện các chức năng như: cộng, trừ, nhân , chia….
các số thực dấu phẩy động phải chuyển đổi dữ liệu sang định dạng chuẩn IEEE 754. Tất
cả thuật toán trên đã được đồng bộ hóa và đánh giá theo môi trường Spartan 3E
Synthesis. Tất cả các chức năng được xây dựng bởi các thuật toán có hiệu quả với một số
thay đổi kết hợp ở cuối trong phạm vi cho phép.

Chương 1. Giới thiệu.

1.1 Giới thiệu chương.

6
Khối số thực dấu phẩy động rất thông dụng trong bộ đồng xử lý toán học. Nó được
thiết kế để thực hiện các hoạt động tính toán trên số thực dấu phẩy động. Một số hoạt
động tính toán trên khối FPU như: cộng, trừ, nhân, chia. FPU cũng có thực hiện một số
hoạt động tính toán khác như: hàm mũ, lượng giác. Các số thực dấu phẩy động được
chuẩn hóa theo chuẩn IEE754.

Ở chương này chúng tôi giới thiệu những nội dung sau:

FPU là gì? trong mục 1.2.

Giới thiệu tiêu chuẩn IEEE754 trongmục 1.3.

Sau đó tóm tắt về dự án trong mục 1.4.

Tóm tắt chương, mục 1.5.

1.2 FPU là gì?

Khi một CPU thực hiện một chương trình được gọi đến một số thực dấu phẩy
động (FP) hoạt động, có ba cách nó có thể thực hiện. Thứ nhất, nó có thể gọi là một số
thực dấu phẩy động giả lập, đó là một thư viện số thực dấu phẩy động, sử dụng một loạt
các phép tính số học số thực dấu phẩy động được thực hiện trên khối ALU. Các giả lập có
thể lưu trên các phần cứng bổ sung của một FPU nhưng chậm đáng kể. Thứ hai, nó có thể
sử dụng một thêm một FPU được hoàn toàn tách biệt với CPU, nó chỉ cần thiết để tăng
tốc độ tính toán . Còn lại là sử dụng tích hợp FPU có trong hệ thống.
FPU được thiết kế bởi với độ chính xác theo tiêu chuẩn IEEE754. Nó không chỉ
giải quyết các phép tính cơ bản với số thực dấu phẩy động như: cộng, trừ, nhân, chia mà
còn có thể xử lý các hoạt động như dịch, xác định căn bậc và các chức năng siêu việt như
sin, cos.

1.3 Tiêu chuẩn IEEE754.

IEEE754 là tiêu chuẩn công nghệ được thành lập bởi tổ chức IEEE754 và nó được
sử dụng rộng rãi trong việc tính toán số thực dấu phẩy động, theo sau bởi nhiều phần

7
cứng( CPU và FPU) và thực hiện trên phần mềm. Định dạng một số thực dấu phẩy động
chiếm 32 bit trong bộ nhớ của máy tính. Phiên bản hiện tại, IEEE 754-2008 ra mắt vào
tháng Tám năm 2008. Trong phiên bản IEEE754-2008 Trong IEEE 754-2008, 32-bit với
2 định dạng chính thức là: single precision hoặc binary32. Các tiêu chuẩn IEEE754 quy
định một số tực dấu phẩy động là có bít dấu hiệu đó có chiều dài 1 bít,một số mũ có chiều
dài 8 bit và phần định trị có chiều dài 24 bit trong đó 23 bit là được lưu trữ một cách rõ
ràng và 1bít là tiềm ẩn .

Bít dấu xác định dấu của số thực dấu chấm động. Bằng 0 thì số mang dấu dương,
bằng 1 số mang dấu âm. Phần mũ sử dụng số nguyên 8 bít có giá trị từ -128 đến 127 hoặc
dùng số nguyên không âm có giá trị từ 0 đến 255. Phần định trị chứa 23 bít phần bên phải
của điểm nhị phân và bít tiềm ẩn(nằm ở bên trái điểm nhị phân). Với số có giá trị bằng 1
thì tất cả các bít phần mũ đều bằng 0. Như vậy chỉ có 23 bit xuất hiện ở phần định trị
trong các định dạng bộ nhớ nhưng tổng cộng độ chính xác là 24 bit.

Ví dụ:

S EEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
E
31 30 23 22 0

IEEE 754 định nghĩa về các đinh dạng nhất định nó là một tập hợp các đại diện
của các giá trị và ký hiệu của số.

Định nghĩa các tiêu chuẩn [4]:

 Định dạng số học mà là tập hợp các số dấu chấm động nhị phân và thập
phân, trong đó bao gồm các số hữu hạn và số không, một giá trị đặc biệt
được gọi là "không phải là một con số" (NaN) và vô hạn.

 Định dạng trao đổi là một chuỗi bít (mã hóa) được sử dụng để trao đổi một
dữ liệu số thực dấu phẩy động trong một hình thức thu gọn và hiệu quả.
8
 Quy tắc làm tròn là giá trị của số thực đấu phẩy động phải được đưa về giá
trị phù hợp khi làm phép tính số học .

Trường hợp ngoại lệ là chỉ ra các trường hợp đặc biệt (như chia cho số không,
tràn bít trên, tràn bít dưới, vv) xảy ra trong quá trình thực hiện phép tính.

Trong năm trường hợp ngoại lệ. Tất các giá trị đều được đưa về giá trị mặc định.
Năm trường hợp ngoại lệ có là:
 Phép tính không chính xác là căn bậc hai với số âm, đầu ra trong không tồn
tại
 Chia cho không là một phép tính trên một toán hạng hữu hạn trong đó kết
quả là vô hạn ví dụ, 1/0 hoặc log (0) mặc định trả về vô cùng âm hoặc vô
cùng dương.
 Tràn bít xảy ra khi một phép tính có kết quả quá lớn nằm ngoái dải gí trị
cho phép. Kết quả trả về giá trị mặc định( làm tròn đền giá trị gần nhất).
 Underflow xảy ra khi một phép tính có kết quả quá nhỏ nằm ngoài khoảng
giá trị thông thường và không chính xác theo măc định.

1.4 Giới thiệu đề tài.


Thiết kế khối số học số thực dấu phẩy động(Floating Point Arithmetic unit) . Mỗi một
số thực dấu phẩy động gồm có 4 bít biểu diễn phần giá trị số thực và 4 bít biểu diễn phần
số mũ, với số âm biểu diển ở dạng bù 2. Khối số học số thực dấu phẩy động có các khối
lệnh sau:

 010 FPA Cộng các toán hạng số thực dấu phẩy động.
 011 FBS Trừ các toán hạng số thực dấu phẩy động.
 100 FBM Nhân các toán hạng số thực dấu phẩy động.
 101 FPD Chia các toán hạng số thực dấu phẩy động.

Kết quả sẽ được thể hiện ở dạng số thực dấu phẩy động ở dạng đã được chuẩn hóa và
được hiển thị trên LED 7 thanh. Sử dụng LED 7 thanh để chỉ ra phần tràn bộ nhớ.

9
Dữ liệu đầu vào của khối số thực dấu phẩy động sẽ được lấy tử bàn phím điện thoại
kích thước 4x4. Giả sử các đầu vào đều ở dạng chuẩn hoặc bằng 0. Hệ thống phải gồm
có khối phần số thực, khối phần số mũ, khối điều khiển, và khối hiển thị chuyển số nhị
phân 4 bít hiển thị trên led 7 thanh.

1.5 Kết luận chương.

Chương này mô tả ngắn gọn ý nghĩa của khối FPU và tiêu chuẩn IEEE 754, chế độ
làm tròn số, định dạng số học, trường hợp ngoại lệ và hoán đổi định dạng. Chương này
cũng đưa ra một cái nhìn tổng quan của dự án.

Chương 2. Lý thuyết.

2.1 Giới thiệu chương.


Trong chương này, phần 2.2 giới thiệu tổng quát về số thực dấu châm động, phần 2.3
giới thiệu về số thực dấu châm động thực hiện trong đề tài, phần 2.4 giới thiệu về thuật
toán nhân số thực dấu phẩy động, phần 2.5 giới thiệu về thuật toán cộng hai số thực dấu
10
châm động, phần 2.6 giới thiệu về thuật toán trừ hai sô thực dấu phẩy động Và cuối
cùng, phần 2.7 đưa ra một bản tóm tắt của chương.

2.2 Số thực dấu phẩy động.

Số thực dấu phẩy động(Floating Point Number) biểu diễn cho số thực .

Tổng quát: một số thực X được biểu diễn theo kiểu số dấu phẩy động như sau:

E
X=M* R

 M là phần định trị (Mantissa),

 R là cơ số (Radix),

 E là phần mũ (Exponent).

Chuẩn IEEE 754.

Cơ số R = 2

Các dạng:

 Dạng 32-bit

 Dạng 44-bit

 Dạng 64-bit

 Dạng 80-bit.

Ví dụ dạng 32 bít.

31 30 23 22 0

S e m
11
S là bit dấu:
 S = 0 số dương
 S = 1 số âm
e (8 bit) là mã excess-127 của phần mũ E:
 e = E+127  E = e – 127
 giá trị 127 gọi là là độ lệch (bias)
m (23 bit) là phần lẻ của phần định trị M:
 M = 1.m
Công thức xác định giá trị của số thực:
S e−127
 X = (−1) *1.m * 2 .

2.3 Biểu diễn số thực dấu chấm động thực hiện trong dự án.
2.3.1Biểu diễn số bù 2 của số nhi phân 4 bít.
a.Phần phân số F(fraction).
Chúng ta sẽ biểu diễn phần phân số bằng số bù hai như sau:
0
0.1012 −1 −2 −3
= 0∗2 + 1∗2 +0∗2 + 1∗2 =(5/8)10 .
1.0112 −1 −2 −3
= −1+0∗2 +1∗2 +1∗2 =(−5 /8)10

Bít ngoài cùng bên tay trái là bít dấu. Nếu bít dấu bằng 0 thì số đó mang dấu dương
con bằng 1 thì số đó mang dấu âm. Nhìn chung số F(fraction) mang giá trị âm được biểu
¿
diễn ở dạng bù 2 sẽ được tính như sau: F =2−F .

Ví dụ -5/8 được hiểu là: 10.000-0.101=1.011 . Khi dịch chuyển n-1 bít sang bên trái
n−1
thì giá trị của số đó phải chia cho 2 . Ở phần phân số thì số 1.000 là một trường hợp

đặc biệt là 2-1=1 do 10.000-1.000=1.000 nhưng chúng ta không thể biểu diễn số +1 ở
dạng bù hai vì số dương lớn nhất trong hệ thống số phân số là 0.111(7/8).
b. Phần số mũ E(exponent).

12
Chúng ta biểu diễn phần số mũ bằng số bù hai như sau:
3 2 1 0
01012
= 0∗2 + 1∗2 +0∗2 + 1∗2 =5 10 .
2 1 0
10112 −3
= −1∗2 +0∗2 +1∗2 + 1∗2 =−510

Bít bên ngoài cùng bên trái là bít dấu nếu bít dấu bằng 0 thì số đó mang dấu dương
còn nếu bít dấu bằng 1 thì số đó mang dấu âm. Dài giá trì của phần số mũ nằm trong
10002 01112 −810 710
khoảng từ đến tương đương tư đến .

2.3.2 Biểu diễn số thực dấu phẩy động trong dự án.


Số thực dấu phẩy động N được xây dựng từ phần phân số F(fraction) và số mũ
E
E(exponent). Khi đó N= F* 2 . Phần phân số và số mũ được trình bày ở dạng nhị phân

bù 2. Đặc trưng số thực dấu phẩy động trong hệ thống thì chiều dài của F là từ 16 đến 64
bít, chiều dài của E là 8 đến 15 bít. Nhưng trong dự án này, để dễ dàng thực hiện chúng
tôi chỉ sử dụng 4 bít cho phần thập phân và 4 bít cho phần số mũ. Ví dụ như sau:

F E N
5
0.101 0101 (5/8)* 2
1.011 1011 (-5/8)* 2
−5

1.000 1000 (-1)* 2


−1

Nếu F không ở dạng chuẩn chúng ta có thể chuyển về dạng chuẩn bằng cách dịch
về bên phải cho đến khi bít dấu và bít kế tiếp của nó khác nhau. Việc dịch bít về bên tay
phải đồng nghĩa với việc giá trị của F được nhân thêm với 2 vì vậy chúng ta phải giảm
giá trị của E xuống 1 để giá trị của N không thay đổi. Sau khi chuẩn hóa xong . Sau đây
là một số ví dụ về việc chuẩn hóa F:

Bảng 2.1 Chuẩn hóa F.

13
Trạng thái F E N
3
Chưa chuẩn hóa(Unnormalized) 0.0101 0011 (5/16)* 2 =5/2
2
Chuẩn hóa(Normalized) 0.101 0010 (5/8)* 2 =5/2
Chưa chuẩn hóa(Unnormalized) 1.11011 1100 −4
(-5/32)* 2 = −¿

−9
5* 2
Dịch trái F 1.1011 1011 −5
(-5/16)* 2 = −¿

−9
5* 2
Chuẩn hóa(Normalized) 1.011 1010 −6
(-5/8)* 2 = −¿

−9
5* 2

Số 0 không thể chuẩn hóa được, Vì vậy khi F=0 khi N=0. Do đó sẽ có rất nhiều
giá trị số mũ E có thể được dung để biểu diễn số N, cho nên để thống nhất một cách biểu
diễn người ta lấy số mũ có giá trị âm nhỏ nhất trong dải giá trị của E( 1000 đên 0111) là
1000. Vì vậy khi F và E biểu diễn bằng số nhị phân 4 bít thì số không được biểu diễn như
sau:

F=0.000 E=1000 N=0

Số thực dấu phẩy động dương nhỏ nhất biểu diễn trong dự án này có giá trị là
−8
0.001x 2 . Mốt số hệ thống số thực dấu phẩy động sử dụng hệ số mũ biased như là

E=0 đi kèm với F=0 khi biểu diễn sô 0.

2.4 Nhân hai số thực dấu phẩy động.

Trong phần này chúng ta sẽ thiết kế bộ nhân cho số thực dấu phẩy động. Chúng ta sử
dụng số nhị 4 bít cho phần F(fraction) và 4 bít cho phân E( exponent) , với số âm thì

14
được biểu diễn ở dạng số bù 2. Công thức tổng quát khi thực hiện nhân 2 số thực dấu
phẩy động như sau:

F
F1 E1 E2 ¿ E +E E
* 2 xF 1 * 2 = ¿ )x 2 =F* 2 .
1 2

F1 F2
Giả sử đầu vào chúng ta có và đã được chuẩn hóa và chúng ta muốn

kết quả đầu ra cũng được chuẩn hóa. Khi thực hiện nhân phần phân số( fraction) và cộng
phần số mũ sẽ xảy ra một số trường hợp đặc biệt cần phải chú ý.

Đầu tiên nếu F=0 thì mặc định giá trị E=1000(-8).

Thứ hai khi nhân -1 với -1 (1.000 x 1.000) khi đó kết quả sẽ là +1 nhưng chúng ta
không thể biểu diễn số 1 ở dạng bù 2 phần phân số. Chúng ta gọi đó là trường hợp
fraction overflow . Để giải quyết vấn đề này chúng ta gán F=1/2(0.100) và cộng 1 vào
E( E=E+1).

Khi nhân phần phân số(fraction) thì kết quả sẽ chưa chuẩn hóa. Ví dụ:

0.010
0.100❑ * 2E x 0.100❑ * 2E = ¿ E +E E + E −1
)x 2 =0.100* 2 .
1 2 1 2 1 2

¿
¿

Trong ví dụ trên chúng ta chuẩn hóa kết quả bằng việc dịch trái phần phần số một vị
trí và trừ đi một ở phần số mũ. Kết thúc nếu phần số mũ không nằm trong dải cho phép
của phần số mũ trong hệ thống thì sẽ xảy ra trường hợp tràn bít phần số mũ. Chúng ta sử
dụng 4 bít cho phần số mũ thì dải giá trị cho phép là: 1000 đến 0111(-8 đến 7). Khi xảy ra
tràn bít thì sẽ có tín hiệu báo tràn. Sau đây là sơ đồ thuật toán cho việc nhân số thực dấu
phẩy động.

N 1 và N 2
Với đầu vào là 2 số thực dấu phẩy động và kết quả là N.
E
N= F* 2 .

15
N1
= F1 * 2 .
E 1

N2
= F2 * 2 .
E 2

F1 E1 , F 2 E2
Với , , đều là số nhị phân 4 bít được biểu diễn ở dạng bù 2 đã

được trình bày ở mục 2.3.1


Bắt đầu

Nhân phần
F1 N F2 N định trị, cộng
=0 =0
phần số mũ
Y Y
F=0, E= F
-8 Y Tràn N
bít
F
F=1/2, Y Chuẩn N
E=E+1 hóa

F <<1
E=E-1
E
Tràn Y
bít
Báo tràn
N E

Kết
thúc
Hình 2.1 Thuật toán nhân hai số thực dấu phẩy động.

16
Sau đây là thuật toán khi nhân hai số không âm :Với C bít nhớ, A là tổng.

Bắt đầu
C0, A0
MSố bị
nhân
QSố nhân
Bộ đếm : i
Q[0]=1’
N b1 Y
C,A A+M
Dịch phải
C,A,Q
Bộ đếm i=i-1
Bộ đếm
i=0 N

Y
Kết thúc
Hình 2.2 Thuật toán nhân hai số nguyên không dấu.
Ví dụ về nhân hai số nguyên không dấu:

17
Số bị nhân M = 1011 (11)
 Số nhân Q = 1101 (13)
Tích = 10001111 (143)
 C A Q
 0 0000 1101 Các giá trị khởi đầu
 + 1011
 0 1011 1101 A ← A + M
 0 0101 1110 Dịch phải
 0 0010 1111 Dịch phải
 + 1011
 0 1101 1111 A ← A + M
 0 0110 1111 Dịch phải
 + 1011
 1 0001 1111 A ← A + M
 0 1000 1111 Dịch phải

Khi nhân hai số nguyên có dấu thì ta sẽ làm các bước như sau:

Bước 1. Chuyển đổi số bị nhân và số nhân thành số dương tương ứng


Bước 2. Nhân hai số dương bằng thuật giải nhân số nguyên không dấu, được tích của
hai số dương.
Bước 3. Hiệu chỉnh dấu của tích:
 Nếu hai thừa số ban đầu cùng dấu thì giữ nguyên kết quả ở bước 2.
 Nếu hai thừa số ban đầu là khác dấu thì đảodấu kết quả của bước 2.

Khi cộng phần số mũ thì sẽ có một số trường hợp có thể xảy ra tràn bít như sau:
 Nếu E1 và E2 là số dương mà tổng E là số âm.
 Nếu E1 và E2 là số âm mà tổng E là số dương.

Kết quả biểu diễn ở dạng số bù 2 sẽ thì xảy ra tràn bít.

Tuy nhiên một số trường hợp có thể chỉnh sửa tràn bít số mũ bằng cách cộng hoặc
trừ 1 đơn vị trong khi chuẩn hóa kết quả phần phân số(fraction) . Trong trường hợp cho
E1
phép. Chúng ta sẽ tạo thanh ghi X có chiều dài 5 bít. Khi tải số mũ từ thành ghi X

thì chúng ta sẽ mở rộng bít dấu. Vì vậy chúng ta có thể biểu diễn số ở dạng bù 2. Nếu có

18
E1 E2
2 bít dấu thì khi công và trong trường hợp xảy ra tràn bít thì bít dấu thấp nhất

sẽ bị thay đổi còn bít dấu cao nhất không thay đổi. Sau đây là một số ví dụ:

7+6= 00111 +00110=01101=13 (giá trị lớn nhất là 7).

(-7)+(-6)=11001+11010=-13(giá trị nhỏ nhất là -8).

Tuy nhiên sau đây là một trường hợp đặc biệt trong trường hợp chỉ ra tràn bít phần
số mũ và tràn bít phần phân số nhưng việc tràn bí phần số mũ có thể sửa lại sau khi chỉnh
sửa tràn bí phần phân số.

−3 −6 −9 −8
1.000* 2 x 1.000* 2 =1.000* 2 =0.100* 2 .

2.5 Cộng số thực dấu phẩy động.

Khi cộng hai số thực dấu chấm động thì sẽ được cộng theo công thức sau:

E
F1 E E
* 2 + F 1 * 2 =Fx 2 .
1 2

F1 F2 E1 E2
Giả sử và đều đã được chuẩn hóa và Nếu bằng thì ta chỉ

F1 F2 E1 E2
cần cộng hai và sau đó chuẩn hóa kết quả. Nếu không bằng thì

chúng ta phải dịch chuyển thay đổi phần số mũ của số có số mũ nhỏ hơn và dịch chuyển
phần phân số của số mũ nhỏ hơn về bên phải. Chúng ta sẽ xử lý thông qua ví dụ sau:

F1 E 5
F1 E 3
* 2 = 0.111x 2 . * 2 =0.101x 2 .
1 2

E1 E2 F2 E2
Do # nên dịch chuyển sang phải 2 đơn vị và cộng 2 vào .

3 4 5
0.101x 2 =0.0101x 2 .= 0.00101x 2 .

19
Sau khi dịch phải một đơn vị thì giá trị của số đó sẽ chia cho 2 nên cần phải cộng vào số
mũ 1 để giá trị của số không thay đổi. Sau khi dịch chuyển để cho 2 số mũ bằng nhau
chúng ta tiến hành cộng phần phân số(fraction).

5 5 5
0.111x 2 + 0.00101x 2 = 01.00001x 2 .

Lúc này chúng ta thấy phần phân số (fraction) xảy ra hiện tượng fraction overflow.
Nên để chuẩn hóa chúng ta dịch phải 1 phần phân số và cộng them 1 phần số mũ.

E 6
Fx 2 =0.100001x 2 .

F1 F2
Khi một trong hai số và là số âm thì khi cộng phần phân số sẽ xảy ra

hiện tượng kết quả cộng phần phần số chưa được chuẩn hóa. Ví dụ:

−2 −1
1.100x 2 +0.100x 2

−1 −1
F1
= 1.110x 2 +0.100x 2 (sau khi dịch phải 1 của )

−1
= 0.010x 2 (kết quả chưa chuẩn hóa)

−2
= 0.100x 2 (sau khi dịch trái phần phân số 1 và trừ 1 phần số mũ).

Tóm lại thì việc cộng hai số thực dấu phẩy động sẽ thực hiện theo các bước sau:

Bước 1: Nếu hai phần mũ không bằng nhau thì dịch chuyển sang bên phải phần phân số,
số có số mũ nhỏ hơn 1 đơn vị và cộng vào số mũ nhỏ hơn 1 đơn vị. Lặp lại các bước trên
cho đến khi hai số mũ bằng nhau.

Bước 2: Cộng phần phân số.

Bước 3: Xảy ra 3 trường hợp.

20
a. Khi số F bị tràn thì dịch phải F 1 đơn vị và cộng thêm 1 vào phần số mũ để sử
lỗi tràn bít.
b. Khi F chưa chuẩn hó thì dịch trái F 1 đoen vị và trừ phần số mũ E đi 1.
c. Nếu F bằng 0 thì gán E=-1.

Bước 4: Kiểm tra tràn số mũ.

E1 E2 F2 F2
Nếu >> và là số dương thì tất cả các bít của sẽ trở thành 0

ngay sau khi chúng ta dịch chuyển về bên phải để hai số mũ bằng nhau và kết quả là F=
F1 E1 E1 E2 F2 F2
và E= . Nếu >> và là số âm thì tất cả các bít của sẽ trở

thành 1 khi chúng ta dịch chuyển về bên phải để hai số mũ bằng nhau. Vì thể khi cộng hai
E1 E2
phần fraction sẽ cho kết quả sai. Vì vậy để tránh vấn đề này xảy ra thì khi >>

F1 E1 E 2 ≫ E1 F2 E2
ta có: F= và E= . Nếu thì F= và E= . Trong dự án này

E1 E2∨¿ 3 thì
chúng ta sử dụng 4 bít cho cả phần fraction và exponent nên khi | - bỏ

qua phần dịch chuyển sang bên phải.

Sau đây là thuật toán cho việc cộng hai số thực dấu phẩy động.

E
N= F* 2 .
N1
= F1 * 2 .
E 1

N2
= F2 * 2 .
E 2

F1 E1 , F 2 E2
Với , , đều là số nhị phân 4 bít được biểu diễn ở dạng bù 2 đã

được trình bày ở mục 2.3.1

21
Bắt
đầu
E1 F=F1+F
N =E Y
2
2

Shift_F=| F= Y
N
E1-E2| 0
F=0,
Shift F E=-8
Y _F N Y bị N
>3 trà Kết
Tăng phần n F thúc
Gán kết số mũ nhỏ F>>1, Ch
quả là số E=E+ Y N
hơn giá trị uẩn
có số mũ Shift_F=| 1 hoa
lớn hơn E1-E2| F<<1,
Dich sang E=E-1
phải phần E
Kết định trị số bị
thúc nhỏ hơn Y
trà
Shift_F n
N Báo
tràn E
Kết
thúc
Hình 2.3 Sơ đồ thuật toán cộng hai số thực dấu phẩy động.
2.6 Trừ hai số thực dấu phẩy động.
Khi trừ hai số thực dấu chấm động thì sẽ được cộng theo công thức sau:
E
F1 E E
* 2 −F1 * 2 =Fx 2 .
1 2

Các bước trừ hai số thực dấu chấm động cũng giống như trong công hai số thực
dấu phẩy động chỉ khác ở bước 2 ta chuyển việc cộng phần fraction thành trừ.
Sau đây là thuật toán trừ hai số thực dấu chấm động với các thông số sau:
E
N= F* 2 .
N1
= F1 * 2 .
E 1

N2
= F2 * 2 .
E 2

F1 E1 , F 2 E2
Với , , đều là số nhị phân 4 bít được biểu diễn ở dạng bù 2 đã

được trình bày ở mục 2.3.1

22
Bắt
dầu
E1
N =E Y F=F1-F2
2

Shift_F=| F= Y
N 0
E1-E2|
F=0,
F E=-8
Y Shift N bị
>3 Y N Kết
trà F
Tăng phần n Ch thúc
E1 số mũ nhỏ F>>1, uẩ
E=E+ Y N
>E hơn giá trị n
2 Shift_F=| 1 ho
F=~F2 E1-E2| a F<<1,
F=F1 Dich sang E=E-1
+1 phải phần
E=E2
E=E1 E
định trị số bị
nhỏ hơn Y
trà
Shift_F n
Kết N Báo
thúc tràn E
Kết
thúc
Hình 2.4 Thuật toán trừ hai số thực dấu phẩy động.

2.7 Kết luận chương

Ở trong chương hai chúng tôi đã trình bày tổng quát về số thực dấu phẩy động, giới
thiệu về số thực dấu phẩy động được thực hiện trong đề tài. Đồng thời cũng giới thiệu
được về thuật toán cộng, trù, nhân hai số thực dấu chấm động.

23
Chương 3 Mô phỏng và kết quả.

3.1 Giới thiệu chương.

Ở chương này sẽ giới thiệu về sơ đồ khối của chương trình ở phần 3.2, phần 3.3
giới thiệu về các phần mềm sử dụng dùng để viết chương trình và mô phỏng, phần 3.3 là
kết quả mô phỏng và giải thích kết quả. Cuối cùng phần 3.4 là kết luận của chương.

3.2 Sơ đồ khối.

24
F1
led_overflow
E1
F2 led_frac

E2 FPU
led_exp
opcode

Hình 3.1 Sơ đồ khối của chương trình.

N1 F1 E
N2 F2
* 2 ,
1

Đầu vào của chương trình bao gồm 2 toán hạng = = *

2E . và mã phép toán (opcode) . Mỗi toán hạng gồm có hạng gồm có 2 phần: phần
2

phân số(fraction) và phần số mũ(exponent). Đầu ra gồm 3 thông số gồm có: chân báo
hiệu tràn bít (led_overflow), kết quả phần phân số trên led 7 thanh(led_frac) và kết quả
phần số mũ trên led 7 thanh(led_exp).

Hoạt động của chương trình là: Khi một trong các thông số đầu vào thay đổi thì sẽ có
kết quả đầu ra tương ứng.

Bảng 3.1 Mô tả chân dữ liệu trong sơ đồ khối.

Tên chân Độ rộng Loại Mô tả


(bít)
F1 4 Input F1
Phần phân số (fraction) của số thứ nhất
E1 4 Input E1
Phần phân số (fraction) của số thứ nhất
F2 4 Input F2
Phần phân số (fraction) của số thứ nhất

25
E2 4 Input E2
Phần phân số (fraction) của số thứ nhất
opcode 3 Output Mã phép toán
led_overflo 1 Output Nếu kết quả nằm ngoài giá trị cho phép sẽ báo tràn
w
led_frac 7 Output Kết quả phép toán phần phân số(fraction)
led_exp 7 Output Kết quả phép toán phần số mũ(exponet)

Bảng 3.2 Bảng mô tả giá trị của mã phép toán.

Mã phép toán Phép toán


(Opcode)
010 Cộng
011 Trừ
100 Nhân
101 Chia

Bảng 3.3 Bảng chuyển đổi số nhị phân 4 bít hiển thị trên led 7 thanh.

Số nhị phân 4 bít(a) Giá trị led ở dạng nhị phân(seg) Giá trị hiển thị
0000 000_0001 0
0001 100_1111 1
0010 001_0010 2
0011 000_0110 3
0100 100_1100 4
0101 010_0100 5
0110 010_0000 6
0111 000_1111 7
1000 000_0000 -8
1001 000_0100 -7
1010 000_1000 -6
1011 110_0000 -5
1100 011_0001 -4
1101 100_0010 -3
1110 011_0000 -2
1111 100_1111 -1

26
3.3 Kết quả mô phỏng.

Trong dự án đã sử dụng phần mềm ModelSim PE student Edition 10.4a. và phần


mềm Quartus 9.0 .

3.3.1 Kết quả mô phỏng trên quartus.

Kết quả mô phỏng thành công trên quartus.

Hình 3.1 Kết quả mô phỏng thành công trên quartus

Sơ đồ khối module display.

27
Hình 3.2 Sơ đồ khối module display.

Từ sơ đồ khối ta thây module display có 1 đầu vào ACC có độ dài 8 bít và 3 đầu ra
gồm có led_exp và led_frac có độ dài 6 bít và led_overflow có độ dài 1 bít.

Module cũng chứa 2 module khác là led7.

Sơ đồ khối module led7 .

28
Hình 3.3 Sơ đồ khối module led7.

Module có chưc năng chuyển từ số nhị phân 4 bít hiển thị trên led 7 thanh.

3.3.2 Kết quả mô phỏng trên Modulesim.

Sơ đồ dòng dữ liệu dataflow

29
Hình 3.4 Sơ đồ luồng dữ liệu dataflow.

Bảng kết quả trancript.

Hình 3.5 Bảng kết quả trancript.

30
Từ bảng kết quả trancript kết hợp với bảng 3.3, bảng 3.2 ta có bảng tổng kết sau:

Bảng 3.4 Tổng hợp kết quả mô phỏng.

ST F1 E1 F2 E2 opcode F E Ove Biểu thức


T r
flow
1 3 4
0 0111 0001 0111 0011 010 0100 0100 0 0.111x 2 +0.111x 2 .= 0.100x 2
5 100 1101 1000 1001 010 1000 1101 0 −3 −7
1.000x 2 +1.000x 2 .= 1.000x 2
0
7 2 7
10 101 0111 1010 0010 010 1010 0111 0 1.010x 2 +1.110x 2 .= 1.010x 2
0
7 7
15 100 0111 1001 0111 010 1001 1000 1 1.001x 2 +0.111x 2 .= 1.001x 2
−8

1
3
20 000 0011 1001 1001 010 1101 1001 0 −7
0.000x 2 +1.001x 2 .= 1.001x 2

0
3
25 000 0011 0000 1001 010 0000 1000 0 −7
0.000x 2 +0.000x 2 .= 0.000x 2

0
3 3
30 100 0011 0100 0111 010 0000 1000 0 1.001x 2 +0.111x 2 .= 0.000x 2
−8

1
35 1100 1110 0100 1111 010 0100 1110 0 −2 −1
1.100x 2 +0.100x 2 .= 0.100x 2
1 3 4
40 0111 0001 0111 0011 011 1010 0011 0 0.111x 2 -0.111x 2 .= 0.100x 2 .
45 100 1101 1000 1001 011 1000 1101 0 −3 −7
1.000x 2 -1.000x 2 .= 1.000x 2

0
7 2 7
50 101 0111 1010 0010 011 1010 0111 0 1.010x 2 -1.110x 2 .= 1.010x 2 .
0
7 7
55 100 0111 1001 0111 011 0000 1000 0 1.001x 2 -0.111x 2 .= 0.000x 2
−8

1
3
60 000 0011 1001 1001 011 0011 1001 0 −7
0.000x 2 -1.001x 2 .= 0.011x 2
−7

0
1
65 0111 0001 0111 1000 100 0110 1001 0 −8
0.111x 2 *0.111x 2 =0.110x 2
−7

3
70 100 1001 1011 0001 100 0100 1010 0 −8
1.001x 2 *1.011x 2 .= 0.100x 2

31
7 1
75 100 0111 1000 1001 100 0100 0001 0 −7
1.000x 2 *1.000x 2 .= 0.100x 2
0
7
80 010 0111 1011 1001 100 1001 1111 0 −7
0.101x 2 *1.011x 2 .= 1.001x 2

1
85 000 1000 0000 1000 100 0000 1000 0 −8 −8
0.000x 2 *0.000x 2 .= 0.000x 2

0
7 3
90 0111 0111 1001 0011 100 0000 1000 1 0.111x 2 *1.001x 2 .= 1.000x 2
−8

7 0
95 0110 0111 1010 1001 100 1011 0000 0 −7
0.110x 2 *1.010x 2 .= 1.011x 2

Nhận xét: Kết quả mô phỏng đúng với kết quả tính toán thực tế sau khi làm tròn.

3.4 Kết luận chương.

Qua chương này nhìn váo kết quả mô phỏng chúng ta hiểu rõ lý thuyết hơn. Nhìn
vào kết quả mô phỏng chúng ta nhận thấy kết quả mô phỏng đúng với kết quả tính toán
thực tế sau khi làm tròn.

32
Chương 4 Kết Luận.
Khối số thực dấu phẩy động rất thông dụng trong bộ đồng xử lý toán học. Nó là
một phần của một hệ thống máy tính được thiết kế đặc biệt để thực hiện các hoạt động
tính toán trên các số thực dấu chấm động. Một số hoạt động tính toán trên khối FPU như:
cộng, trừ, nhân, chia. Mục đích là để xây dựng một CPU hiệu quả để thực hiện các chức
năng cơ bản cũng như chức năng siêu việt với việc làm giảm độ phức tạp của logic được
sử dụng làm giảm hoặc ít nhất giới hạn thời gian tương đương như dòng x87 và làm giảm
bộ nhớ càng nhiều càng tốt. Chính vì thế mà vấn đề này nhận được sự quan tâm rất lớn
của các cá nhân, tổ chức, trường đại học và nhiều viện nghiên cứu trên thế giới. Trong dự
án này tìm hiểu về:” Thiết kế khối sô học số thực dấu phẩy động”. Cụ thể dự án đã đạt
được các kết quả sau.

 Những điều đạt được.

-Trình bày lý thuyết khối FPU trong máy tinh.

-Tìm hiểu lý thuyết chuẩn hóa IEEE754 trong tính toán số học số thực dấu phẩy
động.

33
-Trình bày thuật toán cộng, trừ, nhân, chia số thực dấu phẩy động với 4 bít phần
định trị và 4 bít phần số mũ. Tất cả số âm phần định trị và số mũ được thể hiện ở
dạng nhị phân bù hai.

-Viết được chương trình cho khối số học số thực dấu phẩy động bằng verilog HDL
với các phép tính cộng, trừ, nhân.

 Những hạn chế.


-Chương trình chưa thực hiện cho phép tính chia hai số thực dấu phẩy động.
-Chưa viết được khối keypad dùng để nhập số từ bàn phím điện thoại kích thước
4x4.
-Code chương trình còn dài, chưa tối ưu được một số đoạn code có thể rút gọn.
 Hướng phát triển của đề tài.
-Xây dựng chương trình hoàn thiện hơn, dữ liệu nhập được từ thiết bị ngoại vi như
bàn phím điện thoại…...
-Tối ưu code để chương trình ngắn gọn và dễ hình dung hơn.
-Tìm hiểu và viết thêm phần phép tính chia cho khối số học số thực dấu phẩy động.

Vì thời gian nghiên cứu có hạn, trình độ hiểu biết của bản chúng em còn nhiều hạn
chế nên bài báo cáo của chúng em không tránh khỏi những thiếu sót, em rất mong nhận
được sự góp ý quý báu của tất cả các thầy cô giáo để báo cáo của chúng em được hoàn
thiện hơn.

Chúng em xin chân thành cảm ơn!

34
Tài liệu tham khảo.
1. Digital Systems Design Using VHDL Hardcover – March 30, 2007

by Jr. Charles H. Roth (Author), Lizy K. John (Author) .


2. Advanced Digital Design with the VERILOG HDL by Michael D. Cileti.
3. Digital Design and Computer Architecture By Julius Marpaung
Lab 5: Introduction to 4x4 Matrix Keypad and Verilog.
4. Design of a Floating-Point Fused Add-Subtract Unit Using Verilog
Mayank Sharma, Prince Nagar, Ghanshyam Kumar Singh & Ram Mohan
Mehra ,Department of Electronics and Communication Engineering
School of Engineering & Technology Sharda University, Knowledge Park-III,
Greater Noida, (UP), India.
5. Slide Bài giảng kiến trúc máy tinh-Chương 3-Nguyễn Kim Khánh - ĐHBKHN
6. IMPLEMENTATION OF FLOATING POINT ARITHMETIC ON FPGA -
DIGITAL SYSTEM ARCHITECTUREWINTER SEMESTER-2010 – by
SUBHASH C (200911005); A N MANOJ KUMAR (200911030); PARTH
GOSWAMI (200911049)
7. Design of Floating Point Multiplier for Signal Processing Applications -
A. Rakesh Babu, R. Saikiran and Sivanantham S. School of Electronics Engineering,
VIT UniversityVellore – 632014, Tamilnadu, India.
{rakesh40622348,saikiran.18692}@gmail.com , ssivanantham@vit.ac.in

35
Phụ Lục

1. Code file alu.v


module alu(F1,E1,F2,E2,opcode, led_overflow, led_frac, led_exp);
input [3:0] F1,E1,F2,E2;
input [2:0] opcode;
output led_overflow;
output [6:0] led_frac, led_exp;
reg [4:0] shift_F;
reg [7:0] F;
reg [6:0] f;
reg [4:0] E;
reg [8:0] ACC;
reg [7:0] f1,f2;
reg [4:0] e1,e2;
reg overflow;//tran bit
reg sosanh;//so sanh hai so mu
reg [3:0] a,b,c,f11,f21;
reg [4:0] addout; // cong 4 bit nen can 5 bit de luu tru
reg [2:0] i;
parameter add = 3'b010,
sub = 3'b011,
mult= 3'b100,
div = 3'b101;
always @(*) begin
a=0; b=0;c=0; addout = 0; i =0; f1=0; f2=0;e1 =0; e2 =0; shift_F=0; overflow=0; sosanh=0;
F=0;E=0; f11=0; f21=0; f=0;
if(E1[3]) begin
if(E2[3]) begin
if(E1[2:0]>E2[2:0]) sosanh =1'b1;
else sosanh=1'b0;
end
else sosanh=1'b0;//E2[3]=1'b0
end
else begin
if(E2[3]) sosanh=1'b1;
else begin
if(E1[2:0]>E2[2:0]) sosanh=1'b1;
else sosanh=1'b0;
end
end

case(opcode)
add,sub: begin
if(F1==4'b0000) begin
if(F2==4'b000) begin
F=8'b0000_0000;
E=5'b01000;

36
overflow=1'b0;
end
else begin
if(opcode==add) begin
F = {F2[3], F2, 3'b000};
E = {E2[3], E2};
overflow=1'b0;
end
else begin
c=~F2+1;
F = {c[3], c, 3'b000};
E = {E2[3], E2};
overflow=1'b0;
end
end
end
else if(F2==4'b0000) begin
F = {F1[3], F1, 3'b000};
E = {E1[3], E1};
overflow=1'b0;
end
else begin
if(E1 == E2)begin
E = {E1[3], E1};
shift_F =0;
f1 = {F1[3], F1, 3'b000};
f2 = {F2[3], F2, 3'b000};
if(opcode==add) F = f1 + f2;
else F = f1 - f2;
if(F == 8'b0000_0000) begin
E= 5'b01000;
overflow = 1'b0;
end
else if(F[7]!=F[6]) //tran phan dinh tri
begin
E=E+1;//cong phan so mu 1 don vi
F = {F[7], F[7-:7]};//dich phai 1 don vi
if(E[4] != E[3] ) overflow = 1'b1;//tran so mu
else overflow = 1'b0;
end
else if (F[6] == F[5]) begin //chuan hoa
if(E != 5'b01000) begin
F = F << 1;
E= E-1;
if(E[4] != E[3] ) overflow = 1'b1;//tran
else overflow = 1'b0;
end
else overflow = 1'b1;
end

37
else begin
E=E;
F=F;
overflow = 1'b0;
end
end
else if ( sosanh==1'b1) begin
shift_F = E1 - E2;
E={E1[3], E1};
if(shift_F > 2'b11) begin
F = {1'b0, F1,3'b000};
overflow = 1'b0;
E={E1[3], E1};
end
else begin // else cua if (shift_F > 2'b11)
f1 = {F1[3], F1, 3'b000};
f2 = {F2[3], F2, 3'b000}>> shift_F;
if(F2[3])
f2 = f2 + ({8'b1111_1111} << ( 8 - shift_F)) ;
if(opcode==add) F = f1 + f2;
else F = f1 - f2;
if(F == 8'b0000_0000) begin
E= 5'b01000;
overflow = 1'b0;
end
else if(F[7]!=F[6]) begin//tran phan dinh tri
E=E+1;//cong phan so mu 1 don vi
F = {F[7], F[7-:7]};//dich phai 1 don vi
if(E[4] != E[3] ) overflow = 1'b1;//tran so m
else overflow = 1'b0;
end
else if (F[6] == F[5]) begin //chuan hoa
if(E != 5'b01000) begin
F = F << 1;
E= E-1;
if(E[4] != E[3] ) overflow = 1'b1;//tran so mu
else overflow = 1'b0;
end
else overflow = 1'b1;
end
else begin
E=E;
F=F;
overflow = 1'b0;
end
end
end

38
else if(sosanh==1'b0) begin // else cua if (E1 > E2)
shift_F = E2 - E1;
E={E2[3],E2};
if(shift_F > 2'b11) begin
if(opcode==add) F = {1'b0,
F2,3'b000};
else begin
c=~F2+1;
F = {1'b0, c,3'b000};
end
overflow = 1'b0;
E={E2[3],E2};
end
else begin // else cua if (shift_F > 2'b11)
f1 = {F1[3], F1, 3'b000} >> shift_F;
f2 = {F2[3], F2, 3'b000};
if(F1[3])
f1 = f1 + ({8'b1111_1111} << ( 8 - shift_F)) ;
if(opcode==add) F = f1 + f2;
else F = f1 - f2;
if(F == 8'b0000_0000) begin
E= 5'b01000;
overflow = 1'b0;
end
else if(F[7]!=F[6]) //tran phan dinh tri
begin
E=E+1;//cong phan so mu 1 don vi
F = {F[7], F[7-:7]};//dich phai 1 don vi
if(E[4] != E[3] ) overflow = 1'b1;//tran so mu
else overflow = 1'b0;
end
else if (F[6] == F[5]) begin //chuan hoa
if(E != 5'b01000) begin
F = F << 1;
E= E-1;
if(E[4] != E[3] ) overflow = 1'b1;//tran so mu
else overflow = 1'b0;
end
else overflow = 1'b1;
end
else begin
E=E;
F=F;
overflow = 1'b0;
end
end
end

39
end
end//end add
mult:begin
if((F1==4'b0000))
begin
F=8'b0000_0000;
E=5'b01000;
overflow=1'b0;
end
else if(F2==4'b0000)
begin
F=8'b0000_0000;
E=5'b01000;
overflow=1'b0;
end
else begin
if(F1[3]) f11=~F1+1;
else f11=F1;
if(F1[3]) f21=~F2+1;
else f21=F2;
a = 4'b000;
b = f11;
for(i=0; i<3; i=i+1)
begin
if(b[0]) begin
addout = a +f21;
a = {f21[3], addout[3-:3]};
b = {addout[0], b[3-:3]};
end // end if
else begin
b = {a[0], b[3-:3]};
a = {a[3], a[3-:3]};
end // end else
end // end for
if(b[0]) begin
addout = a + (~f21) +1;
a = ({~f21[3], addout[3-:3]});
b = {addout[0], b[3-:3]};
end // enf if
else begin
b = { a[0], b[3-:3] };
a = { a[3], a[3-:3] };
end // end else

f = { a[2-:3], b};
e1 = {E1[3], E1};
e2 = {E2[3], E2};
E = e1 + e2;
if(F1[3]==1'b1) begin
if(F2[3]==1'b1)F= {1'b0,f};
else begin

40
f=~f+1;
F={1'b0,f};
end
end
else begin
if(F2[3]==1'b0)F= {1'b0,f};
else begin
f=~f+1;
F={1'b0,f};
end
end

if(F == 8'b0100_0000) begin


F = F >> 1;
E=E+1;
if(E[4] != E[3] ) overflow = 1'b1;//tran so mu
else overflow = 1'b0;
end
else if (F[6] == F[5]) begin //chuan hoa
if(E != 5'b01000) begin
F = F << 1;
E= E-1;
if (F[6] == F[5]) begin //chuan hoa
if(E != 5'b01000) begin
F = F << 1;
E= E-1;
if(E[4] != E[3] ) overflow = 1'b1;//tran so mu
else overflow = 1'b0
end
else overflow=1'b1;
end
if(E[4] != E[3] ) overflow = 1'b1;//tran so mu
else overflow = 1'b0;
end
else overflow=1'b1;
end
else begin
if(E[4] != E[3] ) overflow = 1'b1;//tran so mu
else overflow = 1'b0;
end
end// end if(E1=4'b000)
end//end mult
default: begin
E = 5'b00000;
F=8'b0000_0000;
overflow=1'b0;
end
endcase
ACC[8] = overflow; // dua overflow ra thanh ghi ACC

41
ACC[7-:4] = F[6-:4]; // dua F ra thanh ghi ACC, lay 4 bit dau cua F
ACC[3-:4] = E[3-:4];
end // end always
display u4(.ACC(ACC), .led_overflow(led_overflow), .led_frac(led_frac),
.led_exp(led_exp));
endmodule
module display ( ACC, led_overflow, led_frac, led_exp);
//input clk;
input [8:0] ACC;
output led_overflow;
output [6:0] led_frac, led_exp;
assign led_overflow = ACC[8];
led7 segF (ACC[7-:4], led_frac);
led7 segE (ACC[3-:4], led_exp);
endmodule

module led7(a, seg);


input [3:0] a;
output [6:0] seg;
reg [6:0] seg;
always @(*) begin
seg = 7'b111_1110; // khoi tao "-"
case (a)
4'b0000: seg = 7'b000_0001; // 0
4'b0001: seg = 7'b100_1111; // 1
4'b0010: seg = 7'b001_0010; // 2
4'b0011: seg = 7'b000_0110; // 3
4'b0100: seg = 7'b100_1100; // 4
4'b0101: seg = 7'b010_0100; // 5
4'b0110: seg = 7'b010_0000; // 6
4'b0111: seg = 7'b000_1111; // 7
4'b1000: seg = 7'b000_0000; // - 8
4'b1001: seg = 7'b000_0100; // -7
4'b1010: seg = 7'b000_1000; // -6
4'b1011: seg = 7'b110_0000; // -5
4'b1100: seg = 7'b011_0001; // -4
4'b1101: seg = 7'b100_0010; // -3
4'b1110: seg = 7'b011_0000; // -2
4'b1111: seg = 7'b011_1000; // -1 //led_frac = 001_0010, led_exp=100_1111
endcase
end
endmodule

2. Code file test_bench.v.


module test_bench;
reg [2:0] opcode;
reg [3:0] F1,E1,F2,E2;
wire led_overflow;
wire [6:0] led_frac, led_exp;
alu u1 (F1,E1,F2,E2,opcode, led_overflow, led_frac, led_exp);

42
initial
$monitor($time, " F1 = %b, E1= %b,F2 = %b, E2= %b,opcode= %b, led_overflow=
%b,led_frac = %b, led_exp=%b",F1,E1,F2,E2,opcode, led_overflow, led_frac, led_exp);
//initial state = 2'b00;
initial begin
//cong

F1 = 4'b0111; E1=4'b0001;F2=4'b0111;E2=4'b0011;opcode=3'b010;//((7/8)x2^1)+((7/8)x2^(3))) #5
F1 = 4'b1000; E1=4'b1101;F2=4'b1000;E2=4'b1001;opcode=3'b010;//((-1)x2^(-3))+((-1)x2^(-7)))

#5 F1 = 4'b1010; E1=4'b0111;F2=4'b1110;E2=4'b0010;opcode=3'b010;//((-3/4)x2^7)+((-1/8)x2^(2)))

#5 F1 = 4'b1001; E1=4'b0111;F2=4'b1001;E2=4'b0111;opcode=3'b010;//((-7/8)x2^7)+((-7/8)x2^(7)))

#5 F1 = 4'b0000; E1=4'b0011;F2=4'b1101;E2=4'b1001;opcode=3'b010;//((0)x2^3)+((-3/8)x2^(-7)))

#5 F1 = 4'b0000; E1=4'b0011;F2=4'b0000;E2=4'b1001;opcode=3'b010;//((0)x2^3)+(0x2^(-7)))

#5 F1 = 4'b1011; E1=4'b0011;F2=4'b1011;E2=4'b0011;opcode=3'b010;//((-5/8)x2^3)+(-5/8x2^(3))

//tru

#5 F1 = 4'b0111; E1=4'b0001;F2=4'b0111;E2=4'b0011;opcode=3'b011;//((7/8)x2^1)-((7/8)x2^(3)))

#5 F1 = 4'b1000; E1=4'b1101;F2=4'b1000;E2=4'b1001;opcode=3'b011;//((-1)x2^(-3))-((-1)x2^(-7)))

#5 F1 = 4'b1010; E1=4'b0111;F2=4'b1110;E2=4'b0010;opcode=3'b011;//((-3/4)x2^7)-((-1/8)x2^(2)))

#5 F1 = 4'b1001; E1=4'b0111;F2=4'b1001;E2=4'b0111;opcode=3'b011;//((-7/8)x2^7)-((-7/8)x2^(7)))

#5 F1 = 4'b0000; E1=4'b0011;F2=4'b1101;E2=4'b1001;opcode=3'b011;//((0)x2^3)-((-3/8)x2^(-7)))

//nhan

#5 F1 = 4'b0111; E1=4'b0001;F2=4'b0111;E2=4'b1000;opcode=3'b100;//((7/8)x2^1)*((7/8)x2^(-8)))

#5 F1 = 4'b1001; E1=4'b1001;F2=4'b1001;E2=4'b0001;opcode=3'b100;//((-7/8)x2^1)*((-7/8)x2^(-8)))

#5 F1 = 4'b1000; E1=4'b0111;F2=4'b1000;E2=4'b1001;opcode=3'b100;//((-1)x2^7)*((-1)x2^(-7)))

#5 F1 = 4'b0000; E1=4'b1000;F2=4'b0000;E2=4'b1000;opcode=3'b100;//((0)x2^(-8))*((0)x2^(-8))

#5 F1 = 4'b0111; E1=4'b0111;F2=4'b1001;E2=4'b0011;opcode=3'b100;//((7/8)x2^7)*((-7/8)x2^(3)))

43
#5 $stop;

end

endmodule

44

You might also like