Để cho datapath hoạt động chính xác, tín hiệu điều khiển (control signals) thích hợp phải được xác nhận vào đúng thời điểm.Tín hiệu điều khiển là cần thiết cho tất cả các lựa chọn và kiểm sốt dịng cho tất cả các thành phần được sử dụng trong datapath. Bao gồm tất cả các lựa chọn dòng cho bộ ghép, ALU và đơn vị chức năng khác có nhiều hoạt động, tất cả các tín hiệu cho phép đọc/ghi trên thanh ghi và tập thanh ghi, đường địa chỉ cho tập thanh ghi, và tín hiệu kích hoạt bộ đệm ba trạng thái. Hoạt động của các đường dữ liệu được xác định bởi các tín hiệu điều khiển
Thiết kế vi xử lý 16 bit trên nền tảng công nghệ FPGA
được xác nhận vào thời gian nào. Trong một bộ vi xử lý, các tín hiệu điều khiển được tạo ra bởi control unit.
Ngược lại, các đường dữ liệu cần cung cấp các tín hiệu trạng thái (status
signals) trở lại control unit để cho nó hoạt động chính xác. Những tín hiệu trạng
thái thường là từ đầu ra của bộ so sánh. Các bài kiểm tra so sánh với một điều kiện hợp lý giữa hai giá trị. Những giá trị này có thể được lấy từ các thành phần bộ nhớ, hoặc trực tiếp từ đầu ra của đơn vị chức năng, hoặc mạch điện cố định như là hằng số. Những tín hiệu trạng thái cung cấp thông tin đầu vào cho control unit xác định những hoạt động tiếp theo. Ví dụ, trong một tình huống vịng lặp có điều kiện, các tín hiệu trạng thái sẽ giúp cho control unit xác định có nên lặp lại hoặc thốt khỏi vịng lặp .
Kể từ khi datapath thực hiện tất cả các hoạt động chức năng của một bộ vi xử lý, và bộ vi xử lý là để giải quyết vấn đề, do đó datapath phải có khả năng để thực hiện tất cả các hoạt động cần thiết để giải quyết vấn đề nhất định. Ví dụ, nếu vấn đề được yêu cầu là phép cộng của hai số, thì datapath phải chứa trong nó một bộ cộng. Nếu vấn đề yêu cầu lưu trữ của ba biến tạm thời, datapath phải có ba thanh ghi. Tuy nhiên, ngay cả với các yêu cầu này, vẫn cịn nhiều lựa chọn về những gì thực sự được thực hiện trong datapath. Ví dụ, một bộ cộng có thể được thực hiện như chỉ là một mạch cộng đơn, hoặc như một phần của ALU. Thanh ghi có thể là các đơn vị thanh ghi riêng biệt hoặc kết hợp trong một tập thanh ghi. Hơn nữa, hai biến tạm thời có thể chia sẻ cùng một thanh ghi nếu chúng không phải là cần thiết cùng một thời điểm.
Thiết kế datapath còn được gọi là thiết kế RTL, trong thiết kế RTL chúng ta xem xét việc dữ liệu được chuyển từ một thanh ghi sang một thanh ghi khác hoặc ghi lại vào chính nó. Nếu cùng một dữ liệu được ghi lại thanh ghi mà khơng có bất kỳ sửa đổi nào, thì khơng có gì được thực hiện. Vì vậy trước khi ghi dữ liệu vào một thanh ghi, dữ liệu đi qua và nó được sửa đổi bởi một hoặc nhiều đơn vị chức năng. Thời gian từ khi đọc dữ liệu tới sửa dữ liệu bởi các đơn vị chức năng và cuối cùng
Thiết kế vi xử lý 16 bit trên nền tảng công nghệ FPGA
Khi thiết kế một datapath để giải quyết một vấn đề nhất định, có hai phương pháp có thể được sử dụng. Bạn có thể bắt đầu với một general datapath xem nếu nó có chứa tất cả các đơn vị chức năng cần thiết và đủ thanh ghi cho thực hiện các vấn đề. Hoặc bạn đầu tiên có thể xem xét vấn đề cần thực hiện và xác định cần những đơn vị chức năng gì với số lượng thanh ghi cần là bao nhiêu. Sau đó, tạo ra một datapath chuyên dụng hoặc tùy chỉnh chỉ giải quyết một vấn đế. Đầu tiên, chúng ta sẽ xem xét một general datapath và cách sử dụng chúng, sau đó chúng ta sẽ tìm hiểu việc thiết kế các datapath chuyên dụng hoặc tùy chỉnh.
2.2.1.1. General Datapath
2.2.1.1.1. Mơ hình của một general datapath
Hình 2.4 Cấu trúc một Datapath đơn giản
Bảng 2.1 Hoạt động của ALU
ALU2 ALU1 ALU0 Operation
0 0 0 Pass through A 0 0 1 A AND B 0 1 0 A OR B 0 1 1 NOT A 1 0 0 A+ B 1 0 1 A– B 1 1 0 A+ 1 1 1 1 A– 1
Hình 2.4 cho thấy một ví dụ về một general datapath đơn giản. Nó chứa một đơn vị chức năng ALU và một thanh ghi để lưu trữ dữ liệu. Đầu vào cho toán hạng A của
Thiết kế vi xử lý 16 bit trên nền tảng cơng nghệ FPGA
ALU có thể là một đầu vào bên ngoài hoặc hằng số '1' khi được lựa chọn bởi tín hiệu lựa chọn dịng IE của multiplexer. Tốn hạng B của ALU luôn luôn là từ nội dung của thanh ghi. Hoạt động của ALU được xác định bởi ba dịng kiểm sốt ALU2, ALU1, và ALU0, như được xác định trong Bảng 2.1. Thanh ghi cung cấp khả năng tải để đưa dữ liệu đầu ra của ALU vào thanh ghi. Thanh ghi cũng có thể được thiết lập lại 0 bằng cách cấp đường tín hiệu xóa. Nội dung của thanh ghi có thể được đưa ra bên ngồi bằng cách cấp tín hiệu cho phép đầu ra OE của bộ đệm ba trạng thái. Ở đây chúng ta cho các đường bus để chuyển dữ liệu giữa các thành phần có độ rộng là 8 bit và tất cả các dịng điều khiển là 1 bit.
Có bảy đường điều khiển (số 0 – 6) để kiểm soát hoạt động của các datapath đơn giản này. Các hoạt động khác nhau có thể được thực hiện bởi datapath đơn giản này bằng cách xác nhận hoặc không xác nhận các tín hiệu điều khiển vào các thời điểm khác nhau. Những dịng điều khiển này được nhóm lại với nhau để tạo thành từ điều khiển. Do đó một hoạt động của datapath, được xác định bởi các giá trị thiết lập trong một từ điều khiển và sẽ có một chu kỳ đồng hồ để thực hiện. Bằng cách kết hợp nhiều từ điều khiển cùng nhau trong một trình tự nhất định, đường dữ liệu sẽ thực hiện các hoạt động quy định theo thứ tự nhất định.
Ví dụ: Tải một giá trị từ đầu vào bên ngoài vào thanh ghi, ta sẽ thiết lập các từ điều khiển như sau:
Bảng 2.2 Ví dụ từ điều khiển
Control line IE ALU2 ALU1 ALU0 Load Clear OE
6 5-3 2 1 0
Value set 1 000 (pass) 1 0 0
Bằng cách thiết lập IE = 1, chúng ta chọn đầu vào bên ngoài để đi qua các MUX. Từ Bảng 2.1 chúng ta thấy rằng thiết lập các dịng kiểm sốt của ALU là ALU2, ALU1, và ALU0 tới 000 để lựa chọn hoạt động đi qua. Cuối cùng, thiết lập tải = 1 để tải giá trị từ đầu ra của ALU vào thanh ghi. Như vậy ta đã lưu trữ được
Thiết kế vi xử lý 16 bit trên nền tảng công nghệ FPGA
giá trị đầu vào vào thanh ghi. Do mình khơng muốn đưa giá trị trong thanh ghi tới đầu ra vì vậy OE được thiết lập là 0.
Lưu ý rằng hoạt động ghi của thanh ghi xảy ra ở cạnh tích cực tiếp theo của clock. Vì thế, giá trị mới trong thanh ghi khơng có sẵn để đọc cho đến chu kỳ đồng hồ tiếp theo. Nếu ta đã thiết lập OE là 1 trong từ điều khiển trên, ta sẽ đọc được nội dung đầu vào ở thanh ghi trong chu kỳ đồng hồ hiện tại ở đầu ra thay vì phải chờ giá trị được nạp vào thanh ghi ở cạnh tích cực của chu kỳ đồng hồ tiếp theo.
2.2.1.1.2. Sử dụng General Datapath
Một general datapath, như được mô tả trong phần trước, có thể được sử dụng để giải quyết vấn đề khác nhau miễn là nó có tất cả các đơn vị chức năng cần thiết và có đủ thanh ghi để lưu trữ tất cả các dữ liệu tạm thời. Ý tưởng sử dụng một general datapath là chúng ta có thể sử dụng một mạch "có sẵn" để giải quyết một vấn đề nhất định mà khơng cần phải sửa đổi nó. Sự cân nhắc ở đây là vấn đề thời gian so với vấn đề không gian. Một mặt, chúng ta không cần thêm thời gian để thiết kế một đường dữ liệu tùy chỉnh hoặc chuyên dụng. Mặt khác, general datapath có thể chứa nhiều tính năng hơn so với những gì mà các vấn đề yêu cầu, vì vậy nó khơng chỉ làm tăng kích thước của mạch, mà cũng tiêu thụ nhiều năng lượng hơn. Ví dụ sau đây cho sẽ giúp ta biết cách chúng ta có thể sử dụng các general datapath để giải quyết một vấn đề.
Ví dụ: Để xem xét datapath được sử dụng như thế nào để thực hiện một tính tốn, chúng ta hãy viết các từ điều khiển cho các đường dữ liệu của Hình 2.4 để tạo ra ở đầu ra các con số từ 1 đến 10. Các thuật toán để làm điều này được thể hiện trong Hình 2.5.
Thiết kế vi xử lý 16 bit trên nền tảng công nghệ FPGA
Bảng 2.3 Bảng từ điều khiển cho datapath ở hình 2.4 sử dụng 3 từ điều khiển
Control Word Instruction IE ALU2 ALU1 ALU0 Load Clear OE
6 5-3 2 1 0
1 i = 0 × ××× 0 1 0
2 i = i+ 1 0 100 (add) 1 0 0
3 output i × ××× 0 0 1
Từ điều khiển thứ nhất khởi tạo i = 0. Thanh ghi trong datapath được sử dụng để lưu giá trị của i. Từ khi thanh ghi có chức năng xóa, chúng ta có thể cấp tín hiệu xóa để xóa thanh ghi về 0. ALU khơng cần thiết trong thao tác này do đó, nó khơng quan trọng các đầu vào ALU là gì, hoặc hoạt động gì được chọn cho ALU thực hiện. Do đó, bốn dịng điều khiển IE (để chọn đầu vào), và ALU2, ALU1, và ALU0 (để chọn hoạt động ALU) là tất đều thiết lập X của ("không quan tâm"). Load là 0 bởi vì chúng tơi khơng cần phải lưu trữ đầu ra ALU tới thanh ghi. Tại thời điểm này, chúng ta cũng không muốn đưa ra đầu ra giá trị từ thanh ghi, do đó tín hiệu điều khiển dòng đầu ra OE được đặt là 0.
Từ điều khiển 2 tăng i, vì vậy chúng ta cần cộng thêm 1 vào giá trị được lưu trữ trong thanh ghi. Mặc dù, ALU có một hoạt động tăng, chúng ta không thể sử dụng nó bởi vì ALU được thiết kế để có hoạt động tăng giá trị tốn hạng A thay vì các tốn hạng B (xem Bảng 2.1), và đường dữ liệu của ta được kết nối đầu ra của thanh ghi đi vào toán hạng B. Bây giờ, chúng ta có thể sửa đổi các ALU có một hoạt động tăng tốn hạng B, hoặc chúng ta có thể sửa đổi các đường dữ liệu để các đầu ra của thanh ghi có thể được chuyển đến tốn hạng A của ALU. Tuy nhiên, cả hai giải pháp yêu cầu những sửa đổi của đường dữ liệu, và điều này làm thất bại mục đích của việc sử dụng một general datapath. Thay vào đó, những gì chúng ta có thể làm là sử dụng tiện ích ALU hoạt động Add(100) để tăng giá trị được lưu trữ trong thanh ghi lên 1. Chúng ta có thể đưa vào tốn hạng A giá trị 1 bằng cách thiết lập IE là 0 kể từ khi đó dịng đầu vào của MUX được gắn liền với hằng số '1'. Các tốn hạng B sẽ có giá trị của thanh ghi. Cuối cùng, chúng ta cần phải tải các kết quả
Thiết kế vi xử lý 16 bit trên nền tảng công nghệ FPGA
Từ điều khiển 3 đưa ra đầu ra kết quả giá trị i đã tăng lên. Trong từ điều khiển này cũng vậy, chúng ta không quan tâm đến các yếu tố đầu vào đến ALU và hoạt động của ALU, nên khơng có giá trị mới nạp vào thanh ghi. Vì khơng muốn xóa thanh ghi và chỉ đơn giản là muốn xuất ra ngồi dữ liệu trong thanh ghi, vì vậy chỉ khẳng định tín hiệu OE bằng cách thiết lập nó thành 1.
2.2.1.2. Dedicated Datapath
Khi thiết kế một bộ vi xử lý chuyên dụng để thực hiện một thuật tốn nhất định, có những khi chúng ta không muốn sử dụng một general datapath và xây dựng một control unit để điều khiển nó. Những bất lợi của việc sử dụng một general datapath là sẽ thường có một số bộ phận trong datapath không cần thiết trong việc giải quyết vấn đề. Ví dụ, bộ dịch trong general datapath khơng cần thiết trong các phép tính cộng. Các bộ phận phụ khơng chỉ lãng phí mà chúng cịn làm tăng kích thước và năng lượng tiêu thụ của các mạch. Hơn nữa, khi một datapath tùy chỉnh nhỏ hơn so với một general datapath, nên cũng sẽ yêu cầu ít tín hiệu kiểm sốt. Bởi vì ít tín hiệu điều khiển cần phải được tạo ra, kết quả là control unit sẽ đơn giản hơn và nhỏ gọn hơn khi thiết kế. Do đó, chúng ta được hưởng lợi không chỉ từ một datapath nhỏ hơn mà còn là một đơn vị điều khiển nhỏ hơn, và dẫn đến sẽ có một bộ vi xử lý nhỏ hơn nhiều. Nên, thay vì sử dụng một general datapath, chúng ta có thể muốn thiết kế một dedicated datapath với tùy chỉnh chỉ để giải quyết các thuật tốn cho trước.
Mình đang cố gắng để xây dựng một mạch để thực hiện một thuật tốn nhất định, và các đường dữ liệu có trách nhiệm thực hiện tất cả các thao tác dữ liệu theo quy định của thuật tốn. Vì vậy, datapath phải có khả năng thực hiện tất cả các lệnh thao tác dữ liệu và tạo ra tất cả các tín hiệu trạng thái có điều kiện cho các thuật tốn. Trong dedicated datapath hoặc thiết kế RTL, mình đang quan tâm tới làm thế nào để chuyển dữ liệu từ một thanh ghi tới thanh ghi (tương tự hoặc khác) thông qua một số đơn vị chức năng nơi dữ liệu được sửa đổi. Khi xây dựng datapath để thực hiện một thuật toán cụ thể, chúng ta cần phải quyết định các vấn đề sau:
Thiết kế vi xử lý 16 bit trên nền tảng công nghệ FPGA
Cần những đơn vị chức năng nào và số lượng là bao nhiêu?
Một đơn vị chức năng nào đó có thể được chia sẻ giữa hai hoặc nhiều hoạt động hay không?
Làm thế nào cho thanh ghi và đơn vị chức năng kết nối với nhau để tất cả những chuyển động dữ liệu được chỉ định bởi các thuật tốn có thể được thực hiện?
2.2.1.2.1. Chọn thanh ghi
Trong hầu hết các trường hợp, một thanh ghi là cần thiết cho mỗi biến được sử dụng bởi các thuật toán. Tuy nhiên, nếu thời gian tồn tại của hai biến khơng trùng nhau thì hai biến đó có thể chia sẻ bằng cách sử dụng cùng một thanh ghi. Thời gian tồn tại của một biến là thời gian từ khi biến được sử dụng lần đầu đến khi nó được sử dụng cuối cùng.
Nếu hai hoặc nhiều biến chia sẻ cùng một thanh ghi, thì các kết nối truyền dữ liệu đưa đến thanh ghi và ra khỏi thanh ghi thường phức tạp hơn khi thanh ghi hiện tại có nhiều hơn một nguồn và đích. Có nhiều điểm đến khơng phải là vấn đề quá lớn ảnh hưởng tới kích thước mạch. Tuy nhiên, có nhiều nguồn sẽ yêu cầu mạch bổ sung để lựa chọn một nguồn trong số các nguồn đó sẽ được chuyển đến thanh ghi.
Sau khi quyết định có bao nhiêu thanh ghi là cần thiết, chúng ta vẫn cần phải xác định xem có sử dụng một tập thanh ghi duy nhất hay từng thanh ghi riêng biệt hoặc kết hợp cả hai để lưu trữ các biến nhập. Hơn nữa, các thanh ghi xây dựng để thực hiện các chức năng đặc biệt như các bộ đếm và các thanh ghi dịch cũng có thể được sử dụng. Quyết định lựa chọn các loại thanh ghi sử dụng sẽ ảnh hưởng đến các kết nối truyền dữ liệu giữa các thanh ghi và đơn vị chức năng được kết nối.
2.2.1.2.2. Lựa chọn các đơn vị chức năng
Sau đây là cách để quyết định lựa chọn loại đơn vị chức năng được yêu cầu. Ví dụ, nếu các thuật tốn u cầu phép cộng của hai số, thì datapath phải bao gồm một bộ cộng. Tuy nhiên, chúng ta vẫn cần phải xét xem có nên sử dụng một bộ cộng chuyên dụng, một sự kết hợp bộ cộng/bộ trừ, hoặc một ALU (trong đó có các