4 Đánh giá tài nguyên phần cứng xem hình minh họa bên dưới khi thực thi trên FPGA Cyclone II EP2C35F672C6... Đánh giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone II EP2C35F672C6.
Dùng mô hình cấu trúc
Hình 2.1 Kết quả dạng sóng
• Tổng hợp phần cứng trên FPGA
Hình 2.2 Tổng hợp phần cứng trên FPGA
Hình 2.3 Code SystemVerilog module design_a ( input [2:0] a0_i, output [1:0] y0_i); wire [6:0] w0_i ;
//tinh Y and(w0_i[0],a0_i[0],a0_i[1]); and(w0_i[1],a0_i[0],a0_i[2]); and(w0_i[2],a0_i[1],a0_i[2]); or (y0_i[1],w0_i[0],w0_i[1],w0_i[2]);
//tinh z and(w0_i[3],~a0_i[2],~a0_i[1],a0_i[0]); and(w0_i[4],~a0_i[2],a0_i[1],~a0_i[0]); and(w0_i[5],a0_i[2],a0_i[1],a0_i[0]); and(w0_i[6],a0_i[2],~a0_i[1],~a0_i[0]); or(y0_i[0],w0_i[3],w0_i[4],w0_i[5],w0_i[6]); endmodule
• Tổng hợp phần cứng trên FPGA
Hình 2.5 Tổng hợp phần cứng trên FPGA
2.3 Dùng mô hình hành vi
Hình 2.7 Kết quả dạng sóng module design_b( input [2:0] a0_i, output [1:0] y0_i); assign y0_i[1] = (a0_i[2] & a0_i[1]) | (a0_i[2] & a0_i[0]) | (a0_i[1] & a0_i[0]) ; assign y0_i[0] = (~a0_i[2] & ~a0_i[1] & a0_i[0]) | (~a0_i[2] & a0_i[1] & ~a0_i[0]) | (a0_i[2] & a0_i[1] & a0_i[0]) | (a0_i[2] & ~a0_i[1] & ~a0_i[0]); endmodule : design_b
• Tổng hợp phần cứng trên FPGA
Hình 2.8 Tổng hợp phần cứng trên FPGA
Hình 2.9 module design_c ( input [2:0] a0_i, output [1:0] y0_i); always @(a0_i[2] or a0_i[1] or a0_i[0]) begin y0_i[1] = (a0_i[2] & a0_i[1]) | (a0_i[2] & a0_i[0]) | (a0_i[1] & a0_i[0]) ; y0_i[0] = (~a0_i[2] & ~a0_i[1] & a0_i[0]) | (~a0_i[2] & a0_i[1] & ~a0_i[0]) | (a0_i[2] & a0_i[1] & a0_i[0]) | (a0_i[2] & ~a0_i[1] & ~a0_i[0]); end endmodule : design_c
10 | P a g e giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone II EP2C35F672C6
NỘI DUNG BÁO CÁO BÀI 3
// input input logic clk_i, input logic rst_n, input logic [3:0] N,
/*verilator lint_off UNUSED*/ always @(posedge clk_i) begin assert(Q >2); if((t&16'h8000)==0) begin x=t; y_tp = y_tp - 7'd32; end t=x+(x>>3); if((t&16'h8000)==0) begin
35 | P a g e x=t; y_tp = y_tp - 7'd17; end t=x+(x>>4); if((t&16'h8000)==0) begin x=t; y_tp = y_tp - 7'd9; end t=x+(x>>5); if((t&16'h8000)==0) begin x=t; y_tp = y_tp - 7'd4; end t=x+(x>>6); if((t&16'h8000)==0) begin x=t; y_tp = y_tp - 7'd2; end t=x+(x>>7); if((t&16'h8000)==0) begin x=t; y_tp = y_tp - 7'd1; end y_tp = y_tp-1; if (data == '0) begin y = '0; y_tp = '0; end if (data >= 16'h8000) begin y = 4'd15; y_tp = '0; end
//xu ly ket qua temp = 4'bxxxx;
36 | P a g e temp = temp+1; if (y9999) begin for(int i=0;i99) begin for(int i=0;i9999) begin for(int i=0;i99) begin for(int i=0;i>2); if((t&16'h8000)==0) begin x=t; y_tp = y_tp - 7'd32; end t=x+(x>>3); if((t&16'h8000)==0) begin
35 | P a g e x=t; y_tp = y_tp - 7'd17; end t=x+(x>>4); if((t&16'h8000)==0) begin x=t; y_tp = y_tp - 7'd9; end t=x+(x>>5); if((t&16'h8000)==0) begin x=t; y_tp = y_tp - 7'd4; end t=x+(x>>6); if((t&16'h8000)==0) begin x=t; y_tp = y_tp - 7'd2; end t=x+(x>>7); if((t&16'h8000)==0) begin x=t; y_tp = y_tp - 7'd1; end y_tp = y_tp-1; if (data == '0) begin y = '0; y_tp = '0; end if (data >= 16'h8000) begin y = 4'd15; y_tp = '0; end
//xu ly ket qua temp = 4'bxxxx;
36 | P a g e temp = temp+1; if (y9999) begin for(int i=0;i99) begin for(int i=0;i 20 & j < 32) lcd_rs = 1; else j=5; end
/* verilator lint_on BLKSEQ */ endmodule
➢ sqrt: module sqrt( input logic [32:0] data_i, output logic [16:0] result_o,result_o_tp
X_i = X_i - Y; end else P[i] = 0; end frac[4] = {17{P[4]}}&17'd50000; frac[3] = {17{P[3]}}&17'd25000; frac[2] = {17{P[2]}}&17'd12500; frac[1] = {17{P[1]}}&17'd6250; frac[0] = {17{P[0]}}&17'd3125; result_o_tp = frac[0] + frac[1] + frac[2] + frac[3] + frac[4]; result_o = P >> 5; end
/* verilator lint_on WIDTH */ endmodule
Sử dụng matlab để tính sai số
Code function result = bai7matlab(x, y)
% Chuyển đổi x và y về kiểu số nguyên 16 bit không dấu x = uint16(x); y = uint16(y);
% Tính x^2 và y^2 x_square = double(x) * double(x); y_square = double(y) * double(y);
% Định dạng kết quả với số thập phân thứ 5 result = sprintf('%.5f', rounded_result); end
Thực hiện tính toán các giá trị
Thực hiện tính toán sai số
➔ Sai số của giải thuật = 0,2771% Chứng tỏ độ chính xác của giải thuật khá cao.
Cơ sở lý thuyết
Các mạch cộng được xây dựng từ những bộ Full – Adder Mạch cộng Full Adder là một loại mạch điện tử được sử dụng để thực hiện phép cộng hai số nhị phân Nó nhận đầu vào là ba bit: bit cộng (carry-in), bit A và bit B, và tạo ra hai đầu ra: bit kết quả (sum) và bit nhớ (carry-out)
• A và B là hai bit cần được cộng
• Cin là bit cộng (carry-in)
• Sum là bit kết quả
• Cout là bit nhớ (carry-out)
Công thức logic cho mạch Full Adder như sau: sum = x y cin cout = x.y + cin.(x y)
• XOR là cổng logic XOR (hoặc EXOR)
• AND là cổng logic AND
• OR là cổng logic OR
Sơ đồ cổng luận lý của Full Adder:
Cộng nối tiếp từng bit
Khi cộng nối tiếp từng bit của hai số, đầu tiên thực hiện cộng 2 bit LSB (và cộng bit nhớ cin ban đầu nếu có), sau đó tổng 2 bit LSB (sum) sẽ được đưa ra ở một thanh ghi dịch còn bit nhớ “cout” sẽ quay về “cin” để cộng chung với 2 bit kế tiếp bit LSB Mạch ghi dịch ngõ ra dịch chuyển sang phải qua mỗi lần cộng, số nhớ cuối cùng sẽ là MSB của tổng Mạch cần hoạt động cùng 1 xung nhịp để cho mạch làm việc đồng bộ Khi ngõ vào là 1 số n bit sẽ tạo ra số (n+1) bit không dấu với MSB là bit nhớ cuối
Hình 2 Mạch cộng 4 bit nối tiếp
Hình 3 Kết quả mô phỏng mạch cộng nối tiếp
8.2.3 Đánh giá tài nguyên phần cứng trên Cyclone II EP2C35F672C6
Hình 4 Tài nguyên phần cứng của mạch nối tiếp
8.2.4 Code SystemVerilog thực hiện giải thuật
• Code đưa lên LCD module LCD (clk,lcd_e,lcd_rs,lcd_on,lcd_blon,data_lcd,data_i,lcd_rw);
/* verilator lint_off BLKSEQ */ input clk; input [7:0] data_i [2:0]; output reg lcd_e, lcd_rs,lcd_on,lcd_blon,lcd_rw; output reg [7:0] data_lcd; integer i = 0; integer j = 1; reg [7:0] Datas [1:23]; always @(posedge clk) begin lcd_blon = '1; lcd_on = '1; lcd_rw = '0;
Datas[1] = 8'h38; // control instruction : configure - 2 lines
Datas[2] = 8'h0C; // control instruction : Display on, cursor off
Datas[3] = 8'h06; // control instruction : Increment cursor : shift cursor to right Datas[4] = 8'h01; // control instruction : clear display screen
Datas[5] = 8'h80; // control instruction : force cursor to begin at first line
Datas[20] = 8'hC0; // control instruction : force cursor to move to 2nd Line Datas[21] = data_i[2] + 8'h30;
Datas[23] = data_i[0] + 8'h30; end always @(posedge clk) begin
// Delay for writing data if (i 1000000 & i < 2000000) begin i = i + 1; lcd_e = 0; end else if (i == 2000000) begin j = j + 1; i = 0; end else i = 0;
62 | P a g e else if (j > 20 & j < 24) lcd_rs = 1; else j=5; end
• Code chuyển từ nhị phân sang thập phân module bin2dec ( input logic [8:0] bin_i, output logic [7:0] dec_o [2:0]
/* verilator lint_off WIDTH */ always_comb begin y = bin_i;
//hang tram temp = '0; if (y>99) begin for(int i=0;i 20 & j < 24) lcd_rs = 1; else j=5; end
• Code chuyển nhị phân sang thập phân module LCD (clk,lcd_e,lcd_rs,lcd_on,lcd_blon,data_lcd,data_i,lcd_rw);
/* verilator lint_off BLKSEQ */ input clk; input [7:0] data_i [2:0]; output reg lcd_e, lcd_rs,lcd_on,lcd_blon,lcd_rw; output reg [7:0] data_lcd; integer i = 0; integer j = 1; reg [7:0] Datas [1:23]; always @(posedge clk) begin lcd_blon = '1; lcd_on = '1; lcd_rw = '0;
Datas[1] = 8'h38; // control instruction : configure - 2 lines
Datas[2] = 8'h0C; // control instruction : Display on, cursor off
Datas[20] = 8'hC0; // control instruction : force cursor to move to 2nd Line
Datas[23] = data_i[0] + 8'h30; end always @(posedge clk) begin
71 | P a g e if (i 1000000 & i < 2000000) begin i = i + 1; lcd_e = 0; end else if (i == 2000000) begin j = j + 1; i = 0; end else i = 0;
// LCD_RS signal should be set to 0 for writing commands and to 1 for writing data if (j 5 & j < 20) lcd_rs = 1; else if (j == 20) lcd_rs = 0; else if (j > 20 & j < 24) lcd_rs = 1; else j=5; end
• Code mạch cộng song song module design_1( input clk_i,//lcd_e,lcd_rs,lcd_on,lcd_blon,lcd_rw,
72 | P a g e reg unsigned [2:0] j; always @(clk_i) begin
• Code thực hiện giải thuật module design_8 ( input unsigned [7:0] M,N, input logic clk_i, output logic lcd_e, lcd_rs,lcd_on,lcd_blon,lcd_rw, output logic [7:0] data_lcd
); logic [8:0] OUT; logic [7:0] OUT_LCD [2:0];
Cơ sở lý thuyết
Giải thuật nhân Modified Booth (Radix-4) sẽ đối chiếu 3-bit có trọng số thấp nhất của số nhân Q và ( )với bộ mã hóa và cho ra kết quả như bảng sau Sau đó tiến hành cộng biến tạm A với (0,±1,±2) x M(multiplicand) tương ứng và dịch phải toán học 2 bit
Số lần lặp lại = số bit/2
Hình 8 Mô tả giải thuật
Sơ đồ giải thuật
Hình 9 Sơ đồ giải thuật thuật toán Booth
Kết quả mô phỏng
Hình 10 Kết quả dạng sóng của giải thuật nhân Modified Booth
Code thực hiện giải thuật
A Phần chung cho tất cả các nhóm
Thiết kế mạch giải mã 74138 (đặt tên biến có bù bắng cách thêm “_n” hay “_bar” phía sau, TD: ngõ ra 𝑂7̅̅̅̅ có thể dùng danh hiệu Q7_n hay Q7_bar, dùng Q vì O dễ nhầm số 0)
Hãy viết mã SystemVerilog với các cách sau:
1) Dùng mô hình cấu trúc
2) Dùng mô hình luồng dữ liệu
4) Đánh giá tài nguyên phần cứng (xem hình minh họa bên dưới) khi thực thi trên FPGA Cyclone II EP2C35F672C6
); logic EN; logic [2:0] A_n; logic [2:0] E_n; not(A_n[0], A[0]); not(A_n[1], A[1]); not(A_n[2], A[2]); not(E_n[0], E[0]); not(E_n[1], E[1]); and(EN, E_n[0], E_n[1], E[2]); nand(Q_n[0],EN, A_n[2], A_n[1], A_n[0]); nand(Q_n[1],EN, A_n[2], A_n[1], A[0]); nand(Q_n[2],EN, A_n[2], A[1], A_n[0]); nand(Q_n[3],EN, A_n[2], A[1], A[0]); nand(Q_n[4],EN, A[2], A_n[1], A_n[0]); nand(Q_n[5],EN, A[2], A_n[1], A[0]); nand(Q_n[6],EN, A[2], A[1], A_n[0]); nand(Q_n[7],EN, A[2], A[1], A[0]); endmodule
3 | P a g e Đánh giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone II
1.2 Dùng mô hình luồng dữ liệu
Phần code module test1 ( input logic [2:0] A, input logic [2:0] E, output logic [7:0] Q_n
); logic EN; assign EN = E[0] | E[1] | ~E[2]; assign Q_n[0] = EN | A[2] | A[1] | A[0]; assign Q_n[1] = EN | A[2] | A[1] | ~A[0]; assign Q_n[2] = EN | A[2] | ~A[1] | A[0];
4 | P a g e endmodule Đánh giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone II
1.3 Dùng mô hình hành vi
Phần code module test1 ( input logic [2:0] A, input logic [2:0] E, output logic [7:0] Q_n
Q_n[k] = 0; end endmodule Đánh giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone II
2) Dùng mô hình luồng dữ liệu
3) Dùng mô hình hành vi
4) Đánh giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone II EP2C35F672C6
NỘI DUNG BÁO CÁO BÀI 2
2.1 Dùng mô hình cấu trúc
Hình 2.1 Kết quả dạng sóng
• Tổng hợp phần cứng trên FPGA
Hình 2.2 Tổng hợp phần cứng trên FPGA
Hình 2.3 Code SystemVerilog module design_a ( input [2:0] a0_i, output [1:0] y0_i); wire [6:0] w0_i ;
//tinh Y and(w0_i[0],a0_i[0],a0_i[1]); and(w0_i[1],a0_i[0],a0_i[2]); and(w0_i[2],a0_i[1],a0_i[2]); or (y0_i[1],w0_i[0],w0_i[1],w0_i[2]);
//tinh z and(w0_i[3],~a0_i[2],~a0_i[1],a0_i[0]); and(w0_i[4],~a0_i[2],a0_i[1],~a0_i[0]); and(w0_i[5],a0_i[2],a0_i[1],a0_i[0]); and(w0_i[6],a0_i[2],~a0_i[1],~a0_i[0]); or(y0_i[0],w0_i[3],w0_i[4],w0_i[5],w0_i[6]); endmodule
• Tổng hợp phần cứng trên FPGA
Hình 2.5 Tổng hợp phần cứng trên FPGA
2.3 Dùng mô hình hành vi
Hình 2.7 Kết quả dạng sóng module design_b( input [2:0] a0_i, output [1:0] y0_i); assign y0_i[1] = (a0_i[2] & a0_i[1]) | (a0_i[2] & a0_i[0]) | (a0_i[1] & a0_i[0]) ; assign y0_i[0] = (~a0_i[2] & ~a0_i[1] & a0_i[0]) | (~a0_i[2] & a0_i[1] & ~a0_i[0]) | (a0_i[2] & a0_i[1] & a0_i[0]) | (a0_i[2] & ~a0_i[1] & ~a0_i[0]); endmodule : design_b
• Tổng hợp phần cứng trên FPGA
Hình 2.8 Tổng hợp phần cứng trên FPGA
Hình 2.9 module design_c ( input [2:0] a0_i, output [1:0] y0_i); always @(a0_i[2] or a0_i[1] or a0_i[0]) begin y0_i[1] = (a0_i[2] & a0_i[1]) | (a0_i[2] & a0_i[0]) | (a0_i[1] & a0_i[0]) ; y0_i[0] = (~a0_i[2] & ~a0_i[1] & a0_i[0]) | (~a0_i[2] & a0_i[1] & ~a0_i[0]) | (a0_i[2] & a0_i[1] & a0_i[0]) | (a0_i[2] & ~a0_i[1] & ~a0_i[0]); end endmodule : design_c
10 | P a g e giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone II EP2C35F672C6
NỘI DUNG BÁO CÁO BÀI 3
// input input logic clk_i, input logic rst_n, input logic [3:0] N,
/*verilator lint_off UNUSED*/ always @(posedge clk_i) begin assert(Q >2); if((t&16'h8000)==0) begin x=t; y_tp = y_tp - 7'd32; end t=x+(x>>3); if((t&16'h8000)==0) begin
35 | P a g e x=t; y_tp = y_tp - 7'd17; end t=x+(x>>4); if((t&16'h8000)==0) begin x=t; y_tp = y_tp - 7'd9; end t=x+(x>>5); if((t&16'h8000)==0) begin x=t; y_tp = y_tp - 7'd4; end t=x+(x>>6); if((t&16'h8000)==0) begin x=t; y_tp = y_tp - 7'd2; end t=x+(x>>7); if((t&16'h8000)==0) begin x=t; y_tp = y_tp - 7'd1; end y_tp = y_tp-1; if (data == '0) begin y = '0; y_tp = '0; end if (data >= 16'h8000) begin y = 4'd15; y_tp = '0; end
//xu ly ket qua temp = 4'bxxxx;
36 | P a g e temp = temp+1; if (y9999) begin for(int i=0;i99) begin for(int i=0;i