Sơ đồ giải thuật thứ nhất bộ min_finder Đầu tiên, ta ghép 2 phần gồm giá trị của port và số thứ tự của port đó vào để thực hiện so sánh, gọi là IN[i].. Đánh giá phần cứng giải thuật thứ
Trang 1TP Hồ Chí Minh, Tháng 08/2021
ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA ĐIỆN – ĐIỆN TỬ
- -
BÁO CÁO XỬ LÝ TÍN HIỆU SỐ VỚI FPGA
Giáo viên hướng dẫn : Nguyễn Lý Thiên Trường
Nhóm thực hiện : 10
Danh sách thành viên : Nguyễn Hà Nhất Phương 1813622
Nguyễn Bùi Thanh Sơn 1813849 Nguyễn Minh Thành 1814021 Trần Văn Thành 1814035
Võ Hoàng Thịnh 1810552
BÀI TẬP LỚN
Trang 2Đại học Bách khoa TPHCM Trang 1
Danh sách thành viên:
1 Nguyễn Hà Nhất Phương 1813622 phuong.nguyenhanhat@hcmut.edu.vn
2 Nguyễn Bùi Thanh Sơn 1813849 son.nguyenbku1604@hcmut.edu.vn
3 Nguyễn Minh Thành 1814021 thanh.nguyenminh912000@hcmut.edu.vn
4 Trần Văn Thành 1814035 thanh.tran.432@hcmut.edu.vn
5 Võ Hoàng Thịnh 1810552 thinh.vo2888@hcmut.edu.vn
Danh sách phân công nhiệm vụ:
Phần bài tập riêng cả nhóm làm chung qua các buổi google meet
h
Trang 3MỤC LỤC
NỘI DUNG 4
1 Phần chung cho tất cả các nhóm 4
1.1 Bài 1 4
1.1.1 Đề bài 4
1.1.2 Giải thuật thứ nhất 5
1.1.3 Giải thuật thứ hai 10
1.2 Bài 2 16
1.2.1 Đề bài 16
1.2.2 Cơ sở lý thuyết 16
1.2.3 Giải thuật tính toán 18
1.2.4 Code mô phỏng 19
1.2.5 Kết quả mô phỏng 21
1.2.6 Đánh giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone II EP2C35F672C6 23
1.3 Bài 3 24
1.3.1 Đề bài 24
1.3.2 Giải thuật tính căn tính toán từng chữ số (Digit-by-digit calculation) 24
1.3.3 Code thực hiện và kết quả mô phỏng 26
1.3.4 Kết quả đánh giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone II EP2C35F672C6 30
1.4 Bài 4 31
1.4.1 Đề bài 31
1.4.2 Cơ sở lý thuyết 31
1.4.3 Chi tiết thiết kế 32
1.4.4 Code thực hiện và kết quả mô phỏng 33
1.4.5 Kết quả đánh giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone II EP2C35F672C6 38
Trang 4Đại học Bách khoa TPHCM Trang 3
1.5 Bài 5 40
1.5.1 Đề bài 40
1.5.2 Cơ sở lý thuyết 40
1.5.3 Code thực hiện và kết quả mô phỏng 42
1.5.4 Kết quả đánh giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone II EP2C35F672C6 45
2 Phần riêng cho từng nhóm 46
h
Trang 5NỘI DUNG
1 Phần chung cho tất cả các nhóm
1.1 Bài 1
1.1.1 Đề bài
Cho sơ đồ khối của hệ thống tìm số nhỏ nhất thứ nhất (min1), số nhỏ nhất thứ 2 (min2)
và vịtrí của số nhỏ nhất thứ nhất (index_min1) trong 𝑛 số không dấu ngõ vào như hình
bên dưới
Hình 1.1 Bộ min_finder
Lưu ý:
Thực thi hệ thống trên với 𝑛 = 10
Các ngõ vào I0, I1,…, In-1 là các số nhị phân 4 bit không dấu
Trường hợp ngõ vào có nhiều hơn 2 giá trị min1, thì ngõ ra index_min1 chỉ vị trí ngõ
vào có chỉ số nhỏ hơn
1 Đề xuất 2 giải thuật thực thi hệ thống trên (sơ đồ khối, giải thích chi tiết)
2 Viết code Verilog mô tả 2 giải thuật đã đề xuất ở trên Sử dụng phần mềm mô phỏng kiểm tra chức năng hệ thống (chụp lại hình kết quả mô phỏng)
3 Đánh giá tài nguyên phần cứng khi thực thi 2 giải thuật đề xuất trên FPGA Cyclone II EP2C35F672C6
Trang 6Đại học Bách khoa TPHCM Trang 5
1.1.2 Giải thuật thứ nhất
Hình 1.2 Sơ đồ giải thuật thứ nhất bộ min_finder
Đầu tiên, ta ghép 2 phần gồm giá trị của port và số thứ tự của port đó vào để thực hiện so
sánh, gọi là IN[i] Khi so sánh, nếu phần giá trị của 2 port bằng nhau, ta sẽ so sánh số thứ tự
của port đó
Tiếp theo, ta lưu min_1 và index_min1 tương ứng với giá trị của port 0 và số thứ tự của nó:
0 và min_2 là giá trị của port 1
Ta lần lượt so sánh cặp min_1, index_min1 và giá trị min_2 với giá trị tương ứng (có hoặc
không có số thứ tự) của các port từ 1 đến 9 Khi đó sẽ có 2 trường hợp xảy ra:
Thứ nhất, cặp min_1, index_min1 lớn hơn IN[i] Khi đó, ta thay min_1, index_min1 bởi các giá trị tương ứng của port thứ i và thay min_2 bởi min_1
Thứ hai, cặp min_1, index_min1 bé hơn IN[i] Ta sẽ tiếp tục so sánh giá trị của port thứ i với min_2 Nếu min_2 lớn hơn giá trị của port thứ i thì ta cập nhật giá trị đó cho min_2 và ngược lại thì ta giữ nguyên min_2
h
Trang 7input [3:0] in0,in1,in2,in3,in4,in5,in6,in7,in8,in9;
output reg [3:0] min1,min2;
output reg [3:0] index_min1;
output reg nflag;
Trang 8Đại học Bách khoa TPHCM Trang 7
always @( negedge clk) begin
module mf_compare(in0,in1,out);
input [7:0] in0,in1;
output reg out;
wire [1:0] eq, grt;
cp COMP0 (in0[3:0],in1[3:0],eq[0],grt[0]);
cp COMP1 (in0[7:4],in1[7:4],eq[1],grt[1]);
module cp_slice(eq_i,ge_i,in0,in1,eq,ge);
input eq_i,ge_i,in0,in1;
output eq,ge;
wire node1;
assign node1 = ~(in0^in1);
assign eq = eq_i&node1;
assign ge = (node1&ge_i)|(in0&(~in1));
Trang 9wire [3:0] min1,min2;
Trang 10Đại học Bách khoa TPHCM Trang 9
Hình 1.4 Mô phỏng dạng sóng giải thuật thứ nhất cho bộ min_finder
Hình 1.5 Đánh giá phần cứng giải thuật thứ nhất cho bộ min_finder
Ở đây, ta thấy thiết kế sử dụng 122 logic elements (chiếm chưa đến 1% số logic elements của thiết bị), bao gồm: 109 hàm tổ hợp và 101 thanh ghi Ngoài ra tổng số pins là 55 (chiếm 12% số pins của thiết bị)
h
Trang 111.1.3 Giải thuật thứ hai
Hình 1.6 Sơ đồ giải thuật thứ hai bộ min_finder
Đầu tiên, ta lần lượt so sánh min_1 và giá trị min_2 với giá trị của các port từ 1 đến 9 Khi
đó sẽ có 2 trường hợp xảy ra:
Thứ nhất, min_1 lớn hơn giá trị của port thứ i Khi đó, ta thay min_1 bởi giá trị của port thứ
i và thay min_2 bởi min_1
Trang 12Đại học Bách khoa TPHCM Trang 11
Thứ hai, min_1 bé hơn giá trị của port thứ i Ta sẽ tiếp tục so sánh giá trị của port thứ i với min_2 Nếu min_2 lớn hơn giá trị của port thứ i thì ta cập nhật giá trị đó cho min_2 và ngược lại thì ta giữ nguyên min_2
Sau đó, với giá trị đã có của min_1, ta tìm từ port 0 đến port 9 sao cho giá trị của port đó bằng min_1, thì số thứ tự của port đầu tiên tìm được chính là index_min1
input [3:0] in0,in1,in2,in3,in4,in5,in6,in7,in8,in9;
output reg [3:0] min1,min2;
output reg [3:0] index_min1;
output reg nflag;
Trang 13module mf_compare(in0,in1,out);
input [7:0] in0,in1;
output reg out;
wire [1:0] eq, grt;
cp COMP0 (in0[3:0],in1[3:0],eq[0],grt[0]);
cp COMP1 (in0[7:4],in1[7:4],eq[1],grt[1]);
module cp_slice(eq_i,ge_i,in0,in1,eq,ge);
input eq_i,ge_i,in0,in1;
output eq,ge;
wire node1;
Trang 14Đại học Bách khoa TPHCM Trang 13
assign node1 = ~(in0^in1);
assign eq = eq_i&node1;
assign ge = (node1&ge_i)|(in0&(~in1));
endmodule
module testbench;
reg rst,clk;
reg [3:0] in0,in1,in2,in3,in4,in5,in6,in7,in8,in9;
wire [3:0] min1,min2;
Trang 15Hình 1.7 Mô phỏng dạng sóng giải thuật thứ hai cho bộ min_finder
Hình 1.8 Mô phỏng dạng sóng giải thuật thứ hai cho bộ min_finder
Hình 1.9 Đánh giá phần cứng giải thuật thứ hai cho bộ min_finder
Trang 16Đại học Bách khoa TPHCM Trang 15
Ở đây, ta thấy thiết kế sử dụng 122 logic elements (chiếm chưa đến 1% số logic elements của thiết bị), bao gồm: 109 hàm tổ hợp và 101 thanh ghi Ngoài ra tổng số pins là 55 (chiếm 12% số pins của thiết bị) Từ đó, ta nhận thấy rằng phần cứng sử dụng của hai thiết kế là khá tương đương nhau
h
Trang 171.2 Bài 2
1.2.1 Đề bài
Tìm hiểu ít nhất 1 giải thuật và viết code Verilog tính gần đúng giá trị log2(x), với x
là số 16 bit không dấu
Sử dụng phần mềm mô phỏng kiểm tra chức năng hệ thống (chụp lại hình kết quả mô phỏng) Đánh giá sai số giữa kết quả mô phỏng này với kết quả dùng phần mềm Matlab
Đánh giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone II EP2C35F672C6
𝑥 = 2𝑦1 2−1 + 𝑦22−2+𝑦32−3+⋯(4)
Trang 18Đại học Bách khoa TPHCM Trang 17
Từ phương trình (3) và (4) có thể suy ra rằng giá trị lớn nhất của y là 1 (tổng của một cấp tiến hình học với tỷ lệ chung 0,5 khi tất cả các bit của y là 1) và do đó giá trị lớn nhất của
Trang 191.2.3 Giải thuật tính toán
Từ các phương trình đã trình bày ở mục 1.2.2, ta sẽ xây dựng được lưu đồ giải thuật
để tìm y khi biết x như sau:
Trang 20Đại học Bách khoa TPHCM Trang 19
output reg [15:0] out;
output reg flag, inf;
if (|count == ) state <= DONE;
else state <= SQUARE;
Trang 21wire flag,inf;
log2 LOG2 (clk,rst,in,out,flag,inf);
Trang 22Đại học Bách khoa TPHCM Trang 21
Trang 23Hình 1.10 kết quả mô phỏng của dạng sóng bằng code Verilog
Hình 1.11 Kết quả tính toán được trên Matlab
Nhận xét:
Kết quả mô phỏng có sự tương đồng với kết quả tính toán được, với sai số lớn nhất 𝟏𝟎−𝟒
Trang 24Đại học Bách khoa TPHCM Trang 23
1.2.6 Đánh giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone II
EP2C35F672C6
Hình 1.12 Đánh giá tài nguyên phần cứng của module log2
h
Trang 251.3 Bài 3
1.3.1 Đề bài
Tìm hiểu ít nhất 1 giải thuật và viết code Verilog tính gần đúng giá trị biểu thức
√𝑥2 + 𝑦2, với x và y là các số 16 bit không dấu
1 Sử dụng phần mềm mô phỏng kiểm tra chức năng hệ thống (chụp lại màn hình kết quả mô phỏng) Đánh giá sai số giữa kết quả mô phỏng này với kết quả dùng phần mềm Matlab
2 Đánh giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone II EP2C35F672C6
1.3.2 Giải thuật tính căn tính toán từng chữ số (Digit-by-digit calculation)
Đây là một phương pháp để tìm từng chữ số của căn bậc hai theo một chuỗi Có một số lợi thế như:
Nó có thể dễ dàng cho tinh toán thủ công
Mỗi chữ số của gốc được tìm thấy đều đúng, sẽ không bị thay đổi sau này
Có thể sử dụng để kiểm tra một số nguyên đã cho có phải số bình phương không
Bắt đầu với cặp chữ số từ bên trái, thực hiện theo từng cặp
1 Bắt đầu từ bên trái, hạ chứ số ngoài cùng bên trái xuống chưa được sử dụng (nếu các chữ số đã được dùng hãy viết “00”) và viết chúng vào bên phải phần còn lại của bước trước (bước đầu không có phần dư) Đây là giá trị hiện tại của c
2 Tìm các số p, y và x, như sau:
Gọi p là phần căn tìm được cho đến nay, bỏ qua dấu thập phân (bước đầu p =0) Xác định chữ số lớn nhất x sao cho 𝑥(20𝑝 + 𝑥 ) ≤ 𝑐 Ta có 𝑦 = 𝑥(20𝑝 + 𝑥 )0
Trang 26Đại học Bách khoa TPHCM Trang 25
Đặt chữ số x là chữ số tiếp theo của căn bậc Do đó p mới sẽ là p cũ nhân 10 cộng x
3 Trừ y với c để tạo thành phần dư mới
4 Nếu phần dư bằng không và không còn chữ số nào để hạ thì thuật toán kết thúc Nếu chưa quay lại bước 1 tính toán lần nữa
Kề thừa thuật toán từng chứ số:
X : Giá trị đầu vào và giá trị muốn tính căn
A: Giá trị hiện tại đang tính toán
T: Kết quả phép thử dấu
Q: Căn bậc 2
Bắt đầu với cặp chữ số từ bên trái, thực hiện theo từng cặp 2 chữ số
1 Dịch trái X 2 bit sang vị trí của A Gán T = A – {Q,01}
Trang 27Vậy căn của 110.012 (6.2510) là 10.12 (2.510)
1.3.3 Code thực hiện và kết quả mô phỏng
Trang 28Đại học Bách khoa TPHCM Trang 27
Trang 30Đại học Bách khoa TPHCM Trang 29
Nhận xét: Kết quả thu được trên ModelSim có kết quả nhỏ hơn khi dùng phần mềm Matlab do
đây là thuật toán tính căn từng chữ số, thiết kế chỉ lấy 8 bit sau dấu phẩy làm đồ chính xác chưa
cao Cách khắc phục tăng số bit sau dấu phẩy để tăng độ chính xác
h
Trang 311.3.4 Kết quả đánh giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone
Trang 32Đại học Bách khoa TPHCM Trang 31
1.4 Bài 4
1.4.1 Đề bài
Cho hai số M và N, mỗi số 8 bit không dấu Thực hiện phép toán cộng: M + N bằng hai cách:
Cách 1: cộng nối tiếp từng bit
Cách 2: cộng song song (nhiều bit cùng lúc)
3 Viết code Verilog mô tả hai cách trên Sử dụng phần mềm mô phỏng kiểm tra chức năng hệ thống (chụp lại kết quả mô phỏng)
4 So sánh tài nguyên phần cứng của 2 cách trên khi thực thi trên FPGA Cyclone II EP2C35F672C6
1.4.2 Cơ sở lý thuyết
Các mạch cộng về cơ bản đều được xây dựng dựa trên bộ cộng toàn phần Full Adder Mạch cộng Full Adder có 3 ngõ vào x, y và cin; 2 ngõ ra là tổng của phép cộng (sum), và bit nhớ của phép cộng (cout) Bảng chân trị được cho dưới bảng sau:
Từ bảng chân trị trên ta kết luận được biểu thức của ngõ ra với ngõ vào như sau:
s = in1 in2 cin;
cout = in1.in2 + cin.(in1 in2)
Dựa trên biểu thức của hàm ngõ ra với ngõ vào ta xây dựng được mạch cộng full adder dùng các cổng logic như hình bên dưới:
h
Trang 33Sơ đồ mạch cộng Full Adder dùng cổng logic
1.4.3 Chi tiết thiết kế
Cách 1: cộng nối tiếp từng bit
Khi thực hiện cộng đầu tiên thực hiện cộng 2 bit LSB của các số được cộng trước, bit LSB của tầng được đưa ra 1 ghi dịch còn số nhớ sẽ quay trở về cộng chung với 2 bit kế tiếp bit LSB và cứ vậy cho đến khi 2 bit cuối cùng được cộng Mạch ghi dịch ngõ ra dịch chuyển sang phải qua mỗi lần cộng sẽ cho ra kết quả cộng số nhớ cuối cùng trở thành bit MSB của tổng ra Mạch cần một xung nhịp để giữ cho các mạch làm việc được đồng bộ
Với ngõ vào gồm hai số 8 bit không dấu thì ngõ ra sẽ là số 9 bit không dấu, trong đó bit MSB là bit nhớ cuối cùng của phép cộng Mô hình thiết kế chi tiết mạch như sau:
Mạch cộng nối tiếp 8 bit
N0 N1 N2 N3 N6 N5 N4
M0 M1 M2 M3 M6 M5 M4
Q D
Clock D - FF
Thanh ghi dịch chứa M
Thanh ghi dịch chứa N
Thanh ghi dịch chứa tổng
N7
Trang 34Đại học Bách khoa TPHCM Trang 33
Cách 2: cộng song song (nhiều bit cùng lúc)
Trước hết ta cộng 2 bit LSB để cho bit tổng (LSB) Số nhớ được đưa tới để cộng chung với 2 bit kế tiếp bit LSB để cho bit tổng ở hàng kế tiếp cho đến phép cộng cuối cùng giữa hai bit MSB để được bit tổng ở hàng đó, số nhớ khi này trở thành bit LSB của tổng
Với ngõ vào gồm hai số 8 bit không dấu thì ngõ ra sẽ là số 8 bit không dấu, trong đó bit nhớ cuối cùng của phép cộng nằm ở bit cout Mô hình thiết kế chi tiết mạch như sau:
Mạch cộng song song 8 bit
1.4.4 Code thực hiện và kết quả mô phỏng
Cách 1: cộng nối tiếp từng bit
C2 C3
C4 C5
C6
Cin
h
Trang 36Đại học Bách khoa TPHCM Trang 35
Trang 37Kết quả thu được sau mô phỏng trên ModelSim hoàn toàn đúng với tính toán lý thuyết
Cách 2: cộng song song (nhiều bit cùng lúc)
assign sum = in1 ^ in2 ^ cin;
assign cout = (in1 & in2) | (cin & (in1 ^ in2));
endmodule
Trang 38Đại học Bách khoa TPHCM Trang 37
full_adder FA1 (a[0],b[0],cin,s[0],c[1]);
full_adder FA2 (a[1],b[1],c[1],s[1],c[2]);
full_adder FA3 (a[2],b[2],c[2],s[2],c[3]);
full_adder FA4 (a[3],b[3],c[3],s[3],c[4]);
full_adder FA5 (a[4],b[4],c[4],s[4],c[5]);
full_adder FA6 (a[5],b[5],c[5],s[5],c[6]);
full_adder FA7 (a[6],b[6],c[6],s[6],c[7]);
full_adder FA8 (a[7],b[7],c[7],s[7],cout);
Trang 39Kết quả mô phỏng trên ModelSim
Kết quả thu được sau mô phỏng trên ModelSim hoàn toàn đúng với tính toán lý thuyết
1.4.5 Kết quả đánh giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone
II EP2C35F672C6
Kết quả tổng hợp cách cộng nối tiếp
Trang 40Đại học Bách khoa TPHCM Trang 39
Kết quả tổng hợp cách cộng song song
Từ hai bảng tổng hợp trên FPGA ta có thể thấy rằng:
Cộng nối tiếp Cộng song song
Trang 41Ý tưởng cơ bản là thay vì dịch phải và cộng mọi bit của số hạng nhân với 1 hoặc 0, thì
ta sẽ so sánh 3 bit một lúc với kỹ thuật chồng chéo Việc nhóm các bit sẽ bắt đầu từ LSB và khối đầu tiên chỉ sử dụng hai bit của số hạng nhân và giả định 0 cho bit thứ ba như hình sau:
Hoạt động chức năng của bộ mã hóa Radix-4 bao gồm tám trạng thái khác nhau, và trong mỗi trạng thái này, chúng ta đều có thể thu được kết quả của phép nhân của số bị nhân với 0, 1 và 2 Điều đó được thể hiện trong bảng sau:
Multiplier Bits Block Recoded 1-bit pair 2 Bits Booth
i + 1 i i – 1 i + 1 i Multiplier Value Partial Product