You are on page 1of 31

TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP.

HCM
KHOA ĐIỆN - ĐIỆN TỬ

~~~~

BÁO CÁO GIỮA KỲ MÔN THIẾT KẾ VI MẠCH

THIẾT KẾ MẠCH CỘNG, TRỪ, NHÂN, SO SÁNH 4


BIT CÓ CHUYỂN CHẾ ĐỘ BẰNG MỘT NÚT NHẤN

GVHD : Võ Minh Huân


SVTH : Trương Ngọc Minh 22161286
Nguyễn Chu Bảo 22161220
Phạm Đỗ Quốc Bình 22161225
Nguyễn Tấn Lợi 22161281
Phạm Gia Bảo 22161222

Tp.Hồ Chí Minh – tháng 4 năm 2024


BẢNG PHÂN CÔNG NHIỆM VỤ

Tên MSSV Nhiệm Vụ

Khối mạch đếm vòng, ghép các


Trương Ngọc Minh 22161286
khối

Phạm Đỗ Quốc Bình 22161225 Khối mạch cộng

Nguyễn Tấn Lợi 22161281 Khối mạch trừ

Phạm Gia Bảo 22161222 Khối mạch nhân

Nguyễn Chu Bảo 22161220 Khối mạch so sánh


MỤC LỤC

A. PHẦN MỞ ĐẦU ........................................................................................... 6


B. PHẦN NỘI DUNG ....................................................................................... 7
1. Tổng quan về mạch cộng, trừ, nhân, so sánh 2 số nhị phân có thể
chuyển chế độ .................................................................................................... 7
2. Triển khai thiết kế từng khối chức năng trong hệ thống ...................... 9
2.1. Khối mạch cộng ................................................................................... 9
2.2. Khối mạch trừ .................................................................................... 11
2.3. Khối mạch nhân ................................................................................. 13
2.4. Khối mạch so sánh ............................................................................. 15
2.5. Khối mạch đếm vòng ......................................................................... 17
3. Hoàn thiện mạch cộng, trừ, nhân, so sánh có thể chuyển chế độ ....... 19
3.1. Liên kết các khối ................................................................................ 19
3.2. Kết quả Testbench của Topmodule.................................................... 20
C. PHẦN KẾT LUẬN ................................................................................. 22
PHỤ LỤC ........................................................................................................... 23
DANH MỤC HÌNH ẢNH

Hình 1. Sơ đồ khối Topmodule: mạch cộng, trừ, nhân, so sánh 2 số nhị phân 4
bit có thể chuyển chế độ ........................................................................................ 8
Hình 2. Bộ cộng toàn phần .................................................................................... 5
Hình 3. Cấu tạo của bộ cộng toàn phần 1 bit ........................................................ 9
Hình 4. Cấu tạo Khối mạch cộng 2 số nhị phân 4 bit ......................................... 10
Hình 5. Kết quả Testbench của khối mạch cộng 2 số nhị phân 4 bit .................. 10
Hình 6. Cấu tạo của Khối mạch trừ 2 số nhị phân 4 bit ...................................... 11
Hình 7. Kết quả Testbench của khối mạch trừ 2 số nhị phân 4 bit ..................... 12
Hình 8. Cấu tạo bên trong của Khối mạch nhân 2 số nhị phân 4 bit .................. 13
Hình 9. Kết quả Testbench của Khối nhân 2 số nhị phân 4 bit........................... 14
Hình 10. Sơ đồ khối bộ so sánh 1 bit .................................................................. 15
Hình 11. Cấu tạo bên trong của bộ so sánh 1 bit ................................................ 15
Hình 12. Cấu tạo bên trong của Khối mạch so sánh 2 số nhị phân 4 bit ............ 16
Hình 13. Kết quả Testbench của Khối mạch so sánh 2 số nhị phân 4 bit ........... 16
Hình 14. a) FF-D chỉ có chân Set tích cực mức cao ........................................... 17
Hình 15. Cấu tạo Khối mạch đếm vòng 4 bit...................................................... 17
Hình 16. Kết quả Testbench của Khối mạch đếm vòng 4 bit ............................. 18
Hình 17. Sơ đồ khối chi tiết của Topmodule ...................................................... 19
Hình 18. Kết quả Testbench của Topmodule ở chế độ cộng, trừ, nhân .............. 20
Hình 19. Kết quả Testbench của Topmodule ở chế độ so sánh .......................... 20
DANH MỤC BẢNG

