Tải bản đầy đủ (.docx) (27 trang)

Triển khai thuật toán Cordic trên FPGA BTL môn thiết kế IC và Hệ thống số

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 (2.12 MB, 27 trang )

Mục lục

Lời nói đầu
Xu hướng của ngành công nghiệp phần cứng hiện nay là thiết kế được những
mạch có tốc độ xử lý nhanh, tính toán chính xác với diện tích mạch và công suất
ngày càng nhỏ.
Và trong môn học Thiết kế và tổng hợp IC và Hệ thống số, chúng em được giao
nhiệm vụ triển khai thuật toán CORDIC trên phần cứng. Đây thực sự là một thử
thách khá thú vị đối với bọn em trong học kỳ này. Mặc dù kinh nghiệm thiết kế hệ
thống số vẫn chưa được nhiều, tuy nhiên bọn em vẫn rất cố gắng để thực hiện thành
công.
Những sai sót trong quá trong thực hiện là khó tránh khỏi. Do đó, chúng em rất
mong nhận được những sự góp ý từ thầy và các bạn để Bài tập lớn này được hoàn
hảo hơn.

Chương 1: Tổng quan đề tài
I.

Yêu cầu đề tài

1.1 Mục tiêu
1


Thiết kế liên quan đến xử lý tín hiệu kỹ thuật số, đặc biệt là, các đơn vị số
học lượng giác và hàm mũ, hàm logarit, là một trong những yếu tố quan
trọng. Trong những năm gần đây, thư viện hiện có cho đơn vị số học như vậy
tồn tại rất được quan tâm, với việc thu nhỏ và tích hợp cao của công nghệ vi
mạch đã tiến triển, nó được sử dụng mà không quan tâm đến chi phí vận hành
và các thuật toán hoạt động. Mặt khác, để thực hiện xử lý tốc độ cao và giảm
quy mô mạch và giảm tiêu thụ điện năng trong thiết kế mạch, cần có một đơn


vị số học riêng biệt mà sẽ đưa vào chi phí tính toán và tính toán thuật toán
theo ngữ cảnh sử dụng.
Vì vậy, bài tập này là nhằm mục đích thực hiện một thiết kế phần cứng
của các đơn vị hoạt động như là một "hàm lượng giác", các hoạt động có ý
thức và thuật toán tính toán chi phí. Lý do về đối tượng của chức năng lượng
giác là để làm sâu sắc thêm sự hiểu biết kiến thức về phần cứng nhiều hơn bởi
thiết kế của hàm lượng giác là rất cơ bản, và mong muốn tiếp tục phát triển.
Ở mức 1, ta sẽ tập trung vào phương pháp CORDIC, đó là một trong những
thuật toán điểm cố định, để thiết kế các đơn vị số học của "hàm lượng giác".
Ở mức 2, không giới hạn ở phương pháp CORDIC, bằng cách sử dụng một
loạt các bảng thuật toán phương pháp tra cứu hoặc (Maclaurin mở rộng), và
nội suy mở rộng Taylor, chúng tôi thiết kế các đơn vị số học và chi phí thấp
nhất, và giảm quy mô mạch và tăng tốc độ xử lý các nhằm giảm điện năng
tiêu thụ.
1.2 Kĩ năng cần có
Để thực hiện bài tập lớn này,sinh viên cần có những kiến thức cơ bản về môn
học: các kiến thức về điện tử số, các cổng cơ bản, các mạch đồng bộ,không
đồng bộ, FSM,ASMD…
2


Ngoài ra sinh viên cần phải biết cài đặt và sử dụng một số phần mềm như:
-

Matlab: để mô phỏng thuật toán và hỗ trợ tính toán các phép toán lớn.

-

Simulink: mô phỏng thuật toán ở mức khối.


-

Quartus: Viết và tổng hợp code Verilog HDL.

-

Modelsim: Viết và chạy file testbench để test hệ thống.

-

Design compiler: Tổng hợp mạch ở mức RTL.

II.

Phân công công việc

STT
1
2
3

Công việc
Tìm hiểu yêu cầu và viết Specification
Lập kế hoạch
Thiết kế module

4

Thiết kế testbench


5

Viết code Matlab và thiết kế hệ thống Simulink

6

Tổng hợp trên Synopsys Design Compiler

