Thiết kế Shift

Một phần của tài liệu Thiết kế vi xử lý 16 bit trên nền tảng công nghệ fpga (Trang 60)

CHƯƠNG 3 : THIẾT KẾ VI XỬ LÝ 16 BIT TRÊN FPGA

3.1. Thiết kế vi xử lý 16 bit trên FPGA

3.1.7. Thiết kế Shift

3.1.7.1. Sơ đồ khối Shift

Khối tiếp theo mà ta thiết kế là shift, thực thể shift làm nhiệm vụ thao tác dịch và quay dữ liệu. Sơ đồ mơ tả khối dịch được thể hiện ở Hình 3.8, bao gồm a là bus là đầu vào, y là bus đầu ra cả hai đều có độ rộng 16 bits và một tín hiệu sel dùng lựa chọn hoạt động cho bộ shift.

Những hoạt động được thực hiện bởi shift như mơ tả tại Hình 3.10 và Hình 3.11. Khối shift có thể thực hiện được các hoạt động như dịch trái, dịch phải, quay trái, quay phải. Ngoài ra bộ shift cịn có một hoạt động khác là pass through, trong hoạt động này tất cả các bit đầu vào được chuyển qua đầu ra mà không bị thay đổi.

Hình 3.9 Sơ đồ khối bộ Shift

3.1.7.2. Các tín hiệu vào ra của bộ Shift

Các tín hiệu vào ra của Shift được thể hiện ở bảng phía dưới:

Bảng 3.9 Bảng các tín hiệu vào ra bộ Shift

Tín hiệu Kích thước Hướng Miêu tả

A 16 Bit In Dữ liệu vào bộ Shift

Y 16 Bit Out Dữ liệu ra bộ Shift

SEL Shftpass, shl, Shr, rotl, rotr

In Tín hiệu lựa chọn chức năng shift

Thiết kế vi xử lý 16 bit trên nền tảng cơng nghệ FPGA

Hình 3.10 Hoạt động dịch trái và dịch phải của bộ Shift

Thiết kế vi xử lý 16 bit trên nền tảng công nghệ FPGA

3.1.8. Thiết kế Trireg

3.1.8.1. Sơ đồ khối bộ Trireg

Thành phần cuối cùng trong CPU được thiết kế là trireg. Thanh ghi ba trạng thái được kết nối với bus dữ liệu chính và có thể thể lưu trữ thơng tin từ bus dữ liệu cũng như thông tin điều khiển tới bus dữ liệu. Thành phần Trireg có bốn cổng vào ra được thể hiện trong Hình 3.12.

Hình 3.12 Sơ đồ bộ Trireg

a là dữ liệu đầu vào, q là dữ liệu đầu ra của Trireg. Tín hiệu clk dùng được sử dụng khi điều khiển lưu một giá trị mới vào thanh ghi. Khi cấp một cạnh lên tại đầu vào clk, dữ liệu tại đầu vào a sẽ được lưu vào Trireg. Tín hiệu en được sử dụng để điều khiển đầu ra q. Khi en có giá trị là ‘1’ dữ liệu trong Trireg sẽ được đưa ra đầu ra q, còn khi en có giá trị là ‘0’ thì đầu ra q sẽ có trở kháng cao.

3.1.8.2. Các tín hiệu vào ra bộ Trireg

Bảng 3.10 Các tín hiệu vào ra bộ Trireg

Tín hiệu Kích thước Hướng Miêu tả

A 16 Bit In Dữ liệu vào bộ Trireg

Q 16 Bit Out Dữ liệu ra bộ Trireg

CLK 1 Bit In Tín hiệu xung clock

EN 1 Bit In Tín hiệu cho phép Trireg hoạt động

3.2. Kết luận chương

Chương này đã trình bày chi tiết thiết kế từng thành phần trong mơ hình vi xử lý 16 bit đã chọn để triển khai trên FPGA. Với mơ hình vi xử lý này, việc triển khai thực tế trên FPGA đã được thực hiện và kiểm nghiệm được tính khả thi.

Thiết kế vi xử lý 16 bit trên nền tảng công nghệ FPGA