Bảng 1. Bảng giá trị của bộ cộng toàn phần ......................................................... 9


Bảng 2: Bảng giá trị của Mạch so sánh 2 số nhị phân 1 bit ................................ 15
A. PHẦN MỞ ĐẦU
Trong thời đại công nghệ số ngày nay, việc thiết kế và xây dựng các hệ
thống số đóng vai trò quan trọng trong nhiều lĩnh vực từ điện tử tiêu dùng đến
các hệ thống tự động hóa công nghiệp. Rất nhiều chip điện tử (vi mạch số) đã
được nghiên cứu và sản xuất để phục vụ cho những vấn đề trên. Trong đó không
thể không kể đến những khối cơ bản và thiết yếu của hệ thống số như mạch
cộng, trừ, nhân, so sánh… Các mạch này không chỉ hỗ trợ các phép toán cơ bản
mà còn là nền tảng cho việc thực hiện các thuật toán phức tạp hơn trong xử lý số
liệu và logic máy tính.
Vì những lí do trên, nhóm em muốn thiết kế một hệ thống bao gồm các
khối mạch cộng, trừ, nhân và so sánh. Các mạch cơ bản này mặc dù đã quá quen
thuộc đối với chúng ta, tuy nhiên việc thiết kế mạch có thể sẽ gặp phải nhiều
thách thức như: tối ưu hóa kích thước, tốc độ xử lý, tính chính xác,… Để giải
quyết những vấn đề này, việc sử dụng ngôn ngữ mô tả phần cứng như Verilog
trở nên cần thiết, cho phép mô phỏng và kiểm tra mạch trước khi thực hiện sản
xuất thực tế.
Trong bài báo cáo này, chúng em sẽ trình bày ngắn gọn về quá trình thiết
kế, mô phỏng, kiểm tra một vi mạch số có khả năng thực hiện các phép cộng, trừ,
nhân và so sánh hai số nhị phân 4 bit sử dụng Verilog. Sau đó khám phá cách
thức tối ưu hóa mạch để đạt được hiệu suất cao, đồng thời đảm bảo tính chính
xác và độ tin cậy của hệ thống khi được hoạt động theo nhiều yêu cầu khác nhau.

6
B. PHẦN NỘI DUNG
1. Tổng quan về mạch cộng, trừ, nhân, so sánh 2 số nhị phân có thể chuyển
chế độ
Mạch được cấu tạo cơ bản bao gồm 5 khối chính như sau :
• Khối mạch cộng hai số A và B (4 bit)

• Khối mạch trừ số A cho số B (4 bit)

• Khối mạch nhân 2 số A và B (4 bit)

• Khối mạch so sánh 2 số A và B (4 bit)

• Khối mạch đếm vòng 4 bit dùng để chuyển chế độ

7
Sau khi thực hiện ghép các khối con (submodule) trên ta sẽ được một khối
lớn (topmodule) có 4 ngõ vào (2 ngõ vào A, B 4bit, ngõ vào nút BTN và RES)
và 5 ngõ ra (ngõ ra O 8bit, 1 ngõ ra bit dấu, 3 ngõ ra so sánh: A>B, A<B, A=B)
như Hình 1.
*Chi tiết về cách kết nối các khối sẽ được trình bày ở phần 3.1.

Mạch cộng, trừ,


nhân, so sánh có
chuyển chế độ

Hình 1. Sơ đồ khối Topmodule: mạch cộng, trừ, nhân,


so sánh 2 số nhị phân 4 bit có thể chuyển chế độ

8
2. Triển khai thiết kế từng khối chức năng trong hệ thống
2.1. Khối mạch cộng
Bộ cộng toàn phần 1 bit

Hình 2. Bộ cộng toàn phần


Trong đó :
• Cin : số nhớ của lần cộng trước đó
• Cout : số nhớ của lần cộng hiện tại
• S : tổng của 2 số A, B (1 bit )
Ta có bảng giá trị của mạch cộng toàn phần 1 bit như sau:

Bảng 1. Bảng giá trị của bộ cộng toàn phần