Thực hiện
Cả nhóm
Trương Lê Văn
Trương Lê Văn, Nguyễn
Văn Trọng
Trương Lê Văn, Phùng
Văn Thông
Trương Lê Văn, Phùng
Văn Thông
Nguyễn Văn Trọng

III. Thuật toán Cordic

3.1 Khái niệm CORDIC
CORDIC (COordinate Rotation DIgital Computer) là phương pháp đơn giản và hiệu
quả để tính toán các hàm lượng giác và hypepol. Nó thường được dùng khi bộ nhân
3


phần cứng không khả dụng (Ví dụ: các vi xử lý đơn giản, FPGAs), và được xây dựng
từ các bộ cộng trừ, dịch bit, bảng tham chiếu.
Thuật toán CORDIC được xuất phát từ Givens Rotation Error: Reference source not

found:
 cθ
s
θ

− sθ   x   x ' 
=
cθ   y   y '

 x ' = xcθ − ysθ

 y ' = ycθ + xsθ

hay

(3.1)

Phương trình (3.1) cho thấy phép quay 1 vector trong mặt phẳng Đề-các (Cartesian
plane) đi một góc θ. Phép toán này có thể được viết lại như sau:

 x ' = cos θ . ( x − y tan θ )


 y ' = cos θ . ( y + x tan θ )

(3.2)

Nếu các góc quay được xác định sao cho tanθ = ±2-i, phép nhân với tanθ có thể được
đơn giản hóa bằng một phép dịch bit Error: Reference source not found. Một góc quay
tùy ý được thay thế bằng việc quay liên tiếp nhiều góc nhỏ. Khi đó cosθ là một hằng

số. Quá trình quay liên tiếp này được thể hiện trong Phương trình (3.3):
 xi +1 = Ki ( xi − si . yi .2− i )


−i
 yi +1 = K i ( yi + si .xi .2 )

(3.3)

Trong đó

(

)

Ki = cos tan −1 ( 2− i ) = 1

1 + 2 −2 i

si = ±1

(3.4)
(3.5)

Loại bỏ các hằng số Ki khỏi phương trình trong mỗi vòng lặp. Tích của các hằng số K i
sẽ được bổ sung vào kết quả cuối cùng. Tích này tiến tới giá trị 0.60725 khi lặp vô hạn
lần:


K =∏

i =0

1
1 + 2 −2 i

= 0.60725

(3.6)

Góc quay tổng hợp cũng được xác định từ các góc quay nhỏ tại mỗi lần lặp. Việc tính
toán góc quay này bổ sung thêm phương trình thứ 3 vào thuật toán CORDIC.
4


zi +1 = zi − si .tan −1 ( 2− i )

(3.7)

Tan-1(2-i) là hằng số, các giá trị này được lưu lại trong 1 bảng hằng số (Bảng 3.1). Trên
phần cứng, bảng này được lưu lại trong ROM.
Bảng 3.1. Hằng số Arctan

i

tan-1(2-i)

0

0.785398


1

0.463648

2

0.244979

3

0.124354

4

0.062419

5

0.031239





Hệ phương trình cho thuật toán CORDIC:
 xi +1 = xi − si yi 2− i

−i
 yi +1 = yi + si xi 2
 z = z − s tan −1 (2− i )

 i +1 i i

(3.8)

CORDIC làm việc ở 2 chế độ. Chế độ thứ nhất gọi là chế độ quay (Rotation). Trong
chế độ này, vector được quay đi một góc xác định bằng tham số đầu vào. Chế độ thứ
hai là chế độ vector (Vectoring). Vector được quay về trục x (hay nói cách khác, y bị
triệt tiêu) đồng thời ghi lại góc quay được.

3.2 Chi tiết thuật toán
3.2.1 Chế độ quay

5


Chọn tọa độ điểm khởi tạo x(0), y(0) = 0; z(0) = 0

= K n x0 cos θ

xn = Rn cos zn = 1 + δ 02 1 + δ12 ... 1 + δ n2−1 x0 cos θ
yn = Rn sin zn = 1 + δ 02 1 + δ12 ... 1 + δ n2−1 x0 sin θ

= K n x0 sin θ

Trong đó :

Kết quả cuối cùng :

6



