Tải bản đầy đủ (.pdf) (118 trang)

báo cáo bài tập lớn xử lí tín hiệu số với fpga

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (3.27 MB, 118 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>XỬ LÍ TÍN HIỆU SỐ VỚI FPGA </b>

<b>Giảng viên hướng dẫn: Trịnh Vũ Đăng Nguyên Lớp: L01 </b>

<b>Nhóm: 10 Thực hiện bởi: </b>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<b>2.2. Dùng mơ hình luồng dữ liệu. ... 8</b>

<b>2.3. Dùng mơ hình hành vi. ... 8</b>

<b>Bài 3: ... 10</b>

<b>Bài 4: ... 15</b>

<b>4.1. Máy trạng thái Moore. ... 15</b>

<b>4.2. Máy trạng thái Mealy. ... 18</b>

<b>8.2. Cộng nối tiếp từng bit: ... 59</b>

<b>8.3. Cộng song song bit ... 65</b>

<b>Bài 9: ... 74</b>

<b>9.1. Cơ sở lý thuyết. ... 74</b>

<b>9.2. Sơ đồ giải thuật. ... 74</b>

<b>9.3. Kết quả mô phỏng. ... 75</b>

<b>9.4. Đánh giá tài nguyên phần cứng trên Cyclone II EP2C35F672C6. ... 75</b>

<b>9.5. Code thực hiện giải thuật. ... 76</b>

<b>Bài 10: ... 84</b>

<b>Bài 11 ... 94</b>

<b>B. Phần riêng cho từng nhóm. ... 106</b>

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

<b>A. Phần chung cho tất cả các nhóm </b>

Bài 1:

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.

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

output logic [7:0] Q_n );

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

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

<b>Đánh giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone II EP2C35F672C6. </b>

<b>Waveform </b>

<b>1.2. Dùng mơ hình luồng dữ liệu. Phần code </b>

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];

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

module test1 ( input logic [2:0] A, input logic [2:0] E,

output logic [7:0] Q_n );

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

integer k;

always @(A or E) begin

Q_n = 8'b1111_1111; if (E == 3'b100)

for ( k = 0; k < 8; k = k +1) if (k == A)

Q_n[k] = 0; end

endmodule

<b>Đánh giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone II EP2C35F672C6. </b>

<b>Waveform </b>

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

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

<b>NỘI DUNG BÁO CÁO BÀI 2 </b>

Lập bìa Karnaugh • Với Y1

Hình 2.1 Kết quả dạng sóng

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

<b>• Tổng hợp phần cứng trên FPGA </b>

Hình 2.2 Tổng hợp phần cứng trên FPGA

<b>• Code </b>

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

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

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

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

<b>• Tổng hợp phần cứng trên FPGA </b>

Hình 2.8 Tổng hợp phần cứng trên FPGA

<b>• Code </b>

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

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone II EP2C35F672C6

<b>NỘI DUNG BÁO CÁO BÀI 3 </b>

<b> Phần code </b>

module design_3 ( // input

input logic clk_i, input logic rst_n, input logic [3:0] N, // output

output logic [6:0] led_o );

// local declaration logic [3:0] Q;

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

counter counter0 ( .clk_i (clk_i), .rst_n (rst_n), .N (N), .Q (Q) );

hexled hexled0 ( .data_i(Q), .hex_o (led_o) );

`ifdef VERILATOR

/*verilator lint_off UNUSED*/ always @(posedge clk_i) begin

assert(Q <= N); end

/*verilator lint_on UNUSED*/ `endif

endmodule : design_3

module counter (

input logic [3:0] N, input logic rst_n,clk_i, output logic [3:0] Q );

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

else

Q <= Q + 4'b1; end

endmodule: counter module hexled ( // input

input logic [3:0] data_i, // output

output logic [6:0] hex_o );

always_comb begin : proc_7seg_decoder case (data_i)

4'h0: hex_o = 7'b100_0000; 4'h1: hex_o = 7'b111_1001; 4'h2: hex_o = 7'b010_0100; 4'h3: hex_o = 7'b011_0000; 4'h4: hex_o = 7'b001_1001; 4'h5: hex_o = 7'b001_0010; 4'h6: hex_o = 7'b000_0010; 4'h7: hex_o = 7'b101_1000; 4'h8: hex_o = 7'b000_0000; 4'h9: hex_o = 7'b001_1000; 4'ha: hex_o = 7'b000_1000; 4'hb: hex_o = 7'b000_0011;

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