Từ bảng trạng thái trên ta viết được phương trình và xây dựng được khối
mạch cộng toàn phần 1 bit từ các cổng logic:
S = A⊕B⊕Cin Cout = (A+B).Cin + A.B

Hình 3. Cấu tạo của bộ cộng toàn phần 1 bit

9
Mạch cộng toàn phần 4 bit
Ta kết nối 4 khối cộng toàn phần 1 bit thành 1 khối cộng toàn phần 4 bit.
Để cho phép thực hiện chế độ cộng 4 bit, ta sẽ cho thêm một ngõ vào E tích cực
mức cao kết nổi cổng AND với các ngõ ra như Hình. Khi ngõ vào E mức 0, bất
chấp các ngõ vào thì ngõ ra S vẫn bằng 0. Khi ngõ vào E tích cực mức 1, ngõ ra
S sẽ hiển thị kết quả cộng từ 2 số nhị phân 4 bit A và B.

FA FA FA FA

Hình 4. Cấu tạo Khối mạch cộng 2 số nhị phân 4 bit

Kết quả Testbench

Hình 5. Kết quả Testbench của khối mạch cộng 2 số nhị phân 4 bit

Testcase 1: ngõ vào E ở mức 0, cho dù giá trị A, B có bằng bao nhiêu thì
ngõ ra S vẫn ở giá trị là 0. Như trong testbench thì lúc này ngõ vào A là 12 và B
là 3 thì ngõ ra S luôn ở mức 0.
Testcase 2: ta cho ngõ vào E lên mức 1. Lúc này như trong testbench cứ
mỗi 100 ns ta lại thay đổi giá trị của 2 số hạng A và B lần lượt là 6 và 4; 7 và 7;
14 và 15 thì ngõ ra S ở mỗi 100 ns lần lượt bằng 10, 14, 29. Kết quả ngõ ra S
đúng bằng tổng của A và B.
Testcase 3: ta lại cho ngõ vào E về 0 (không tác động ) thì lúc này lại bất
chấp giá trị A, B ngõ ra S luôn bằng 0.
10
Như vậy kết quả testbench đã cho thấy mạch thực hiện đúng chức năng,
yêu cầu của khối mạch cộng 2 số 4 bit.

2.2. Khối mạch trừ


Nhờ vào phương pháp trừ 2 số nhị phân bằng cách cộng với bù 2:
A-B=A+(B)2
Ta sẽ thiết kế được mạch trừ nhờ vào mạch cộng 2 số nhị phân 4 bit như sau:

Hình 6. Cấu tạo của Khối mạch trừ 2 số nhị phân 4 bit

Để tạo bộ trừ 4 bit ta sử dụng 2 bộ cộng 4 bit với các ngõ vào:
• A: số trừ và B: số bị trừ
• Co : bit nhớ.
Các ngõ ra:
• Bit dấu: C4 = 1 là dấu “+”. Nếu C4 = 0 là dấu “-”
• M: giá trị của 2 số A trừ cho B

11
Kết quả Testbench

Hình 7. Kết quả Testbench của khối mạch trừ 2 số nhị phân 4 bit

Testcase 1: ngõ vào E=0 nên bất chấp giá trị ngõ vào A và B, ngõ ra O
luôn bằng 0.
Testcase 2: ngõ vào E lên mức 1, ta cho A=15 và B=1 thì giá trị ngõ ra O
là kết quả của A trừ cho B nên S=14.
Testcase 3: ngõ vào E vẫn ở mức 1, vẫn giữ giá trị của A=15 còn B thay
bằng 15, khi này kết quả ngõ ra S sẽ bằng 0.
Testcase 4: ngõ ra E lại về 0, ngõ ra S cũng ở 0 bất chấp giá trị A, B.
Kết quả testbench cho thấy mạch chạy đúng chức năng của khối mạch trừ
2 số nhị phân 4 bit.