CHƯƠNG 4: KẾT QUẢ MÔ PHỎNG THIẾT KẾ VI XỬ LÝ 16 BIT TRÊN FPGA

Chương trước đã trình bày các bước thiết kế vi xử lý 16 bit trên FPGA với những mô tả thiết kế số và giải thuật triển khai các khối logic. Trong chương này, phần kết quả triển khai vi xử lý 16 bit trên FPGA bao gồm lựa chọn cấu hình, các thơng tin về tài nguyên sử dụng trên FPGA. Phần rất quan trọng trong chương này sẽ đề cập đến là phần thực hiện các mô phỏng để kiểm chứng chức năng của vi xử lý 16 bit cũng như đo đạc các thông số hoạt động của xử lý với thiết kế đã chọn.

4.1. Lựa chọn phần cứng

 Device Family: Virtex7

 Device: XC7VX485T

 Top-Level Source Type: HDL

 Synthesis Tool: XST (VHDL)

 Simulator: ISim (VHDL)

 Preferred Language: VHDL

4.2. Các thông số phần cứng sau khi thiết kế

Triển khai thiết kế vi xử lý 16 bit với FPGA XC7VX485T của Xilinx dùng công cụ ISE cho kết quả sử dụng tài nguyên trên FPGA như bảng dưới đây. Qua kết quả sử dụng tài nguyên này có thể thấy việc lựa chọn loại chip này của Xilinx là hoàn toàn phù hợp với thiết kế vi xử lý 16 bit đã đề ra.

Bảng 4.1 Tài nguyên đã sử dụng

Slice Logic Utilization Used Available Utilization

Number of Slice Registers 101 607,200 1%

Number of Slice LUTs 91 303,600 1%

Number of occupied Slices 60 75,900 1%

Thiết kế vi xử lý 16 bit trên nền tảng công nghệ FPGA

Các thông số về thời gian:

 Minimum period: 2.182ns (Maximum Frequency: 458.232MHz)

 Minimum input arrival time before clock: 1.385ns

 Maximum output required time after clock: 2.779ns

 Maximum combinational path delay: 0.848ns

4.3. Mô phỏng các thành phần của vi xử lý 16 bit 4.3.1. Mô phỏng khối ALU 4.3.1. Mô phỏng khối ALU

Để mô phỏng khối ALU tác giả đưa vào đưa hai thông giá trị đầu vào của ALU là A = 3 và B =7 và thực hiện các phép toán kết quả được thể hiện như bảng và testbench đã thể hiện.

Bảng 4.2 Kết quả mô phỏng của ALU

Phép toán Alu select a b Kết quả (c) Load 0000 0000000000000011 0000000000000111 0000000000000011 and 0001 0000000000000011 0000000000000111 0000000000000011 or 0010 0000000000000011 0000000000000111 0000000000000111 not 0011 0000000000000011 0000000000000111 1111111111111100 Xor 0100 0000000000000011 0000000000000111 0000000000000100 add 0101 0000000000000011 0000000000000111 0000000000001010 sub 0110 0000000000000011 0000000000000111 1111111111111100 inc 0111 0000000000000011 0000000000000111 0000000000000100 dec 1000 0000000000000011 0000000000000111 0000000000000010 Zero 1001 0000000000000011 0000000000000111 0000000000000000

Thiết kế vi xử lý 16 bit trên nền tảng công nghệ FPGA

Trên Hình 3.13 là kết quả khi ALU thực hiện phép toán Add với đầu vào dữ liệu a = 3, b = 7 kết quả sau khi thực hiện là c = 10.

4.3.2. Mô phỏng khối dịch

Kết quả mô phỏng của khối dịch được thể hiện trong Bảng 4.3 và testbench trong Hình 4.2 và Hình 4.3.

Bảng 4.3 Kết quả của các phép toán dịch

Phép toán a Kết quả shftpass 0000000000000101 0000000000000101 shl 0000000000000101 0000000000001010 shr 0000000000000101 0000000000000010 rotl 0000000000000101 0000000000001010 rotr 0000000000000101 1000000000000010

Hình 4.2 Mơ phỏng hoạt động lệnh dịch trái của khối dịch

