ĐẠI HỌC QUỐC GIA TP.HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA ĐIỆN – ĐIỆN TỬ BỘ MÔN ĐIỆN TỬ ---------------o0o--------------- BÁO CÁO BÀI TẬP LỚN XỬ LÝ SỐ TÍN HIỆU VỚI FPGA GVHD: Nguyễn Lý Thiên Trường HỌC KỲ 221, NĂM HỌC 2022 - 2023 TP. HỒ CHÍ MINH, THÁNG 12 NĂM 2022 MỤC LỤC I. PHẦN A – CHUNG CHO CÁC NHÓM. Kết quả và đánh giá.
Kết quả và đánh giá. Kết quả và đánh giá. Kết quả và đánh giá. Kết quả và đánh giá.
PHẦN B – RIÊNG CỦA MỖI NHÓM. PHẦN A – CHUNG CHO CÁC NHÓM 1. Yêu cầu 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 n số không dấu ngõ vào như hình bên dưới Lưu ý Thực thi hệ thống trên với n = 16 Các số I0, I1,…,In-1 là các số nhị phân 4bits không dấu Trường hợp ngõ vào có nhiều hơn 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 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) 3. Đánh giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone V 5CGXFC7F23C8 1. Giải thuật Đề xuất 2 giải thuật 3 Giải thuật 1 Sơ đồ khối Giải thích chi tiết Nhập các giá trị ngõ vào ở phần Waveform của Quartus II Chương trình Khai báo các giá trị trong chương trình Tạo 2 khối so sánh o So sánh giá trị ban đầu của 2 ngõ vào o Ứng với giá trị đầu ra của khối so sánh ban đầu ta so sánh lần lượt từng ngõ vào tiếp theo Sau khi có được kết quả so sánh ta gán giá trị thu được vào min1 và min2 Tiếp theo, tìm giá vị trí của giá trị nhỏ nhất (dùng biến min1 để xét) Sau khi xét xong thì gán giá trị phù hợp vào index_min1 và kết thúc chương trình 4 Giải thuật 2 Sơ đồ khối Giải thích chi tiết Cho 16 ngõ vào với mỗi ngõ vào là 4bits, nên ta gán 16 ngõ vào này và vào thanh ghi 64bits Gán các giá trị đầu vào i = 0, min1 và min2 giá trị cao nhất trong số 4bits (4’b1111) là 15, index_min1 = 0 và 1 biến chạy là run = 0 Tạo vòng lặp với biến đếm là i = 0 và đếm dần về 15.
Trong vòng lặp ta có So sánh giá trị ngõ vào tại vị trí thứ nhất với min1, nếu nhỏ hơn thì giá trị hiện tại của min1 gán vào min2. Sau đó giá trị của ngõ vào đó sẽ gán vào min1 và index_min1 sẽ cập nhật vị trí ngõ vào đó Nếu lớn hơn thì ngõ vào đó tiếp so sánh với giá trị min2, nếu nhỏ hơn thì gán giá trị ngõ vào đó vào min2 và nếu lớn hơn thì bỏ qua Ta dịch thanh ghi sang 4bits để tới ngõ ra tiếp theo và tăng biến đếm lên 1 đơn vị. Và thực hiện lại vòng lặp 5 Nếu biến đếm tới vị trí thứ 16 thì nghĩa là đã xét hết giá trị ngõ vào và kết thúc chương trình 1. Code Verilog Giải thuật 1 module gt1( input [3:0] i0,i10,i2,i3,i4,i5,i6,i7,i8,i9,i11,i12,i13,i14,i15,i16, output [3:0] min1,min2, output reg [3:0] index_min1); //thay i1=i10, vì i1 bị lỗi wire [3:0] v1, v2, v3, v4, v5, v6, v7, v8, v9, v11, v12, v13, v14, v15; wire [3:0] u1, u2, u3, u4, u5, u6, u7, u8, u9, u11, u12, u13, u14, u15; // So sánh giá trị ngõ vào batdau cap1(.min_bd2(v1)); sosanh cap2(.out2(v2)); sosanh cap3(.out2(v3)); sosanh cap4(.out2(v4)); sosanh cap5(.out2(v5)); sosanh cap6(.out2(v6)); sosanh cap7(.out2(v7)); sosanh cap8(.out2(v8)); sosanh cap9(.out2(v9)); sosanh cap10(.out2(v11)); sosanh cap11(.out2(v12)); sosanh cap12(.out2(v13)); sosanh cap13(.out2(v14)); sosanh cap14(.out2(v15)); sosanh cap15(.out2(min2)); always@ (*) begin if (min1 == i0) index_min1 = 4'b0000; else if (min1 == i10) 6 index_min1 = 4'b0001; else if (min1 == i2) index_min1 = 4'b0010; else if (min1 == i3) index_min1 = 4'b0011; else if (min1 == i4) index_min1 = 4'b0100; else if (min1 == i5) index_min1 = 4'b0101; else if (min1 == i6) index_min1 = 4'b0110; else if (min1 == i7) index_min1 = 4'b0111; else if (min1 == i8) index_min1 = 4'b1000; else if (min1 == i9) index_min1 = 4'b1001; else if (min1 == i11 index_min1 = 4'b1010; else if (min1 == i12) index_min1 = 4'b1011; else if (min1 == i13) index_min1 = 4'b1100; else if (min1 == i14) index_min1 = 4'b1101; else if (min1 == i15) index_min1 = 4'b1110; else if (min1 == i16) index_min1 = 4'b1111; end endmodule //Khối bắt đầu module batdau(d,e,min_bd1,min_bd2); 7 input [3:0] d, e; output reg [3:0] min_bd1, min_bd2;// min_bd1,2 là giá trị min1, min2 ban đầu khi xét 2 ngõ vào đầu tiên always@ (*) begin if (d <= e) begin min_bd1 <= d; min_bd2 <= e; end if (d > e) begin min_bd1 <= e; min_bd2 <= d; end end endmodule //Khối so sánh module sosanh(a,b,c,out1,out2); input [3:0] a,b,c; output reg [3:0] out1,out2; always@ (*) begin if (c < a) begin out2 <= a; out1 <= c; end else if (c < b) begin out1 <= a; out2 <= c; end 8 else begin out1 <= a; out2 <= b; end end endmodule 9 Giải thuật 2 //Giai thuat 2: xet lan luot tu vi tri 0 den 15 //Xet gia tri tai vi tri 0 //So sanh gia tri da cho, neu phu hop //min2=min1, min1=gia tri do, luu vi tri min1 tai index_min1 //neu khong phu hop thi xet tiep, ket qua phu hop se luu vao min2 //Sau khi xet xong vi tri do thi xet vi tri ke tiep //Sau khi xet het 15 vi tri ct se ket thuc module cau1_gt1(in,min1,min2,index_min1,clk); input clk; //n=16 => 16x4bit = 64 bit input [63:0] in; output reg [3:0] min1,min2; output reg [3:0] index_min1; //a=in reg [63:0] a; //run la bien cho ct chay reg run = 0; //Gan gia tri always @(in) begin a = in; //Gan min1 va min2 gia tri cao nhat trong 4 bit min1 = 4'b1111; min2 = 4'b1111; index_min1 = 0; run = 1; end reg [4:0] compare1,compare2; integer i = 0; //Chuong trinh chinh 10 always @(posedge clk) begin if (run) for (i=0;i<16;i=i+1) begin //So sanh gia tri compare1 = {1'b0,a[3:0]}-{1'b0,min1}; compare2 = {1'b0,a[3:0]}-{1'b0,min2}; //Tim min1 va index_min1 (Xet bit nho) if (compare1[4]) begin min2 = min1; min1 = a[3:0]; index_min1 = i; end //Tim min2 (Xet bit nho) else if (compare2[4]) min2 = a[3:0]; a = a>>4; end //Ket thuc ct run = 0; end endmodule 11 1.
Kết quả và đánh giá Kết quả mô phỏng với phần mềm Modelsim Giải thuật 1 Giải thuật 2 12 Đánh giá tài nguyên phần cứng 13 2. Yêu cầu 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ố 16bits 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 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 V 5CGXFC7C7F23C8 2. Giải thuật Giải thuật 1 Sơ đồ khối 14 Giải thích ý tưởng Tạo 1 mảng chứa 16 phần tử tương ứng với 16 lũy thừa của 2 Duyệt mảng mà so sánh với x và tìm lũy thừa lớn nhất sao cho bé hơn x Tìm được số mũ là số thứ tự của phần tử trong mảng Giải thuật 2 Sơ đồ khối Giải thích ý tưởng Sử dụng phép dịch phải bit để tìm lũy thừa của 2 Số cần tìm là số nhỏ hơn và gần nhất của x 15 2. Code Giải thuật 1 module logarit2cl(x,log2x); input [15:0] x; output reg [5:0] log2x; reg [15:0] arr [0:15]; integer i; always @* begin //tạo mảng chứa các lũy thừa của 2 arr[0] = 1; for(i=1;i<=15;i+1) arr[i]=arr[i-1]<<1; //loại bỏ những trường hợp x = 0 if(x==0) log2x = 16’bz else //so sánh x với các phần tử trong mảng lũy thừa của 2 begin for(i=0;i<=15;i=i+1) if(arr[i]<=x) log2x = i; end end endmodule 16 Giải thuật 2 module logarit2cl(x,log2x); input [15:0] x; output reg [15:0] log2x; integer x1; always @* begin x1 = x; if (x==0) log2x = 16’bz; else for (log2x = -1; x1>0; log2x = log2x+1) x1 = x1>>1; end endmodule 17 2. Kết quả và đánh giá Kết quả mô phỏng trên Modelsim Giải thuật 1 Giải thuật 2 So sánh kết quả thực hiện bằng Matlab Giải thuật 1 Log2(x) STT x Sai số (%) Modelsim Matlab 1 58679 15 15.69 Sai số trung bình (%) 2.91 18 Giải thuật 2 Log2(x) STT x Sai số (%) Modelsim Matlab 1 58679 15 15.69 Sai số trung bình (%) 2.91 Nhận xét Do đoạn Code trên Verilog đã được làm tròn thành số tự nhiên nên có sai số so với Matlab Cả 2 giải thuật đều cho kết quả như nhau Đánh giá thực thi phần cứng Giải thuật 1 19 Giải thuật 2 20 3.
Yêu cầu Trình bày ít nhất 1 giải thuật và viết code Verilog tính giá trị của biểu thức √𝑥 2 + 𝑦 2 với x và y là các số 16bits có dấu bù 2 1. Sử dụng phần mềm mô phỏng (VD: Modelsim) kiểm tra chức năng hệ thống (chụp lại kết quả mô phỏng). Đánh giá sai số kết quả mô phỏng này với kết quả dùng phần mềm Matlab. SV kiểm tra với ít nhất 10 giá trị 2.
Đánh giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone V 5CGXFC7C7F23C8 3. Giải thuật Sơ đồ khối Giải thích giải thuật Chương trình chính gồm 2 giải thuật con thực hiện những chức năng Chương trình đầu tiên nhận số có dấu bù 2 16bits, đưa vào bộ bình phương Kết quả là một số 32bits Ngõ ra của bộ bình phương lại tiếp tục được đi qua bộ cộng (sử dụng flip – flop để lưu các số hạng đầu tiên và chờ số hạng thứ 2) Chương trình thứ 2 nhận ngõ vào là kết quả của bộ cộng (𝑥 2 + 𝑦 2 ) Tổng bình phương này sẽ được đưa qua 1 bộ lấy căn bậc 2 Ngõ ra của bộ này là √𝑥 2 + 𝑦 2 có kích thước 20bits Chương trình chính của Verilog sẽ bao gồm các input và output như sau o [15:0] X_in: biến đầu vào, có dấu bù 2 16bits o dtsig_in: tín hiệu để báo hiệu cho phép đọc X_in o conf: tín hiệu dùng cho flip – flop của bộ bình phương (bộ cộng) 21 o clk: xung clock cho chương trình o reset: tín hiệu reset o done: tín hiệu thông báo cập nhật kết quả o [19:0] X_out: biến ngõ ra, lưu kết quả của phép tính √𝑥 2 + 𝑦 2 gồm 20bits không dấu 22 3.