12
2.3. Khối mạch nhân
Tổng quát về các bước thực hiện mạch nhân 2 số nhị phân 4 bit
Mạch nhân cơ bản được cấu tạo từ các bộ cộng toàn phần 1 bit và các
cổng AND. Về việc thực hiện bài toán nhân có thể xem như gồm 2 bước:
• Tính các tích từng phần: thực hiện bởi các cổng AND
• Tính tổng của các tích từng phần: thực hiện bởi bộ cộng toàn phần 1 bit
và áp dụng bài toán chuỗi số
Bộ nhân sẽ có a3, a2, a1, a0; b3, b2, b1, b0 là ngõ vào tương ứng với 2 số
nhị phân 4 bit A, B và ngõ ra 8 bit tương ứng với 8 chân P[7] đến P[0].

Hình 8. Cấu tạo bên trong của Khối mạch nhân 2 số nhị phân 4 bit

Để có thể cho phép thực hiện chế độ nhân ta cũng sẽ cho thêm 1 ngõ vào
E tích cực mức cao bằng cách kết nối chân E với từng ngõ ra bằng cổng AND.

13
Kết quả Testbench

Hình 9. Kết quả Testbench của Khối nhân 2 số nhị phân 4 bit

Testcase 1: ngõ vào E lên mức 1, ta cho ngõ vào A=9 và B=1. Một số nào
đó nhân với 1 sẽ ra chính nó nên lúc này ngõ ra P bằng 9
Testcase 2: ngõ vào E vẫn ở mức 1, ta cho A=0 và B=7 để kiểm tra một
số nhân với 0. Ngõ ra P lúc này bằng 0
Testcase 3: ngõ vào E vẫn ở mức 1, ta cho A= 10 và B=11 để kiểm tra
một số nhân với 10. Ngõ ra lúc này bằng 110 đúng với mong muốn.
Testcase 4: ngõ vào E vẫn ở 1, lúc này ta kiểm tra 2 số A và B lớn nhất
(trong số nhị phân 4 bit) là A=B=15 nhân với nhau thì ngõ ra P bằng 225.
Testcase 5: ngõ vào E bằng 0, bất chấp ngõ vào A, B thì ngõ ra P luôn
bằng 0.
Vậy kết quả Testbench đã cho thấy mạch chạy đúng chức năng của khối
mạch nhân 2 số nhị phân 4 bit.

14
2.4. Khối mạch so sánh
Mạch so sánh 2 số 1 bit

Hình 10. Sơ đồ khối bộ so sánh 1 bit

Trong đó :
• Ngõ ra S: sẽ lên 1 nếu 2 bit được so sánh a>b
• Ngõ ra G: sẽ lên 1 nếu 2 bit được so sánh a=b
• Ngõ ra I: sẽ lên 1 nếu 2 bit được so sánh a<b
Ta có bảng giá trị của mạch so sánh 1 bit như sau:

Bảng 2: Bảng giá trị của Mạch so sánh 2 số nhị phân 1 bit

Từ bảng trạng thái trên ta viết được phương trình và xây dựng được khối
mạch so sánh 1 bit từ các cổng logic như sau:

Hình 11. Cấu tạo bên trong của bộ so sánh 1 bit

15
Mạch so sánh 2 số nhị phân 4 bit

Hình 12. Cấu tạo bên trong của Khối mạch so sánh 2 số nhị phân 4 bit

Kết quả Testbench

Hình 13. Kết quả Testbench của Khối mạch so sánh 2 số nhị phân 4 bit

Testcase 1: ngõ vào E lên mức 1, ta cho 2 số nhị phân A=15 và B=13. Vì
A>B nên ngõ ra ở greater sẽ lên mức 1 và các ngõ ra còn lại xuất ra mức 0.
Testcase 2: ngõ vào E vẫn ở mức 1, lúc này ta cho A= 11 và B=14 để
A<B nên ngõ ra ở less sẽ lên mức 1 và các ngõ ra còn lại ở mức 0.
Testcase 3: ngõ vào E vẫn ở mức 1, lúc này ta cho A= 8 và B=8 để A=B
khi đó ngõ ra ở equal sẽ lên mức 1 và các ngõ ra còn lại sẽ là mức 0.
Testcase 4: ngõ vào E về 0, lúc này bất chấp A và B thì 3 ngõ ra greater,
less và equal luôn bằng 0.
Qua kết quả cho thấy mạch thực hiện đúng chức năng của khối so sánh 2
số 4 bit.