Hình 4.2 mơ tả hoạt động của lệnh dịch trái (shl). Với dữ liệu đưa vào là a = 0000000000000101 sau khi thực hiện dịch trái dữ liệu thu được tại đầu ra c = 0000000000001010.

Hình 4.3 Mơ phỏng hoạt động lệnh quay phải của khối dịch

Thiết kế vi xử lý 16 bit trên nền tảng công nghệ FPGA

4.3.3. Mô phỏng khối so sánh

Bảng 4.4 Bảng kết quả mơ phỏng khối so sánh

Phép tốn a b Kết quả

Bằng nhau (eq) 0000000000000101 0000000000001001 0 Không bằng nhau (neq) 0000000000000101 0000000000001001 1 Lớn hơn (gt) 0000000000000101 0000000000001001 0 Lớn hơn hoặc bằng (gte) 0000000000000101 0000000000001001 0 Nhỏ hơn (lt) 0000000000000101 0000000000001001 1 Nhỏ hơn hoặc bằng (lte) 0000000000000101 0000000000001001 1

Hình 4.4 Mơ phỏng testbench của khối so sánh

Khi thực hiện mô phỏng bộ so sánh như trên Hình 4.4. Dữ liệu đưa vào đầu vào a = 3 và b = 7, sau khi thực hiện lệnh khơng bằng (neq) thì kết quả đầu ra compout = 1.

4.3.4. Mơ phỏng khối CPU

Để có cái nhìn tổng thể về nguyên tắc hoạt động của vi xử lý vừa thiết kế. Bây giờ tác giả sẽ thực hiện mơ phỏng tồn bộ hoạt động CPU thông qua thực hiện một lệnh đơn giản là lệnh loadI 1,10.

Ví dụ: Lệnh loadI 1,10 // Load giá trị hex 10 vào thanh ghi số 3.

Giá trị trong bộ nhớ:

“0010000000000001”, --- 0 loadI 1, # -- load source address “0000000000010000”, --- 1 10 – hex

Thiết kế vi xử lý 16 bit trên nền tảng công nghệ FPGA

Tại lần ready = 1 thứ nhất: Khối CPU đọc giá trị data = 0010000000000001 trong bộ nhớ và lựa chọn thanh ghi số 1 (001).

Hình 4.5 Mơ phỏng testbench của CPU đọc data

Lần ready tiếp theo, khối CPU đọc giá trị data = 0000000000010000 trong bộ nhớ và thực hiện lệnh load giá trị đó vào thanh ghi số 1.

Hình 4.6 Mơ phỏng testbench của CPU đọc data

4.4. Kết luận chương

Như vậy đến hết chương này chúng ta đã hoàn thành việc thiết kế bộ vi xử lý 16 bit và thực hiện mô phỏng từng thành phần bên trong như khối ALU, khối dịch, khối so sánh và tổng thể khối CPU. Qua đó chúng ta đã kiểm tra được hoạt động của các thành phần được thiết kế và tổng thể thiết kế CPU. Từ đó giúp tác giả có thể hiểu được tồn bộ quy trình thiết kế một vi xử lý từ những bước đơn giản

Thiết kế vi xử lý 16 bit trên nền tảng công nghệ FPGA

CHƯƠNG 5: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN

Sau thời gian thực hiện đề tài, học viên đã tìm hiểu được những kiến thức tổng quát về FPGA và các phương pháp thiết kế vi xử lý đồng thời đã có những triển khai thiết kế vi xử lý trên FPGA của một số hãng nghiên cứu. Từ đó học viên đã có những đánh giá và lựa chọn một mơ hình CPU phù hợp để triển khai trên FPGA của hãng Xilinx, thực hiện triển khai thiết kế và mô phỏng trên phần mềm ISE và cuối cùng là đánh giá kết quả thiết kế đã thực hiện. Như vậy, mục đích đề ra khi lựa chọn đề tài luận văn đã được học viên thực hiện đầy đủ. Tuy nhiên, những nghiên cứu về thiết kế vi xử lý và việc triển khai vi xử lý vào phần cứng thực tế còn nhiều điểm cần tiếp tục tìm hiểu và phát triển thêm trong quá trình nghiên cứu sau này của học viên, như triển khai các ứng dụng trên vi xử lý hay xây dựng các cơ chế điều khiển linh hoạt làm tăng hiệu năng hoạt động cho vi xử lý như cơ chế điều khiển đường ống…