Để đơn giản hóa chúng ta sẽ chọn và sao cho .

3.3 Sơ đồ thuật toán Cordic

7


IV. Quy trình thiết kế

Quy trình thiết kế ASIC được chia làm hai phần là Front-end và Back-end.
Front-end bao gồm các bước không phụ thuộc công nghệ chế tạo, là quá trình
thiết kế và kiểm thử chức năng thiết kế. Chúng ta có thể sử dụng những dữ liệu
của phần này cho nhiều công nghệ chế tạo khác nhau mà không ảnh hưởng đến
sản phẩm cuối cùng. Còn Back-end gồm các bước thực hiện dựa trên công nghệ
chế tạo.
8


Chương 2: Thực hiện đề tài
I. Đặc tả kỹ thuật (Specification)
Sơ đồ hệ thống:

Chức năng: Khi nhập vào một góc, khối CORDIC thực hiện tính toán và cho đầu ra là
SINE và COSINE của góc đó.
Các cổng vào ra:
Cổng

Độ rộng bit


Angle
X_start
Y_start
Clock
Reset
Ready
COSout
SINout

16
16
16
1
1
1
16
16

Cổng Vào/
Cổng Ra
input
input
input
input
input
input
output
output

Miêu tả

Góc cần tính
Giá trị X0 ban đầu
Giá trị Y0 ban đầu
Chu kì xung nhịp
Reset
Thực hiện tính toán xong
Cosin cần tính
Sine cần tính
9


Mã hóa tín hiệu: mã hóa dạng fix-point
Bitlengh
Bít phần nguyên [I]
1

Bít dấu [S]
1
• Sign bit: Số bít dấu
• Integer bit: Số bit mã hóa phần nguyên
• Fraction part: Số bit mã hóa phần thập phân
• Ví dụ:

Bít phần thập phân [F]
14

SI F
0001101000010101
Chỉ tiêu phi chức năng:
Tỷ lệ lỗi: 2.4%

Tốc độ: 100 Mhz
Diện tích cell: 6000

II. Thực hiện và kết quả Mô phỏng
4.1. Mô phỏng bằng Matlab

10


Figure 1 Code trên Matlab

Đầu tiên chúng ta sẽ thư mô phỏng thuật toán bằng phần mềm matlab.
Chạy thử với một số trường hợp ta thấy kết quả có độ chính xác rất cao :

Figure 2 Sin(60)

11


Figure 3 Cos(60)

Figure 4 Sin(55)

12


Sau khoảng 40 lần lặp ta thu được sin và cos của góc nhập vào là gần như chính xác
100%

Figure 5 Cos(55)


4.2. Mô phỏng bằng simulink
Sơ đồ khối thuật toán trên simulink:

13


Khối Pre rotation:

Khối Input Mux

14


Khối cộng trừ X,Y,Z:

15


Kết quả mô phỏng cho Sin 60:

16


4.3. Code verilog, mô phỏng trên modelsim và chạy kết quả thu được
trên Matlab
Sau khi đã mô phỏng và đạt kết quả tốt trên matlab và simulink, ta chuyển qua tiến
hành bước viết code trên Verilog trên Quartus,sau đó mô phỏng bằng file testbench
trên Modelsim . Có nhiều cách để kiểm tra kết quả, nhóm em sẽ chọn cách xuất kết quả
ra file và so sánh với kết quả đúng bằng việc vẽ biểu đồ trên matlab.

Đây là kết quả tổng hợp được trên modelsim khi cho đầu vào từ là các góc từ 1 đến
360 độ :

17


Các đầu ra của sin và cos được lưu lại trong file “output.txt” sau đó được so sánh với
kết quả đúng bằng Matlab. Đây là kết quả mô phỏng so sánh :

4.4 Tổng hợp mạch.
4.4.1 Tổng hợp mạch bằng quartus:
18


RTL Viewer:

4.4.2. Tổng hợp mạch bằng Synopsys :

Figure 6 Mạch sau khi chọn Check Design

19


Figure 7 Mạch sau khi chọn Compile Design

Figure 8 Mạch sau khi chọn Compile Ultra

20



Figure 9 Report Timing

Figure 10 Report Area

Area report: 5934 total cell define