16
2.5. Khối mạch đếm vòng
Mạch đếm vòng 4 bit có cấu tạo cơ bản là một thanh ghi dịch dùng Flip-
Flop D với ngõ ra tầng sau cùng được đưa về ngõ vào của tầng đầu. Nhưng khi
mới cấp nguồn cho mạch chạy, ta không biết bit 1 nằm ở ngõ ra của tầng nào.
Do đó cần phải thiết lập dữ liệu dịch chuyển ban đầu bằng cách dùng ngõ vào
Pre và Clr để đặt trước số đếm, trạng thái ban đầu sẽ là 1000 nên FF-D đầu tiên
sẽ được set lên 1 và 3 FF-D còn lại clear về 0. Để có thể thiết kế được mạch
được nêu như trên ta tiến hành thiết kế 2 loại FF-D với 2 chức năng khác nhau:
• FF-D 1 chỉ có chân Set tích cực mức cao
• FF-D 2 chỉ có chân Clr tích cực mức cao

Hình 14. a) FF-D chỉ có chân Set tích cực mức cao

b)FF-D chỉ có chân Reset tích cực mức cao

Bằng cách dùng 1 FF-D 1 và 3 FF-D 2, kết nối 4 FF-D trên như hình ta
sẽ được 1 khối mạch đếm vòng 4 bit hoàn chỉnh:

Hình 15. Cấu tạo Khối mạch đếm vòng 4 bit

17
Kết quả Testbench

Hình 16. Kết quả Testbench của Khối mạch đếm vòng 4 bit

Mặc định ban đầu ta cho ngõ vào RES lên 1 xung để ngõ ra Q0 lên 1, các
ngõ ra khác là 0. Mỗi khi có xung Ck cạnh xuống thì ngõ ra Q kế tiếp sẽ lên 1 và
các ngõ ra khác sẽ là 0. Như vậy cứ sau 4 nhịp xung Ck cạnh xuống mạch đã
thực hiện xong 1 chu trình đếm vòng và cứ thế lặp lại.
Nhìn vào kết Testbench cho thấy mạch đã chạy đúng theo chức năng của
khối mạch đếm vòng 4 bit.

18
3. Hoàn thiện mạch cộng, trừ, nhân, so sánh có thể chuyển chế độ
3.1. Liên kết các khối
Sau khi hoàn thiện tất cả các khối con (submodule), ta tiến hành ghép
chúng lại như sau: Các mạch cộng, trừ, nhân và so sánh sẽ có chung 2 ngõ vào
A, B (4 bit). Mỗi ngõ ra từ Q0 → Q3 của mạch đếm vòng sẽ kết nối tới từng chân
Enable của mạch cộng, trừ, nhân, và so sánh. Ngoài ra, các ngõ ra của mạch
cộng, trừ, nhân sẽ được kết nối với các cổng OR để có chung ngõ ra. Chi tiết
được mô tả như trong Hình 17.

Hình 17. Sơ đồ khối chi tiết của Topmodule

Thực chất tất cả các khối đều hoạt động nhưng do mỗi ngõ ra Q của mạch
đếm vòng được kết nối với chân E của mỗi mạch và các ngõ ra được kết nối
chung với cổng OR (trừ mạch so sánh) nên ngõ ra Q nào của khối đếm vòng
đang ở mức 1 thì ngõ ra O của Topmodule sẽ xuất ra kết quả của mạch được nối
19
chân E với ngõ ra Q đó. Riêng ngõ ra bit Dấu chỉ được tính khi mạch đang thực
hiện chế độ trừ (ngõ ra bit Dấu bằng 1 biểu diễn số dương, bằng 0 thì là số âm).
3.2. Kết quả Testbench của Topmodule

Hình 18. Kết quả Testbench của Topmodule ở chế độ cộng, trừ, nhân