Kết quả của nghiên cứu này đã tạo một tiền đề cho học viên cũng như cộng đồng những nhà thiết kế đang nghiên cứu làm việc chuyên sâu về lĩnh vực thiết kế phần cứng, FPGA và VLSI. Đồng thời với điều đó, nghiên cứu này cũng góp phần chung vào sự phát triển về công nghệ thiết kế IC của nước nhà.

Thiết kế vi xử lý 16 bit trên nền tảng công nghệ FPGA

TÀI LIỆU THAM KHẢO

[1] Douglas L. Perry (2002), VHDL Programming by Example, McGraw-Hill, U.S. [2] Enoch O.Hwang (2004), Microprocessor Design Principles and Practices With

VHDL, Brooks/Cole, U.S.

[3] Karen Parnell, Nick Mehta (2003), Programmable Logic Design Quick Start Handbook, Xilinx, U.S.

[4] Peter Wilson (2007), Design recipes for FPGA, Elsevier, UK.

[5] Pong P.Chu (2006), RTL Hardware Design Using VHDL, A John Wiley &

Sons. U.S.

[6] Volnei A. Pedroni (2004), Circuit design with VHDL, Asco Typesetters, U.S. [7] Michael Huebner, Tobias Becker, Juergen Becker – “Real-Time LUT-Based

Network Topologies for Dynamic and Partial FPGA Self-Reconfiguration” [8] Wang Lie, Wu Feng-yan – “Dynamic partial reconfiguration in FPGAs” [9] www.Xilinx.com - “Partial Reconfiguration User Guide”

[10] www.Xilinx.com - “PlanAhead Partial Reconfiguration User Guide” [11] www.Xilinx.com - “Xilinx Partial Reconfiguration Tools and Techniques Lab training”

Thiết kế vi xử lý 16 bit trên nền tảng công nghệ FPGA

PHỤ LỤC Mã VHDL mô tả khối ALU

library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; use work.cpu_lib.all; entity alu is port( a, b : in bit16; sel : in t_alu; c : out bit16); end alu; architecture rtl of alu is begin

aluproc: process(a, b, sel) begin case sel is when alupass => c <= a after 1 ns; when andOp => c <= a and b after 1 ns; when orOp => c <= a or b after 1 ns; when xorOp => c <= a xor b after 1 ns; when notOp => c <= not a after 1 ns; when plus => c <= a + b after 1 ns; when alusub => c <= a - b after 1 ns; when inc => c <= a + "0000000000000001"after 1 ns; when dec => c <= a - "0000000000000001"after 1 ns; when zero => c <= "0000000000000000"after 1 ns; when others => c <= "0000000000000000"after 1 ns; end case; end process; end rtl;

Thiết kế vi xử lý 16 bit trên nền tảng công nghệ FPGA

Mã VHDL mô tả bộ so sánh library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use work.cpu_lib.all; entity comp is port( a, b : in bit16; sel : in t_comp;

compout : out std_logic); end comp;

architecture rtl of comp is begin

compproc: process(a, b, sel) begin case sel is when eq => if a = b then compout <= '1' after 1 ns; else compout <= '0' after 1 ns; end if; when neq => if a /= b then compout <= '1' after 1 ns; else compout <= '0' after 1 ns; end if; when gt => if a > b then compout <= '1' after 1 ns; else compout <= '0' after 1 ns; end if; when gte => if a >= b then compout <= '1' after 1 ns; else compout <= '0' after 1 ns; end if; when lt =>

Thiết kế vi xử lý 16 bit trên nền tảng công nghệ FPGA

compout <= '1' after 1 ns; else compout <= '0' after 1 ns; end if; when lte => if a <= b then compout <= '1' after 1 ns; else compout <= '0' after 1 ns; end if; end case; end process; end rtl;

Mã VHDL của khối control

library IEEE;

use IEEE.std_logic_1164.all; use work.cpu_lib.all;

entity control is