4'hc: hex_o = 7'b100_0110; 4'hd: hex_o = 7'b010_0001; 4'he: hex_o = 7'b000_0110; 4'hf: hex_o = 7'b000_1110; endcase

end

endmodule : hexled module wrapper ( // input

input logic CLOCK_50, input logic [4:0] SW, // output

output logic [6:0] HEX0 );

design_3 dut (

.clk_i (CLOCK_50), .rst_n (SW[4]), .N (SW[3:0] ), .led_o (HEX0 ) );

endmodule : wrapper

<b> </b>

<b> Đánh giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone II EP2C35F672C6 </b>

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

<b>Waveform </b>

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

c) Đánh giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone II EP2C35F672C6.

<b>NỘI DUNG BÁO CÁO BÀI 4 4.1. Máy trạng thái Moore. </b>

typedef enum logic [1:0]{ S0 = 2'b00,

S1 = 2'b01, S2 = 2'b10,

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

always_comb begin case (y)

S0: if (w) ctn_y = S1; else ctn_y = S0; S1: if (w) ctn_y = S1; else ctn_y = S2; S2: if (w) ctn_y = S3; else ctn_y = S0; S3: if (w) ctn_y = S1; else ctn_y = S2; default: ctn_y = S0;

endcase

// Define output

z = ((y == S3)&(w==0)); end

// Define the sequential block

always_ff @(negedge rstn or posedge clk_i) if (rstn == 0) y <= S0;

else y <= ctn_y;

`ifdef VERILATOR

/*verilator lint_off UNUSED*/ always @(posedge clk_i) begin assert(z <= ((y == S3)&(w==0)));

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

end

/*verilator lint_on UNUSED*/ `endif

endmodule module top(

input logic clk_i, input logic rstn, input logic w, output logic z );

design_4 dut( .clk_i (clk_i), .rstn (rstn), .w (w), .z (z) );

endmodule: top module wrapper (

input logic KEY[0], input logic [1:0] SW, output logic LEDR[0] );

design_4 dut(

.clk_i (KEY[0]), .rstn (SW[1]), .w (SW[0]), .z (LEDR[0]) );

endmodule

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

<b>Đánh giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone II EP2C35F672C6 </b>

<b>4.2. Máy trạng thái Mealy. - Lý thuyết </b>

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

<b>- Phần code </b>

module design_4 ( input logic clk_i, rstn, w, output logic z);

typedef enum logic [1:0]{ S0 = 2'b00,

S1 = 2'b01, S2 = 2'b10, S3 = 2'b11 } state;

endcase

// Define output

z = ((y == S3)&(w==0)); end

// Define the sequential block

</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">

always @(posedge clk_i) begin assert(z <= ((y == S3)&(w==0))); end

/*verilator lint_on UNUSED*/ `endif

endmodule module top(

input logic clk_i, input logic rstn, input logic w, output logic z );

design_4 dut( .clk_i (clk_i), .rstn (rstn), .w (w), .z (z) );

endmodule : top module wrapper (

input logic KEY[0], input logic [1:0] SW, output logic LEDR[0] );

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

design_4 dut(

.clk_i (KEY[0]), .rstn (SW[1]), .w (SW[0]), .z (LEDR[0]) );

endmodule

<b>Waveform </b>

<b>Đánh giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone II EP2C35F672C6 </b>

</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">

<b>Lưu ý: </b>

<i>• Thực thi hệ thống trên với n = 10 </i>

• Các ngõ vào I0, I1,…, In-1 là các số nhị phân 4 bit khơng dấu.

<i>• 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 </i>

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 SystemVerilog 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 trên FPGA Cyclone II EP2C35F672C6

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

<b> NỘI DUNG BÁO CÁO CÂU 5 </b>

o 2 giải thuật thực thi:

<b>5.1. Giải thuật thứ nhất. </b>

• Sơ đồ khối

• Giải thích chi tiết

1. Gán cho biến temp_min1 = temp_min2 = 1111 (giá trị lớn nhất có thể của số nhị phân 4 bit)

</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">

temp_min2 = temp_min1; j=i;

Sau đó quay lại bước 2

• Nếu array[i] > temp_min1 thì so array[i] < temp_min2 và array[i] khác temp_min1 thì gán temp_min2 = array[i]. Sau đó quay lại bước 2

<b>• Phần code </b>

module design_1 (

input [3:0] array [9:0], output reg [3:0] min1, output reg [3:0] min2, output [3:0] index_m1 );

reg [3:0] i,j;

reg [3:0] temp_min1, temp_min2;

always_latch begin

temp_min1 = {4'b1111}; temp_min2 = {4'b1111};

for (i=0; i<10; i = i +1) begin

if (array[i] < temp_min1)

</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">

<b>• Kết quả mơ phỏng </b>

<b>5.2. Giải thuật thứ hai. </b>

• Sơ đồ khối

temp_min2 = temp_min1;

temp_min1 = array[i]; j = i;

end

else if (array[i] < temp_min2 && array[i] != temp_min1) begin

temp_min2 = array[i]; end

end

min1 = temp_min1; min2 = temp_min2; index_m1 =j;

end

endmodule : design_1

</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29">

• Cách giải chi tiết

<b>1. Gán cho biến temp_min1 = temp_min2 = 1111 (giá trị lớn nhất có thể của </b>

</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30">

<b>• Kết quả mô phỏng </b>

module design_2(

input logic [3:0] array [9:0], output logic [3:0] min1, output logic [3:0] min2, output logic [3:0] index_m1 );

reg [3:0] i; always_latch

begin

min1 = {4'b1111}; min2 = {4'b1111}; for (i =0;i<10; i++)

if (array[i] <min1) begin

min1 = array[i]; index_m1 = i; end

for (i =0;i<10; i++)

if (array[i]<min2 && array[i] != min1) begin

min2 = array[i]; end

end

endmodule : design_2

</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32">

<b>Bài 6: </b>

Tìm hiểu ít nhất 1 giải thuật và viết code SystemVerilog tính gần đúng giá trị log

<small>2</small>

(x),

<b>với x là số 16 bit không dấu. </b>

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 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.

<b>NỘI DUNG BÁO CÁO BÀI 6 6.1. Tính chất của log. </b>

log(𝑥) = log(𝑧. 𝑥) − log (𝑧) Đặt: 𝑧 = 2<small>−𝑗</small>

Ta có: log<sub>2</sub>(𝑧) = log<sub>2</sub>(2<small>−𝑗</small>) = −𝑗

Áp dụng tính chất trên: log<sub>2</sub>(𝑥) = log<sub>2</sub>(2<small>−𝑗</small>. 𝑥) + 𝑗 Phân tích 2<small>−𝑗</small>. 𝑥 = 𝑥. ∏<sup>𝑛</sup><sub>𝑖=𝑚</sub>𝑏<sub>𝑖</sub> = 1

➔ log<sub>2</sub>(𝑥) = 𝑗 Sơ đồ giải thuật

</div><span class="text_page_counter">Trang 33</span><div class="page_container" data-page="33">

<b>- Phần code </b>

<b> module design_6 ( </b>

input logic clk_i,

input logic [15:0] data_log,

output logic lcd_e,lcd_rs,lcd_on,lcd_blon,lcd_rw, output logic [7:0] data

);

logic [7:0] data_i [3:0];

log_2 log_2( .data(data_log),

</div><span class="text_page_counter">Trang 34</span><div class="page_container" data-page="34">

.result(data_i) );

LCD LCD ( .clk_i(clk_i), .lcd_e(lcd_e), .lcd_rs(lcd_rs), .lcd_on(lcd_on), .lcd_blon(lcd_blon), .lcd_rw(lcd_rw), .data(data), .data_i(data_i) );

reg [7:0] Datas [1:25];

always @(posedge clk_i) 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 --

</div><span class="text_page_counter">Trang 35</span><div class="page_container" data-page="35">

Datas[8] <= 8'h67; //-- g -- Datas[9] <= 8'h32; //-- 2 -- Datas[10] <= 8'h28; //-- ( -- Datas[11] <= 8'h58; //-- X -- Datas[12] <= 8'h29; //-- ) -- Datas[13] <= 8'h3D; //-- = --

Datas[14] <= data_i[0] + 8'h30; Datas[15] <= data_i[1] + 8'h30; Datas[16] <= 8'h2E; //-- . -- Datas[17] <= data_i[2] + 8'h30; Datas[18] <= data_i[3] + 8'h30;

Datas[19] <= 8'h21; //-- ! -- Datas[20] <= 8'h21; //-- ! -- Datas[21] <= 8'h21; //-- ! --

Datas[22] <= 8'hC0; //-- control instruction : force cursor to move to 2nd Line -- end

always @(posedge clk_i) begin

//-- Delay for writing data

if (i <= 1000000) begin

</div><span class="text_page_counter">Trang 36</span><div class="page_container" data-page="36">

i <= i + 1; lcd_e <= 1; data <= Datas[j]; end

else 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 ) lcd_rs <= 0;

else if (j > 5 & j< 22) lcd_rs <= 1; else if (j == 22) lcd_rs <= 0;

else if (j > 22) begin lcd_rs <= 1; j <= 5; end

endmodule

module log_2(

input logic [15:0] data, output logic [7:0] result [3:0] );

logic [3:0] y; logic [3:0] temp; logic [6:0] y_tp;

</div><span class="text_page_counter">Trang 37</span><div class="page_container" data-page="37">

if(x<16'h0080) begin x= x<< 8; y = y - 4'd8; end if(x<16'h0800) begin x= x<< 4; y = y - 4'd4; end if(x<16'h2000) begin x= x<< 2;

y = y - 4'd2; end if(x<16'h4000) begin x= x<< 1;

y = y - 4'd1; end // ket qua thap phan y_tp = 7'd100; t=x+(x>>1);

if((t&16'h8000)==0) begin x=t;

y_tp = y_tp - 7'd58; end t=x+(x>>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

</div><span class="text_page_counter">Trang 38</span><div class="page_container" data-page="38">

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;

</div><span class="text_page_counter">Trang 39</span><div class="page_container" data-page="39">

if (y<9) break; end

result[0] = temp; result[1] = y; end

else begin result[0] = 0; result[1] = y; end

temp = '0;

if (y_tp>9) begin

for(int i=0;i<10;i++) begin y_tp = y_tp - 10; temp = temp+1; if (y_tp<9) break; end

result[2] = temp; result[3] = y_tp; end

else begin result[2] = 0; result[3] = y_tp; end

</div><span class="text_page_counter">Trang 40</span><div class="page_container" data-page="40">

/* verilator lint_off WIDTH */

end

endmodule

module top

input logic clk_i,

input logic [15:0] data_log,

output logic lcd_e,lcd_rs,lcd_on,lcd_blon,lcd_rw, output logic [7:0] data

);

design_6 dut( .clk_i(clk_i), .lcd_e(lcd_e), .lcd_rs(lcd_rs), .lcd_on(lcd_on), .lcd_blon(lcd_blon), .lcd_rw(lcd_rw), .data_log(data_log), .data(data)

);

endmodule

module wrapper_6 ( // input

input logic CLOCK_50, input logic [15:0] SW, // output

</div><span class="text_page_counter">Trang 41</span><div class="page_container" data-page="41">

.lcd_e(LCD_EN), .lcd_rs(LCD_RS), .lcd_on(LCD_ON), .lcd_blon(LCD_BLON), .lcd_rw(LCD_RW), .data(LCD_DATA) );

endmodule

<b>Waveform </b>

</div><span class="text_page_counter">Trang 42</span><div class="page_container" data-page="42">

<b>6.2. Dùng Matlab để tính sai số của log2(x) - Phần code </b>

function log2_x_approx = bit_log2(x)

% Giải thuật phân tích bit để tính gần đúng giá trị log2(x)

% Tìm số bit của x n = length(dec2bin(x));

% Sử dụng phương pháp tìm kiếm nhị phân để tìm bit 1 đầu tiên của x start = 1;

stop = n;

while start < stop

mid = floor((start + stop)/2);

if bitand(x, bitshift(uint16(1), mid-1)) == 0 start = mid + 1;

else

stop = mid;

</div><span class="text_page_counter">Trang 43</span><div class="page_container" data-page="43">

<b>Test các trường hợp trong Waveform </b>

</div><span class="text_page_counter">Trang 45</span><div class="page_container" data-page="45">

<i><b>Thực hiện tính sai số của log<small>2</small>(x) </b></i>

</div><span class="text_page_counter">Trang 46</span><div class="page_container" data-page="46">

2. Đánh giá tài nguyên phần cứng khi thực thi trên FPGA Cyclone II EP2C35F672C6.

<b>NỘI DUNG BÁO CÁO BÀI 7 Lý thuyết: </b>

➢ Giải thuật bộ nhân:

Giải thuật dịch bit cho bộ nhân là một giải thuật được sử dụng trong các bộ nhân số học. Giải thuật này được sử dụng để thực hiện phép nhân hai số nguyên bằng cách sử dụng các phép cộng và dịch bit. Khi thực hiện phép nhân hai số nguyên, ta sẽ chia số nhỏ hơn thành các bit riêng lẻ và thực hiện phép nhân với từng bit đó. Sau đó, ta sẽ cộng tất cả các kết quả lại với nhau để có được kết quả cuối cùng của phép nhân.

Lưu đồ giải thuật:

</div>

×