Kết luận
Mặc dù còn gặp nhiều khó khăn trong quá trình thiết kế, tuy nhiên bọn em cũng tiếp
thu thêm được nhiều kiến thức bổ ích, đặc biệt là có thể tự thiết kế một hệ thống theo

21


đúng quy trình, từ bước phân tích yêu cầu, thiết kế đặc tả kỹ thuật, thiết kế các khối,
mô phỏng và tổng hợp ra mạch
Cuối cùng, bọn em xin gửi lời cám ơn chân thành đến Tiến Sĩ Nguyễn Đức Minh đã
nhiệt tình giúp đỡ bọn em hoàn thành Bài tập lớn này.

Tài liệu tham khảo
1. />2. />3. />e/dirk/Lecture_cordic.pdf
4. />
Phụ lục
Địa chỉ thư mục chứa các file code của bọn em: />id=0B3aQsZMR4kuSbHBaNEJMOGRYU0E&usp=sharing
Code Verilog:
//CORDIC METHOD

module CORDIC(clock, cosine, sine, x_start, y_start, angle);

parameter width = 16;


// Inputs
input clock;
input signed [width-1:0] x_start,y_start;
input signed [15:0] angle;
22


// Outputs
output signed [width-1:0] sine, cosine;// size of sine and cosine is 1 bit larger due to a
system gain of 1.647

// Generate table of atan values
wire signed [31:0] atan_table [0:30];

assign atan_table[00] = 16'b0010000000000000; // 45.000 degrees -> atan(2^0)
assign atan_table[01] = 16'b0001001011100100; // 26.565 degrees -> atan(2^-1)
assign atan_table[02] = 16'b0000100111111011; // 14.036 degrees -> atan(2^-2)
assign atan_table[03] = 16'b0000010100010001; // atan(2^-3)
assign atan_table[04] = 16'b0000001010001011;
assign atan_table[05] = 16'b0000000101000101;
assign atan_table[06] = 16'b0000000010100010;
assign atan_table[07] = 16'b0000000001010001;
assign atan_table[08] = 16'b0000000000101000;
assign atan_table[09] = 16'b0000000000010100;
assign atan_table[10] = 16'b0000000000001010;
assign atan_table[11] = 16'b0000000000000101;
assign atan_table[12] = 16'b0000000000000010;
assign atan_table[13] = 16'b0000000000000001;
assign atan_table[14] = 16'b0000000000000000;
assign atan_table[15] = 16'b0000000000000000;

assign atan_table[16] = 16'b0000000000000000;
assign atan_table[17] = 16'b0000000000000000;
assign atan_table[18] = 16'b0000000000000000;
23


assign atan_table[19] = 16'b0000000000000000;
assign atan_table[20] = 16'b0000000000000000;
assign atan_table[21] = 16'b0000000000000000;
assign atan_table[22] = 16'b0000000000000000;
assign atan_table[23] = 16'b0000000000000000;
assign atan_table[24] = 16'b0000000000000000;
assign atan_table[25] = 16'b0000000000000000;
assign atan_table[26] = 16'b0000000000000000;
assign atan_table[27] = 16'b0000000000000000;
assign atan_table[28] = 16'b0000000000000000;
assign atan_table[29] = 16'b0000000000000000; // atan(2^-29)
assign atan_table[30] = 16'b0000000000000000;

reg signed [width-1:0] x [0:width-1];
reg signed [width-1:0] y [0:width-1];
reg signed [15:0] z [0:width-1];

// make sure rotation angle is in -pi/2 to pi/2 range
wire [1:0] quadrant;
assign quadrant = angle[15:14];

always @(posedge clock)
begin // make sure the rotation angle is in the -pi/2 to pi/2 range
case(quadrant)

2'b00,
2'b11: // no changes needed for these quadrants
24


begin
x[0] <= x_start;
y[0] <= y_start;
z[0] <= angle;
end

2'b01:
begin
x[0] <= -y_start;
y[0] <= x_start;
z[0] <= {2'b00,angle[13:0]}; // subtract pi/2 for angle in this quadrant
end

2'b10:
begin
x[0] <= y_start;
y[0] <= -x_start;
z[0] <= {2'b11,angle[13:0]}; // add pi/2 to angles in this quadrant
end
endcase
end

// run through iterations( lap theo so bit-16 bit lap 16 lan)
genvar i;


generate
25


×