Ở đây chúng ta sẽ giả sử mỗi lần nhấn nút BTN thì ngõ vào nút BTN của
mạch là một xung lên rồi xuống đơn giản trong khoảng thời gian ngắn (20 ns).
Testcase 1: mặc định ban đầu ta cho ngõ vào RES lên 1 rồi xuống 0, mạch
sẽ thực hiện chế độ cộng, lúc này ngõ ra O sẽ chỉ hiển thị kết quả là phép cộng
của hai số A và B. Ở trường hợp này ta cho A=4 và B=2 nên ngõ ra O là 6.
Testcase 2: ngõ vào BTN lên 1 xung, ngay sau đó mạch sẽ chuyển sang
chế độ trừ và ngõ ra O sẽ là kết quả của số A trừ cho số B. A=5 và B=3, ngõ ra
O sẽ bằng 2 nhưng kết quả là số dương nên bit dấu lên 1.
Testcase 3: vẫn ở chế độ trừ nhưng đảo giá trị của A và B, lúc này A=3 và
B=5, ngõ ra O cũng là 2 nhưng kết quả phải là số âm nên ngõ ra bit Dấu về 0.
Testcase 4: ngõ vào BTN thêm 1 xung, mạch chuyển sang chế độ nhân,
ngõ ra O hiển thị kết quả của 2 số A và B nhân với nhau A=7, B=8 nên O=56.

Hình 19. Kết quả Testbench của Topmodule ở chế độ so sánh

20
Testcase 5: Thêm xung vô ngõ vào BTN lần 3, mạch sẽ chuyển sang chế
độ so sánh. Ta lấy A=9 và B=6 để giá trị của A lớn hơn B khi này ngõ ra greater
(A>B) lên mức 1 các ngõ ra khác ở mức 0.
Testcase 6: vẫn ở chế độ so sánh, ta lại cho A=11, B=11 để giá trị của A
bằng B lúc này ngõ ra equal (A=B) lên 1 và các ngõ ra khác là 0.
Testcase 7: vẫn trong chế độ so sánh nên khi cho A=3 và B=8 khi này A
nhỏ hơn B, ngõ ra less (A<B) lên 1 và các ngõ ra khác sẽ ở mức 0.
Testcase 8: Cuối cùng ta cho thêm 1 xung vào BTN, mạch lại chuyển về
chế độ cộng như ban đầu. Giá trị ngõ vào A và B vẫn giữ nguyên của trường
hợp trước đó. Lúc này ngõ ra O sẽ là 11, các ngõ ra còn lại về mức 0.
Kết quả testbench trên đã cho thấy mạch thực hiện hoàn toàn đúng yêu
cầu và chức năng cho từng trường hợp thử.

21
C. PHẦN KẾT LUẬN

Qua quá trình nghiên cứu và thực hiện, chúng em đã thành công trong
việc thiết kế và mô phỏng một vi mạch số có khả năng cộng, trừ, nhân và so
sánh hai số nhị phân 4 bit sử dụng ngôn ngữ Verilog. Mạch thiết kế đáp ứng
được các yêu cầu về tính chính xác và độ tin cậy cao.
Quá trình mô phỏng và kiểm tra đã giúp chúng em sửa chữa được các vấn
đề, các lỗi tiềm ẩn, đồng thời cung cấp một cái nhìn tổng quan về cách thức hoạt
động của mạch trong các tình huống khác nhau.
Tuy không đạt được tính ứng dụng cao trong môi trường thực tế nhưng nó
có khả năng tích hợp vào các hệ thống số phức tạp hơn. Trong tương lai, chúng
em dự định sẽ tiếp tục nghiên cứu để cải thiện độ tin cậy của mạch, đồng thời
phát triển và mở rộng khả năng của mạch để hỗ trợ thực hiện thêm các phép
toán số học khác phức tạp hơn. Việc tích hợp với các công nghệ mới sẽ được
xem xét để nâng cao khả năng ứng dụng của mạch trong thế giới mà kĩ thuật số
càng ngày càng phát triển.

22
PHỤ LỤC

❖ Chương trình cho từng Submodule


*Bộ cộng toàn phần 1 bit
module fa1b(
input a,
input b,
input ci,
output s,
output co );

assign s = a^b^ci;
assign co = ((a^b)&ci) + (a&b);

endmodule

*Khối mạch cộng 2 số 4 bit


module fa4b(
input [3:0] A,
input [3:0] B,
input E,
output[4:0] S );

wire c1,c2,c3;
wire [4:0] H;