port( clock : in std_logic; reset : in std_logic; instrReg : in bit16; compout : in std_logic; ready : in std_logic;

progCntrWr : out std_logic; progCntrRd : out std_logic; addrRegWr : out std_logic; addrRegRd : out std_logic; outRegWr : out std_logic; outRegRd : out std_logic; shiftSel : out t_shift; aluSel : out t_alu; compSel : out t_comp; opRegRd : out std_logic; opRegWr : out std_logic; instrWr : out std_logic; regSel : out t_reg; regRd : out std_logic; regWr : out std_logic; rw : out std_logic; vma : out std_logic

Thiết kế vi xử lý 16 bit trên nền tảng công nghệ FPGA

); end control;

architecture rtl of control is

signal current_state, next_state : state; begin

nxtstateproc: process( current_state, instrReg, compout, ready) begin progCntrWr <= '0'; progCntrRd <= '0'; addrRegWr <= '0'; outRegWr <= '0'; outRegRd <= '0'; shiftSel <= shftpass; aluSel <= alupass; compSel <= eq; opRegRd <= '0'; opRegWr <= '0'; instrWr <= '0'; regSel <= "000"; regRd <= '0'; regWr <= '0'; rw <= '0'; vma <= '0'; case current_state is when reset1 =>

aluSel <= zero after 1 ns; shiftSel <= shftpass; next_state <= reset2; when reset2 => aluSel <= zero; shiftSel <= shftpass; outRegWr <= '1'; next_state <= reset3; when reset3 => outRegRd <= '1'; next_state <= reset4; when reset4 => outRegRd <= '1'; progCntrWr <= '1'; addrRegWr <= '1'; next_state <= reset5; when reset5 =>

Thiết kế vi xử lý 16 bit trên nền tảng công nghệ FPGA

rw <= '0'; next_state <= reset6; when reset6 => vma <= '1'; rw <= '0'; if ready = '1' then instrWr <= '1'; next_state <= execute; else next_state <= reset6; end if; when execute =>

case instrReg(15 downto 11) is when "00000" => --- nop next_state <= incPc;

when "00001" => --- load regSel <= instrReg(5 downto 3); regRd <= '1';

next_state <= load2;

when "00010" => --- store regSel <= instrReg(2 downto 0); regRd <= '1';

next_state <= store2;

when "00011" => ----- move regSel <= instrReg(5 downto 3); regRd <= '1'; aluSel <= alupass; shiftSel <= shftpass; next_state <= move2; when "00100" => ---- loadI progcntrRd <= '1'; alusel <= inc; shiftsel <= shftpass; next_state <= loadI2; when "00101" => ---- BranchImm progcntrRd <= '1'; alusel <= inc; shiftsel <= shftpass; next_state <= braI2; when "00110" => ---- BranchGTImm regSel <= instrReg(5 downto 3);

Thiết kế vi xử lý 16 bit trên nền tảng công nghệ FPGA

next_state <= bgtI2;

when "00111" => ------- inc regSel <= instrReg(2 downto 0); regRd <= '1'; alusel <= inc; shiftsel <= shftpass; next_state <= inc2; when others => next_state <= incPc; end case; when load2 =>

regSel <= instrReg(5 downto 3); regRd <= '1'; addrregWr <= '1'; next_state <= load3; when load3 => vma <= '1'; rw <= '0'; next_state <= load4; when load4 => vma <= '1'; rw <= '0';

regSel <= instrReg(2 downto 0); regWr <= '1';

next_state <= incPc; when store2 =>

regSel <= instrReg(2 downto 0); regRd <= '1';

addrregWr <= '1'; next_state <= store3; when store3 =>

regSel <= instrReg(5 downto 3); regRd <= '1';

next_state <= store4; when store4 =>

regSel <= instrReg(5 downto 3); regRd <= '1';

vma <= '1'; rw <= '1';

next_state <= incPc; when move2 =>

Thiết kế vi xử lý 16 bit trên nền tảng công nghệ FPGA

Một phần của tài liệu Thiết kế vi xử lý 16 bit trên nền tảng công nghệ fpga (Trang 60)

Tải bản đầy đủ (PDF)

(82 trang)