Trên ngôn ngữ lập trình VHDL, có thể viết đƣợc chƣơng trình thực thi nhân 2 số nguyên lớn (mỗi số nguyên đầu vào A, B với 40 bit, hay 5 byte), kết quả lƣu trữ đầu ra ở 1 số gồm 80 bit (10 byte), trên Hình vẽ 2.3 mô tả mô hình của khối nhân này.
Hình 2.3: Phép nhân 2 số A x B = Y
Chƣơng trình thực thi nhân 2 số A x B = Y đƣợc viết trên ngôn ngữ VHDL có thể đƣa ra nhƣ phần dƣới đây:
______________________________________________________
entity Mult is port (
A, B : In unsigned (39 downto 0); Y : Out unsigned (79 downto 0) ) ;
end Mult ;
begin
Y <= A * B ; end Nhan2So ;
________________________________________________________
Giải thích: Khối nhân có tên là Mult, đƣợc khai báo với 2 cổng đầu vào gồm có 40 bit, một cổng đầu ra với độ rộng là 80 bit, kết quả gán A x B = Y khi thực hiện xong phép nhân.
Việc thực thi phép nhân 2 số nguyên 40 bit (5 byte) là một vấn đề khó khăn, chính vì thế để thực hiện bài toán này, trong [7] đã đƣa ra cách tiếp cận thực hiện trên bộ số nguyên 8 bit. Với từng phần của số nguyên A gồm 8 bit và triển khai lần lƣợt nhân với các phần của số nguyên B, rồi cùng với sự dịch chuyển bit có thể thực hiện đƣợc phép nhân này.
Trên Hình 2.4 mô tả ý tƣởng thực thi phép nhân trong các CPU. Ví dụ với 2 số nguyên 8 bit, việc thực thi tuần từ từng bƣớc chính là cách thực thi hiện nay trong các ALU của CPU khi thực thi, đó là phép nhân sẽ đƣợc thực hiện tuần tự số A với từng bit của số B và phép dịch chuyển bit tùy thuộc vị trí của từng bit (Hình 2.4a). Ý tƣởng này đƣợc trình bày theo mô hình khối nhân và khối cộng trong Hình 2.4b.
a) b) Hình 2.4: Thực thi phép nhân 2 số A x B = Y
Trên Hình 2.5 mô tả ý tƣởng thực thi phép nhân khi sử dụng Pipeline. Ý tƣởng thực thi ở đây là chia bộ nhân này ra ở giai đoạn cộng các kết quả khi chia bộ cộng thành 2 bƣớc, bƣớc thứ nhất với 5 bộ cộng (Adder) theo từng nhóm khi thực thi trên từng bit của số B (mỗi số 8 bit). Cụ thể ở đây tại bƣớc 1 (Stage 1) số nguyên A nhân với 8 bit đầu tiên của số nguyên B, sau đó thực thi phép cộng các kết quả này tại bộ cộng. Việc hiển thị kết quả đƣợc điều khiển thông qua tín hiệu CLK (Clock) để đảm bảo kết quả đó sẽ hiển thị khi nào xung CLK đƣợc chuyển từ 0 lên 1. Đồng thời số nguyên A với sự dịch chuyển về bên trái 8 bit tiếp tục đƣợc nhân với số nguyên B (Hình 2.5). Các kết quả ở những bộ cộng (Adder) sẽ đƣợc tổng hợp thành các tín hiệu Y1, Y2, Y3, Y4, Y5, các kết quả này sẽ đƣợc đƣa vào bộ cộng tổng hợp tại bƣớc 2 (Stage 2). Việc sử dụng các bit điều khiển CLK sẽ cho phép đảm bảo thực thi đúng kết quả ở mỗi giai đoạn.
Hình 2.5: Pipeline cho phép nhân 2 số A x B = Y
Ý tƣởng này có thể mô hình hóa lại tại Hình 2.6 [7].
Chi tiết việc thực thi kết quả Y1 (tƣơng tự với Y2, Y3, Y4, Y5) đƣợc trình bày trong Hình 2.7 [7].
Hình 2.7: Pipeline cho phép nhân 2 số A x B = Y
Code chƣơng trình đƣợc viết trên ngôn ngữ VHDL đƣợc đƣa ra dƣới dây.
____________________________________________________
architecture Rtl3 of PipeMult is
signal Y1, Y2, Y3, Y4, Y5 : unsigned (47 downto 0);
constant ZERO :unsigned(31 downto 0) := (others => '0'); begin PipeMultProc : process begin wait until clk = '1' ; Y1 <= A * B( 7 downto 0) ; Y2 <= A * B(15 downto 8) ;
Y3 <= A * B(23 downto 16) ; Y4 <= A * B(31 downto 24) ; Y5 <= A * B(39 downto 32) ; Y <=
(ZERO(31 downto 0) & Y1 ) +
(ZERO(31 downto 8) & Y2 & ZERO( 7 downto 0)) + (ZERO(31 downto 16) & Y3 & ZERO(15 downto 0)) + (ZERO(31 downto 24) & Y4 & ZERO(23 downto 0)) + ( Y5 & ZERO(31 downto 0)) ;
end process ; end Rtl3 ;
____________________________________________________
Với các nghiên cứu, tìm hiểu trong phần này, sẽ giúp ích cho việc xây dựng, thử nghiệm kết quả demo ở chƣơng sau đúng theo khả năng của kỹ thuật pipeline trên FPGA.
CHƢƠNG 3: ỨNG DỤNG FPGA XỬ LÝ NHANH DỮ LIỆU
Đối với bài toán xử lý nhanh dữ liệu, với mọi dạng dữ liệu, vi xử lý cũng sẽ vẫn quy về các phép toán thực thi trên ALU với nhƣng phép biến đổi logic, số học, đại số, vì vậy ở trong chƣơng này, chúng ta sẽ xem xét đối với bài toán cộng bộ các số nguyên và nhân các số nguyên, từ đó cho thấy khả năng xử lý nhanh đối với công nghệ FPGA.