fa1b f1 (A[0],B[0],1'b0,H[0],c1);
fa1b f2 (A[1],B[1],c1,H[1],c2);
fa1b f3 (A[2],B[2],c2,H[2],c3);
fa1b f4 (A[3],B[3],c3,H[3],H[4]);

assign S[0] = E&H[0];


assign S[1] = E&H[1];
assign S[2] = E&H[2];
assign S[3] = E&H[3];
assign S[4] = E&H[4];

endmodule

*Khối mạch trừ 2 số 4 bit


module fulladder4bit_1(
input [3:0] A,
input [3:0] B,
input CI,

23
output[3:0] M,
output wire CO );

wire c4,c5,c6;
wire [3:0] X;

fa1b f4 (A[0],B[0],CI,X[0],c4);
fa1b f5 (A[1],B[1],c4,X[1],c5);
fa1b f6 (A[2],B[2],c5,X[2],c6);
fa1b f7 (A[3],B[3],c6,X[3],CO);

assign M[0] = X[0]^~CO;


assign M[1] = X[1]^~CO;
assign M[2] = X[2]^~CO;
assign M[3] = X[3]^~CO;

endmodule

module fulladder4bit_2(
input [3:0] A,
input CI,
output [3:0] X,
output CO );

wire c7,c8,c9;

fa1b f8 (A[0],1'b0,CI,X[0],c7);
fa1b f9 (A[1],1'b0,c7,X[1],c8);
fa1b f10 (A[2],1'b0,c8,X[2],c9);
fa1b f11 (A[3],1'b0,c9,X[3],CO);

endmodule

module minus4bit(
input [3:0] A,
input [3:0] B,
input E,
output dau,
output[4:0] M );

wire [3:0] H;
wire [4:0] X;
wire cx;

fulladder4bit_1 t1 (A[3:0],~B[3:0],1'b1,H[3:0],cx);
fulladder4bit_2 t2 (H[3:0],~cx,X[3:0],X[4]);

24
assign M[0] = E&X[0];
assign M[1] = E&X[1];
assign M[2] = E&X[2];
assign M[3] = E&X[3];
assign M[4] = E&X[4];

assign dau = cx&E;

endmodule

*Khối mạch nhân


module multiply(
input [3:0] A,
input [3:0] B,
input E,
output[7:0]P );

wire[3:0] X,Y,Z,T;
wire[10:0] O;
wire[7:1] S;
wire[7:1] H;

assign P[0]=A[0] & B[0] & E;


assign X[1]=A[1] & B[0];
assign X[2]=A[2] & B[0];
assign X[3]=A[3] & B[0];

assign Y[0]=A[0] & B[1];


assign Y[1]=A[1] & B[1];
assign Y[2]=A[2] & B[1];
assign Y[3]=A[3] & B[1];

assign Z[0]=A[0] & B[2];


assign Z[1]=A[1] & B[2];
assign Z[2]=A[2] & B[2];
assign Z[3]=A[3] & B[2];

assign T[0]=A[0] & B[3];


assign T[1]=A[1] & B[3];
assign T[2]=A[2] & B[3];
assign T[3]=A[3] & B[3];

fa1b fa1 (Y[0],X[1],1'b0,H[1],O[0]);


fa1b fa2 (Y[1],X[2],O[0],S[1],O[1]);
fa1b fa3 (Y[2],X[3],O[1],S[2],O[2]);
fa1b fa4 (Y[3],1'b0,O[2],S[3],O[3]);
fa1b fa5 (Z[0],S[1],1'b0,H[2],O[4]);
fa1b fa6 (Z[1],S[2],O[4],S[5],O[5]);
25
fa1b fa7 (Z[2],S[3],O[5],S[6],O[6]);
fa1b fa8 (Z[3],O[3],O[6],S[7],O[7]);
fa1b fa9 (T[0],S[5],1'b0,H[3],O[8]);
fa1b fa10 (T[1],S[6],O[8],H[4],O[9]);
fa1b fa11 (T[2],S[7],O[9],H[5],O[10]);
fa1b fa12 (T[3],O[7],O[10],H[6],H[7]);

assign P[1]= E & H[1];


assign P[2]= E & H[2];
assign P[3]= E & H[3];
assign P[4]= E & H[4];
assign P[5]= E & H[5];
assign P[6]= E & H[6];
assign P[7]= E & H[7];

endmodule

*Khối mạch so sánh


module ss1bit(
input a,
input b,
input e,
output wire s,
output g,
output wire i );
wire x;

assign s=a&(~b)&e;
assign i=(~a)&b&e;
assign x=a~^b;
assign g=x&e;

endmodule

module compare(
input [3:0] A,
input [3:0] B,
input E,
output greater,
output less,
output equal );

wire [3:0] X;
wire [3:0] Y;
wire [2:0] Z;

ss1bit s4 (A[3],B[3],E,X[3],Z[2],Y[3]);
ss1bit s3 (A[2],B[2],Z[2],X[2],Z[1],Y[2]);
26
ss1bit s2 (A[1],B[1],Z[1],X[1],Z[0],Y[1]);
ss1bit s1 (A[0],B[0],Z[0],X[0],equal,Y[0]);

assign greater = X[3]|X[2]|X[1]|X[0];


assign less = Y[3]|Y[2]|Y[1]|Y[0];

endmodule

*Khối mạch đếm vòng (khối để chuyển chế độ)


module ffd_1(
input clk,
input set,
input D,
output reg Q );

always @(negedge clk or posedge set)


begin
if(set==1)
Q <= 1'b1;
else
Q <= D;
end

endmodule

module ffd_2(
input clk,
input reset,
input D,
output reg Q );

always @(negedge clk or posedge reset)


begin
if(reset==1)
Q <= 1'b0;
else
Q <= D;
end

endmodule

module ring4bit(
output wire Q0,
output wire Q1,
output wire Q2,
output wire Q3,
27
input CLK,
input RES );

ffd_1 d1 (CLK,RES,Q3,Q0);
ffd_2 d2 (CLK,RES,Q0,Q1);
ffd_2 d3 (CLK,RES,Q1,Q2);
ffd_2 d4 (CLK,RES,Q2,Q3);

endmodule

❖ Chương trình cho Topmodule


module system(
input BUTTON,
input RES,
input [3:0] A,
input [3:0] B,
output Dau,
output [7:0] O,
output greater,
output less,
output equal );

wire E0,E1,E2,E3;
wire [4:0] S,M;
wire [7:0] P;

ring4bit ring(.Q0(E0),.Q1(E1),.Q2(E2),.Q3(E3),.CLK(BUTTON),.RES(RES) );
fa4b fab (.A(A),.B(B),.E(E0),.S(S) );
minus4bit mn (.A(A),.B(B),.E(E1),.dau(Dau),.M(M) );
multiply mp (.A(A),.B(B),.E(E2),.P(P) );
compare cp (.A(A),.B(B),.E(E3),.greater(greater),.less(less),.equal(equal) );

assign O[0] = S[0]|M[0]|P[0];


assign O[1] = S[1]|M[1]|P[1];
assign O[2] = S[2]|M[2]|P[2];
assign O[3] = S[3]|M[3]|P[3];
assign O[4] = S[4]|M[4]|P[4];
assign O[5] = P[5];
assign O[6] = P[6];
assign O[7] = P[7];

endmodule

28
❖ Chương trình Testbench cho Topmodule
module test;

// Inputs
reg BUTTON;
reg RES;
reg [3:0] A;
reg [3:0] B;

// Outputs
wire Dau;
wire [7:0] O;
wire greater;
wire less;
wire equal;

system uut (
.O (O),
.greater(greater),
.less(less),
.equal(equal),
.BUTTON(BUTTON),
.RES(RES),
.A (A),
.B (B),
.Dau(Dau)
);

initial begin

BUTTON = 0;
RES = 1;
A=4;
B=2;
#20;

BUTTON = 0;
RES = 0;
A=4;
B=2;
#80;

BUTTON = 1;
RES = 0;
#20;

29
BUTTON = 0;
RES = 0;
A=5;
B=3;
#100;

BUTTON = 0;
RES = 0;
A=3;
B=5;
#100;

BUTTON = 1;
RES = 0;
#20;

BUTTON = 0;
RES = 0;
A=7;
B=8;
#100;

BUTTON = 1;
RES = 0;
#20;

BUTTON = 0;
RES = 0;
A=9;
B=6;
#100;

BUTTON = 0;
RES = 0;
A=11;
B=11;
#100;

BUTTON = 0;
RES = 0;
A=3;
B=8;
#100;

BUTTON = 1;
RES = 0;
#20;

BUTTON = 0;
30
RES = 0;
A=3;
B=8;
#100;

end

endmodule

31

You might also like