MẠCH NHÂN VÀ MẠCH THUẬT TOÁN CORDIC MẠCH NHÂN VÀ MẠCH THUẬT TOÁN CORDIC | LINH QUÂN HOÀNG ĐẠI HỌC QUỐC GIA TPHCM TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN KHOA ĐIỆN TỬ VIỄN THÔNG BỘ MÔN ĐIỆN TỬ Môn học THIẾT K.
ĐẠI HỌC QUỐC GIA TPHCM TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN KHOA ĐIỆN TỬ VIỄN THÔNG BỘ MÔN ĐIỆN TỬ Môn học: THIẾT KẾ VI MẠCH SỐ VÀ LÕI IP Đề tài: MẠCH NHÂN VÀ MẠCH THUẬT TOÁN CORDIC Lê Hoàng Long 19200016 TPHCM, ngày tháng 10 năm 2022 MẠCH NHÂN VÀ MẠCH THUẬT TOÁN CORDIC | LINH QUÂN HOÀNG MỤC LỤC I MỞ ĐẦU A Giới thiệu đề tài B Nguyên lý thiết kế chip C Tìm hiểu ngơn ngữ verilog .5 II MẠCH NHÂN A Mạch nhân dạng dải (Array Multiplier) B Mạch nhân Vedic 10 C Mạch nhân dùng thuật toán Booth (Booth multiplier) 15 D So sánh mạch nhân 18 Booth Vedic 18 Array, Booth Vedic .20 II MẠCH THUẬT TOÁN CORDIC .22 A Đặt vấn đề 22 B Cơ sở toán học thuật toán CORDIC 23 C Thuật toán CORDIC đưa seminar 24 D Thi hành thuật tốn CORDIC Verilog (mơ tả mức behavior) .28 Thuật toán CORDIC đồng 28 Thuật toán CORDIC bất đồng .30 K20-DT | MẠCH NHÂN VÀ MẠCH THUẬT TỐN CORDIC | LINH QN HỒNG Mạch CORDIC đồng có pipeline 33 IV ĐÁNH GIÁ THÀNH VIÊN 34 V TÀI LIỆU THAM KHẢO 35 K20-DT | MẠCH NHÂN VÀ MẠCH THUẬT TỐN CORDIC | LINH QN HỒNG MẠCH NHÂN VÀ MẠCH THUẬT TOÁN CORDIC I MỞ ĐẦU A Giới thiệu đề tài Trong việc tính tốn máy tính, phép tính thường sử dụng phép tính cộng, trừ, nhân, chia Trong báo cáo ta tìm hiểu phân tích loại thuật toán nhân CORDIC B Nguyên lý thiết kế chip Nguyên lý thiết kế chip ICs số thường dựa trình “Basic platform development flow” Tổng quan nguyên lý thiết kế Chip Khi thực thiết kế ta cần phân tích, xác định đặc tính kỹ thuật IC số cách tìm hiểu xu hướng thị trường, yêu cầu khách hàng Từ đưa K20-DT | MẠCH NHÂN VÀ MẠCH THUẬT TỐN CORDIC | LINH QN HỒNG đặc trưng (spec) hệ thống, thông số kỹ thuật: hoạt động hệ thống (performance), tiêu hao lượng (power dissipation), độ tin cậy, giá cả… Trong trình thiết kế ta cần quan tâm: – Tối ưu hóa hệ thống: rút gọn phần dư, mơ tả khơng cần thiết – Cần phân tích để tránh tình huống, yếu tố làm thay đổi hệ thống Ví dụ: cấu trúc khối, phân tầng thiết kế, chiều dài dây nối, … làm thay đổi tần số hoạt động tối đa, công suất tiêu tán chip… Về mặt kỹ thuật ta cần quan tâm đến spec, thông số kỹ thuật khác: tần số hoạt động, kích thước, cơng nghệ chế tạo Các hệ thống lớn thường xây dựng lên cách kế thừa hệ thống nhỏ có sẵn Kết hợp phát triển hệ thống nhỏ để có hệ thống lớn Tập hợp hệ thống nhỏ lưu giữ thư viện Đây trình hình thành thư viện thiết kế (các library cell) Ngồi library cell, cịn cần có thêm thư viện công nghệ, luật, quy tắc thiết kế,… C Tìm hiểu ngơn ngữ verilog Verilog HDL ngơn ngữ mơ tả phần cứng đa mục đích dễ học dễ sử dụng Nó có cấu trúc đơn giản tương tự ngơn ngữ lập trình C Đối với người thiết kế có kinh nghiệm lập trình với ngơn ngữ C thấy dễ dàng học Verilog Verilog cho phép người thiết kế mô tả thiết kế nhiều cấp độ: mô tả hành vi, mô tả luồng liệu, mô tả mức cổng, ghi kết hợp mức Do người thiết kế cần học ngơn ngữ cho nhiều loại thiết kế khác Hầu hết công cụ tổng hợp hỗ trợ ngôn ngữ Verilog Do đó, Verilog ngày trở nên phổ biến lựa chọn nhà thiết kế Tất nhà sản xuất cung cấp thư viện VerilogHDL để tổng hợp cho thiết kế Nên việc sử dụng Verilog cho phép lựa chọn nhà sản xuất K20-DT | MẠCH NHÂN VÀ MẠCH THUẬT TỐN CORDIC | LINH QN HỒNG Phương pháp thiết kế Để dễ cho việc thiết kế người ta thường chia nhỏ công việc để giải Sau chia nhỏ cơng việc cho thiết kế người ta thực thiết kế theo phương pháp từ xuống (top-down) từ lên (bottom-up) Top-down phương pháp thiết kế thực thiết kế khối top trước thiết kế khối chính, cuối thiết kế khối cell (leaf cell) Topdown design đòi hỏi người thiết kế cẩn thận tuân thủ chặt nguyên tắc thiết kế Các module gọi chưa thiết kế Mô tả phương pháp thiết kế Top-down Bottom-up phương pháp thiết kế mà ta xây dựng khối nhỏ trước Sau khối thiết kế lớn xây dựng từ khối thiết kế nhỏ Từng bước xây dựng lên khối cao xây dựng lên top module K20-DT | MẠCH NHÂN VÀ MẠCH THUẬT TOÁN CORDIC | LINH QN HỒNG Mơ tả việc thiết kế Bottom-up Các mức mơ tả Logic Trong Verilog ta có nhiều cấp độ mô tả: Mô tả mức trạng thái (hành vi) Mô tả mức luồng liệu Mô tả mức cổng Mô tả mức Switch Verilog cho phép người thiết kế kết hợp bốn mức mô tả module Trong Verilog khối mô tả gọi module Trong module ta gọi thể module thấp Verilog HDL : Là ngôn ngữ để thiết kế hệ thống có CPU.Các khối (module) chức HLD thực song song, tùy vào người lập trình K20-DT | MẠCH NHÂN VÀ MẠCH THUẬT TOÁN CORDIC | LINH QUÂN HOÀNG II MẠCH NHÂN A Mạch nhân dạng dải (Array Multiplier) Mạch nhân dạng dải sử dụng đầu vào AND logic cho việc tạo tích riêng phần Mạch nhân dạng dải hoạt động tốn hạng số khơng dấu Những ưu điểm có sau: Chỉ sử dụng cổng AND lối vào cho PPG thực hóa CMOS logic, sử dụng transistor, diện tích nhỏ cơng suất tiêu thụ thấp Độ trễ so sánh với mạch dạng dải có kích thước nhỏ với hệ số MBE Nhược điểm độ trễ tăng lên mạch nhân dạng dải thiết kế cho mạch nhân nhiều số bit Mạch nhân dạng dải 4x4 bit K20-DT | MẠCH NHÂN VÀ MẠCH THUẬT TOÁN CORDIC | LINH QN HỒNG Hình cho thấy tích riêng phần mạch nhân dạng dải 8x8 bit có dấu Nó sử dụng AND lối vào cho PPG Mạch nhân dạng dải loại hoạt động số hạng có dấu khơng hoạt động số hạng không dấu Đối với mạch nhân loại này, cần có tín hiệu điều khiển sửa đổi để thực hiên phép nhân khơng dấu có dấu Kết mơ Mạch nhân dạng dải 4x4 B Mạch nhân Vedic Toán học Vedic tên đặt cho hệ thống toán học cổ đại Ấn Độ tái khám phá vào đầu kỷ XX từ tác phẩm điêu khắc Ấn Độ cổ đại (Vedas) K20-DT | MẠCH NHÂN VÀ MẠCH THUẬT TOÁN CORDIC | LINH QUÂN HỒNG Tốn học Vedic có kỹ thuật tính tốn độc đáo dựa 16 kinh điển (Sutras) Với mạch nhân tốc độ cao 8x8 bit sử dụng kiến trúc Vedic, hồn tồn khác với phương pháp nhân giống thơng thường cộng dịch Hơn nữa, mã hóa Verilog HDL Urdhva tiryakbhyam Sutra cho phép nhân 8x8 bit triển khai FPGA chúng công cụ Xilinx Synthesis Tool kit Spartan thực đầu hiển thị Spartan LED Cấu trúc đường ống (Pipeline) dựa thuật tốn hình học khơng đổi FFT số logarit 2, sử dụng số nhân phức tạp log2N có khả tính tốn điểm FFT đầy đủ N/2 chu kì clock, đề xuất J Choi V.Boriakoff Tuy nhiên, kiến trúc đòi hỏi lượng lớn thành phần trễ (kích thước nhớ mẫu N.log2N) chế chuyển đổi phức tạp cho việc định tuyến liệu Urdhva - Triyakbhyam công thức chung áp dụng cho tất trường hợp nhân việc chia số lớn cho số lớn khác Nó có nghĩa theo chiều dọc chéo Mạch nhân 2x2 bit K20-DT | 10 MẠCH NHÂN VÀ MẠCH THUẬT TỐN CORDIC | LINH QN HỒNG độ, ta thấy Vedic nhanh Booth Array chậm so với mạch Về diện tích, Booth to Vedic nhỏ III MẠCH THUẬT TOÁN CORDIC A Đặt vấn đề Các ứng dụng truyền thông phép điều biến, giải điều biến, ứng dụng lọc số chuyển đếm xuống (Digital Down Converter – DDC), ứng dụng tạo dao động số (Numerically Controlled Oscillator - NCO), ln địi hỏi phận tạo giá trị sin cosin góc để vận hành tính Ngay từ đời đầu kỷ nguyên máy tính, người ta ứng dụng sở phương pháp tính để tạo giá trị sin cosin góc tảng software, nhiên số lượng mã lệnh để xử lý cho kết sin,cos kể từ lúc cho vào input lớn, dẫn đến thời gian đáp ứng lâu Nếu muốn khắc phục tình hình, người ta thay xử lý có tốc độ nhanh hơn, nhiên tốc độ CPU có cao gấp 2, gấp chi phí đắt chưa đủ nhanh, chưa nói đến tác động việc tăng tốc độ xử lý mà số lượng mã lệnh lượng tiêu thụ tăng lên, tuổi thọ dễ bị giảm, cần chế làm lạnh chip phức tạp Biết hạn chế đó, người ta đưa thuật toán thi hành mạch điện cứng thuật tốn tìm sin, cosin, lại có xuất phép tính nhân chia, nên dù phương án tối ưu phương án software nhiều, tốc độ cịn giới hạn, đòi hỏi việc cải thiên K20-DT | 21 MẠCH NHÂN VÀ MẠCH THUẬT TOÁN CORDIC | LINH QUÂN HOÀNG tốc độ cho phận tạo sin, cos nhiều lĩnh vực điện tử ngày tăng, mà đặc biệt lĩnh vực viễn thông Năm 1956, Jack E Volder, nhà kỹ sư người Mỹ phát minh thuật toán CORDIC (COordinate Rotation DIgital Computer), loại thuật tốn nhận tính sin, cos mà dựa vào phép toán cộng, trừ dịch mà khơng cần đến phép tính nhân, chia thuật toán nhanh hiệu thời điểm cho việc tính sin, cosin góc cho trước Ngày có nhiều chip ASIC thực thuật toán CORDIC cho đời tiêu thụ nhiều lĩnh vực B Cơ sở toán học thuật toán CORDIC Ý tưởng CORDIC xuất phát từ phương trình tốn học đơn giản, giả sử ta có vector (X0, Y0) ta vector quay góc có ϕ đó, sau quay, vector có tọa độ (Xn, Yn), lúc ta có phương trình Xn = X0cos(ϕ) – Y0sin(ϕ) Yn = Y0cos(ϕ) + X0sin(ϕ) Ta viết phương trình dạng Xn = cos(ϕ)( X0 – Y0tan(ϕ) ) Yn = cos(ϕ)( Y0 + X0tan(ϕ) ) K20-DT | 22 MẠCH NHÂN VÀ MẠCH THUẬT TỐN CORDIC | LINH QN HỒNG Việc sau quay, ta giá trị Xn, Yn phụ thuộc vào giá trị X0, Y0 cũ giá trị ϕ, ta nghĩ đến việc ứng dụng quay vào thuật tốn mà đó: + Các giá trị tan chọn đặc biệt, số mũ 2, ý tưởng xuất phát từ việc nhân hay chia cho làm đơn giản dịch, tức ta chọn góc quay mà ϕ = tan-1(2-i) với i (viết tắt iteration), số chu trình thực phép quay + Ta để ý giá trị Xn Yn dạng phương trình ln có tích số thêm vào lượt xoay cos(ϕ) = cos(tan-1(2-i)), người ta chứng minh ∏cos(tan-1(2-i)) = 0.6073 với i ∞, nhiên thực tế cần i lớn 25 tích gần với 0.6073 Như vậy, thay nhân tích số cos(ϕ) chu trình, ta cần gán cứng giá trị X Y chu trình với số đơn vị tỷ lệ sẵn với 0.6073 C Thuật toán CORDIC đưa seminar Tạo bảng Look-up Table để chứa giá trị ϕ = tan-1(2-i) với i từ đến 31, bảng thể giá trị số thực dấu phẩy tĩnh (fixed-point), i = 0, tan-1(2-i) = 45o, ta chọn giá trị biểu thị cho 45o 00100000000000000000000000000000 (đổi thập phân số nguyên 536870912) Vậy, với i = tan-1(2-i) = 26.56505118o, ta chọn giá trị biểu thị cho 26.565o 536870912× = 316933405.6 ≈ 316933405 = 000100101110010000000101000111012 K20-DT | 23 MẠCH NHÂN VÀ MẠCH THUẬT TỐN CORDIC | LINH QN HỒNG Và tương tự, ta lặp lại điều từ i = đến 31, ta look-up table sau: atan_table[00] = 'b00100000000000000000000000000000 atan_table[01] = 'b00010010111001000000010100011101 atan_table[02] = 'b00001001111110110011100001011011 atan_table[03] = 'b00000101000100010001000111010100 atan_table[04] = 'b00000010100010110000110101000011 atan_table[05] = 'b00000001010001011101011111100001 atan_table[06] = 'b00000000101000101111011000011110 atan_table[07] = 'b00000000010100010111110001010101 atan_table[08] = 'b00000000001010001011111001010011 atan_table[09] = 'b00000000000101000101111100101110 atan_table[10] = 'b00000000000010100010111110011000 atan_table[11] = 'b00000000000001010001011111001100 atan_table[12] = 'b00000000000000101000101111100110 atan_table[13] = 'b00000000000000010100010111110011 atan_table[14] = 'b00000000000000001010001011111001 atan_table[15] = 'b00000000000000000101000101111100 atan_table[16] = 'b00000000000000000010100010111110 atan_table[17] = 'b00000000000000000001010001011111 K20-DT | 24 MẠCH NHÂN VÀ MẠCH THUẬT TỐN CORDIC | LINH QN HỒNG atan_table[18] = 'b00000000000000000000101000101111 atan_table[19] = 'b00000000000000000000010100010111 atan_table[20] = 'b00000000000000000000001010001011 atan_table[21] = 'b00000000000000000000000101000101 atan_table[22] = 'b00000000000000000000000010100010 atan_table[23] = 'b00000000000000000000000001010001 atan_table[24] = 'b00000000000000000000000000101000 atan_table[25] = 'b00000000000000000000000000010100 atan_table[26] = 'b00000000000000000000000000001010 atan_table[27] = 'b00000000000000000000000000000101 atan_table[28] = 'b00000000000000000000000000000010 atan_table[29] = 'b00000000000000000000000000000001 atan_table[30] = 'b00000000000000000000000000000000 Chuyện ta cần chọn X0 Y0, input mạch (tức góc cần tính) Z0 tất nhiên giá trị biểu thị fixed point làm Như nói phần trước, từ ý tưởng toán học thuật toán, ta cần gán cứng giá trị X0 Y0 chu trình với số đơn vị tỷ lệ sẵn với 0.6073, để tối ưu, ta chọn X0 = 0.6073 tức giá trị nhị phân X0 536870912× = 7245371.219 ≈ 7245371 = 110111010001100000010102 Và Y0 = 0, tức vector nằm trục hoành K20-DT | 25 MẠCH NHÂN VÀ MẠCH THUẬT TOÁN CORDIC | LINH QN HỒNG Phần mạch 32 mạch con, mạch gồm mạch cộng, mạch trừ, mạch mux, mạch dịch phải Và mạch mô tả sau: + Xét dấu bit MSB z[i], tức xét xem giá trị z[i] âm hay dương, âm tức z[i][31] = ta dịch vector lên cách đưa z[i][31] vào ngõ chọn cho mux hình để mux chọn cho Xi+1 = Xi + (Yi >> i) Yi+1 = Yi - (Xi >> i) Zi+1 = Zi + atan_table[i] Điều đối sánh với công thức Xn = cos(ϕ)( X0 – Y0tan(ϕ) ) Yn = cos(ϕ)( Y0 + X0tan(ϕ) ) Như nói, cos(ϕ) khơng nhân vào, tín hiệu từ input đến output qua 32 tiến trình, mà ∏cos(tan-1(2-i)) = 0.6073 với i > 25 X0 nhận sẵn giá trị 0.6073 K20-DT | 26 MẠCH NHÂN VÀ MẠCH THUẬT TỐN CORDIC | LINH QN HỒNG + Nếu z[i][31] = 0, ta dịch vector xuống, tương tự, ta có điều ngược lại Xi+1 = Xi - (Yi >> i) Yi+1 = Yi + (Xi >> i) Zi+1 = Zi - atan_table[i] Kết cuối lấy X Y chu trình cuối cùng, tức cos(ϕ) = X31 sin(ϕ) = Y31 Z31 D Thi hành thuật tốn CORDIC Verilog (mơ tả mức behavior) Thuật toán CORDIC đồng module CORDIC_sync(angle_bin, cosine_bin, sine_bin); parameter width = 32; input [width - 1:0] angle_bin; output [width - 1:0] cosine_bin, sine_bin; wire signed [31:0] atan_table [0:30]; assign atan_table[00] = 'b00100000000000000000000000000000; assign atan_table[01] = 'b00010010111001000000010100011101; assign atan_table[02] = 'b00001001111110110011100001011011; assign atan_table[03] = 'b00000101000100010001000111010100; assign atan_table[04] = 'b00000010100010110000110101000011; assign atan_table[05] = 'b00000001010001011101011111100001; assign atan_table[06] = 'b00000000101000101111011000011110; assign atan_table[07] = 'b00000000010100010111110001010101; assign atan_table[08] = 'b00000000001010001011111001010011; assign atan_table[09] = 'b00000000000101000101111100101110; assign atan_table[10] = 'b00000000000010100010111110011000; assign atan_table[11] = 'b00000000000001010001011111001100; assign atan_table[12] = 'b00000000000000101000101111100110; assign atan_table[13] = 'b00000000000000010100010111110011; assign atan_table[14] = 'b00000000000000001010001011111001; assign atan_table[15] = 'b00000000000000000101000101111100; assign atan_table[16] = 'b00000000000000000010100010111110; assign atan_table[17] = 'b00000000000000000001010001011111; assign atan_table[18] = 'b00000000000000000000101000101111; assign atan_table[19] = 'b00000000000000000000010100010111; assign atan_table[20] = 'b00000000000000000000001010001011; K20-DT | 27 MẠCH NHÂN VÀ MẠCH THUẬT TỐN CORDIC | LINH QN HỒNG assign atan_table[21] = 'b00000000000000000000000101000101; assign atan_table[22] = 'b00000000000000000000000010100010; assign atan_table[23] = 'b00000000000000000000000001010001; assign atan_table[24] = 'b00000000000000000000000000101000; assign atan_table[25] = 'b00000000000000000000000000010100; assign atan_table[26] = 'b00000000000000000000000000001010; assign atan_table[27] = 'b00000000000000000000000000000101; assign atan_table[28] = 'b00000000000000000000000000000010; assign atan_table[29] = 'b00000000000000000000000000000001; assign atan_table[30] = 'b00000000000000000000000000000000; always @(posedge clock) begin x[0] = 'b11011101000110000001010; y[0] = 32‘b0; z[0] = angle_bin; end genvar i; generate for (i=0; i < (width-1); i=i+1) begin: xyz always @(posedge clock) begin x[i+1] >> i) : x[i] - (y[i] >>> i); y[i+1] >> i) : y[i] + (x[i] >>> i); z[i+1] > 0) : x[0] - (y[0] >>> 0); y[1] >> 0) : y[0] + (x[0] >>> 0); z[1] > i) : x[i] - (y[i] >>> i); y[i+1] >> i) : y[i] + (x[i] >>> i); z[i+1]