Kiến trúc Harvard giúp ích như thế nào?


12

Tôi đã đọc về kiến ​​trúc arduino và kiến ​​trúc AVR và bị mắc kẹt tại điểm làm thế nào để ngăn chặn đường ống hoặc bong bóng được giải quyết bằng cách giới thiệu kiến ​​trúc Harvard trong AVR. Ý tôi là Harvard chỉ cung cấp vị trí lưu trữ khác nhau cho bộ nhớ dữ liệu và bộ nhớ chương trình. làm cho nó có thể tải chương trình mà không cần toán tử. Nhưng làm thế nào để giúp giải quyết vấn đề trên?


2
Đây là một chút dự đoán vì vậy tôi sẽ không đăng câu trả lời, nhưng tôi đoán kiến ​​trúc Harvard có ích vì không có khả năng tự sửa đổi mã theo hướng dẫn trước đó trong đường ống.
PeterJ

1
tôi không chắc là tôi có nhận được không ... bạn có muốn nói rằng một khi hướng dẫn đã được "tìm nạp" thì nó không thể được sửa đổi hoặc ném lại?
Ayush

1
Đúng vậy, đối với người không thuộc Harvard vì mã có thể tự thay đổi, có khả năng hướng dẫn trước có thể sửa đổi hướng dẫn sau. Nhưng chờ một thời gian, ai đó có thể sẽ có câu trả lời dứt khoát và rõ ràng hơn.
PeterJ

Câu trả lời:


9

Kiến trúc Harvard, được sử dụng một cách tình cờ từ lâu trước khi các AVR được phát minh, thực sự có không gian địa chỉ riêng cho bộ nhớ chương trình và cho bộ nhớ dữ liệu. Điều này mang lại cho bữa tiệc là khả năng thiết kế mạch theo cách có thể sử dụng một mạch điều khiển và bus riêng để xử lý luồng thông tin từ bộ nhớ chương trình và luồng thông tin đến bộ nhớ dữ liệu. Việc sử dụng các bus riêng biệt có nghĩa là có thể tiếp tục tìm nạp và thực hiện chương trình mà không bị gián đoạn từ việc truyền dữ liệu không thường xuyên vào bộ nhớ dữ liệu. Ví dụ, trong phiên bản đơn giản nhất của kiến ​​trúc, đơn vị tìm nạp chương trình có thể bận tìm nạp lệnh tiếp theo trong chuỗi chương trình song song với thao tác truyền dữ liệu có thể là một phần của lệnh chương trình trước đó.

Ở cấp độ đơn giản nhất này, kiến ​​trúc Harvard có một hạn chế ở chỗ nhìn chung không thể đưa mã chương trình vào bộ nhớ dữ liệu và để nó được thực thi từ đó.

Có nhiều biến thể và phức tạp có thể được thêm vào trên cùng của hình thức kiến ​​trúc đơn giản nhất mà tôi đã mô tả. Một bổ sung phổ biến là thêm bộ nhớ đệm hướng dẫn vào bus thông tin chương trình, cho phép đơn vị thực thi lệnh truy cập nhanh hơn đến bước chương trình tiếp theo mà không phải tắt bộ nhớ chậm hơn để tìm nạp bước chương trình mỗi khi cần.


cảm ơn rất nhiều .... thực sự đã giúp tôi có được nó, nhưng chỉ một điều nữa ... chúng ta không thể có những chiếc xe buýt khác nhau nhưng cùng một bộ nhớ và làm việc cùng một lúc?
Ayush

@Ayush - Nếu bạn có hai xe buýt đi đến cùng một không gian bộ nhớ thì hai yêu cầu giao dịch bộ nhớ đã đến bộ nhớ cùng một lúc sẽ vẫn phải tranh giành quyền truy cập bộ nhớ. Người ta phải đợi người kia hoàn thành !! Bây giờ đã nói rằng một số nhà thiết kế đã "giải quyết" vấn đề đó bằng cách thiết kế bộ nhớ để hoạt động với tốc độ gấp đôi bình thường và sau đó cho phép một xe buýt có quyền truy cập vào bộ nhớ xen kẽ với truy cập từ xe buýt khác. Tức là mọi thứ được thiết kế sao cho xe buýt đầu tiên luôn được đồng bộ hóa với các khe truy cập kỳ lạ vào bộ nhớ và (tiếp theo nhận xét)
Michael Karas

(tiếp theo nhận xét trước) xe buýt thứ hai được đồng bộ hóa với các khe truy cập chẵn của bộ nhớ, sau đó cả hai xe buýt có thể tiến hành hoạt động ở tốc độ mà không cần tranh chấp truy cập bộ nhớ.
Michael Karas

@MichaelKara: Người ta có thể làm điều đó. Mặt khác, trong hầu hết các trường hợp, yếu tố giới hạn chính cho tốc độ hệ thống tổng thể là tốc độ bộ nhớ. Nếu một bộ nhớ có thể chạy nhanh gấp đôi chỉ cần cho dữ liệu hoặc chỉ cho mã, thì việc chia hệ thống bộ nhớ thành từng bộ nhớ cho dữ liệu và mã sẽ cho phép mọi thứ diễn ra nhanh gấp đôi.
supercat

4

Một số lưu ý ngoài câu trả lời của Michaels:

1) kiến ​​trúc Harvard không yêu cầu có hai không gian riêng cho dữ liệu và mã, chỉ là chúng (hầu hết) được tìm nạp trên hai bus khác nhau .

2) vấn đề được giải quyết bởi kiến ​​trúc Harvard là sự tranh chấp xe buýt: đối với một hệ thống mà bộ nhớ mã có thể cung cấp các hướng dẫn đủ nhanh để giữ cho CPU chạy hết tốc độ, gánh nặng thêm của việc tải / lưu trữ dữ liệu sẽ làm chậm CPU xuống. Vấn đề đó được giải quyết bằng kiến ​​trúc Hardvard: bộ nhớ (một chút) quá chậm so với tốc độ của CPU.

Lưu ý rằng bộ nhớ đệm là một cách khác để giải quyết vấn đề này. Thường thì thu thập dữ liệu và bộ nhớ đệm được sử dụng trong các kết hợp thú vị.

Harvard sử dụng hai bus. Không có lý do cố hữu để dính vào hai, trong những trường hợp rất đặc biệt, nhiều hơn hai được sử dụng, chủ yếu trong DSP (bộ xử lý Tín hiệu số).

Bộ nhớ ngân hàng (theo nghĩa phân phối bộ nhớ truy cập vào các bộ chip khác nhau) có thể được xem như là một loại Thu thập dữ liệu bên trong hệ thống bộ nhớ, không dựa trên sự phân biệt dữ liệu / mã, mà dựa trên các bit nhất định của địa chỉ.


4
Thực sự là một "tinh khiết" Harvard kiến trúc không đòi hỏi kỷ niệm riêng biệt (số lượng có địa chỉ) để được hướng dẫn và dữ liệu. Tuy nhiên, vì điều này ngăn máy tính tự khởi động, nhiều máy thực hiện kiến ​​trúc Harvard "đã sửa đổi", trong đó ghi vào bộ nhớ lệnh được cho phép.
Dave Tweed

Ngân hàng bộ nhớ không giúp ích gì trừ khi có hai (hoặc nhiều) bus giữa CPU và mỗi ngân hàng bộ nhớ.
Dave Tweed

@ Lưu 2: ngân hàng sẽ giúp trong một số trường hợp nhất định, ví dụ: nếu vấn đề là thời gian bộ nhớ VÀ xe buýt đến bộ nhớ là không chặn (nhiều giao dịch có thể nổi bật).
Wouter van Ooijen

@ Dave1: bạn có thể đưa ra một tài liệu tham khảo?
Wouter van Ooijen

Wikipedia , cũng là Đại học Princeton (mà thực sự chỉ là một bản sao của trang Wikipedia). Ngoài ra, hầu hết các bộ vi điều khiển đơn chip là kiến ​​trúc Harvard và nhiều bảng dữ liệu thực sự thảo luận về cách cung cấp một cơ chế để tự ghi bộ nhớ flash mã tạo ra một kiến ​​trúc Harvard đã được sửa đổi.
Dave Tweed

2

Một kiến ​​trúc thuần Harvard nói chung sẽ cho phép một máy tính có mức độ phức tạp nhất định chạy nhanh hơn kiến ​​trúc Von Neuman, với điều kiện là không cần chia sẻ tài nguyên giữa mã và bộ nhớ dữ liệu. Nếu các giới hạn pinout hoặc các yếu tố khác bắt buộc sử dụng một bus để truy cập cả hai không gian bộ nhớ, thì những ưu điểm đó có thể bị vô hiệu hóa phần lớn.

Một kiến ​​trúc Harvard "thuần túy" sẽ bị giới hạn trong việc chạy mã được đưa vào bộ nhớ bởi một số cơ chế khác ngoài bộ xử lý sẽ chạy mã. Điều này giới hạn tiện ích của các kiến ​​trúc như vậy đối với các thiết bị mà mục đích của nhà máy không đặt ra (hoặc ai đó có thiết bị lập trình chuyên dụng). Hai cách tiếp cận có thể được sử dụng để giảm bớt vấn đề này:

Một số hệ thống có các vùng mã và bộ nhớ riêng biệt, nhưng cung cấp phần cứng đặc biệt có thể được yêu cầu nhanh chóng chiếm lấy bus mã, thực hiện một số thao tác và trả lại quyền điều khiển cho CPU sau khi hoàn tất thao tác đó. Một số hệ thống như vậy đòi hỏi một giao thức khá phức tạp để thực hiện các hoạt động như vậy, một số hệ thống có các hướng dẫn đặc biệt để thực hiện một tác vụ như vậy và một số thậm chí còn xem các địa chỉ "bộ nhớ dữ liệu" nhất định và kích hoạt tiếp quản / giải phóng khi thực hiện một nỗ lực để truy cập chúng . Một khía cạnh quan trọng của các hệ thống như vậy là có các vùng bộ nhớ được xác định rõ ràng cho "mã" và "dữ liệu"; ngay cả khi CPU có thể đọc và ghi không gian "mã", nó vẫn được công nhận là khác biệt về mặt ngữ nghĩa với không gian dữ liệu. '

Một cách tiếp cận khác được sử dụng trong một số hệ thống cao cấp hơn là có một bộ điều khiển với hai bus bộ nhớ, một cho mã và một cho dữ liệu, cả hai đều kết nối với một đơn vị trọng tài bộ nhớ. Đơn vị đó lần lượt kết nối với các hệ thống con bộ nhớ khác nhau bằng cách sử dụng một bus bộ nhớ riêng cho mỗi hệ thống. Mã truy cập vào một hệ thống con bộ nhớ có thể được xử lý đồng thời với quyền truy cập dữ liệu vào hệ thống khác; chỉ khi mã và dữ liệu cố gắng truy cập cùng một hệ thống con thì người ta sẽ phải chờ.

Trên các hệ thống sử dụng phương pháp này, các phần không quan trọng về hiệu năng của chương trình có thể đơn giản bỏ qua ranh giới giữa các hệ thống con bộ nhớ. Nếu mã và dữ liệu xảy ra trong cùng một hệ thống con bộ nhớ, mọi thứ sẽ không chạy nhanh như thể chúng ở trong các hệ thống con riêng biệt, nhưng đối với nhiều phần của một chương trình điển hình sẽ không thành vấn đề. Trong một hệ thống điển hình, sẽ có một phần nhỏ mã trong đó hiệu năng thực sự quan trọng và nó sẽ chỉ hoạt động trên một phần nhỏ dữ liệu do hệ thống nắm giữ. Nếu một hệ thống có 16K RAM được chia thành hai phân vùng 8K, thì người ta có thể sử dụng các hướng dẫn liên kết để đảm bảo rằng mã quan trọng về hiệu năng được đặt gần điểm bắt đầu của không gian bộ nhớ chung và dữ liệu quan trọng về hiệu năng nằm gần kết thúc. Nếu kích thước mã tổng thể tăng lên, ví dụ 9K, mã trong 1K cuối cùng sẽ chạy chậm hơn mã được đặt ở nơi khác, nhưng mã đó sẽ không quan trọng về hiệu năng. Tương tự, nếu mã chỉ là 6K, nhưng dữ liệu tăng lên 9K, thì việc truy cập vào 1K dữ liệu thấp nhất sẽ chậm, nhưng nếu dữ liệu quan trọng về hiệu năng được đặt ở nơi khác, điều đó sẽ không gây ra vấn đề.

Lưu ý rằng mặc dù hiệu suất sẽ là tối ưu nếu mã dưới 8K và dữ liệu dưới 8K, thiết kế hệ thống bộ nhớ đã nói ở trên sẽ không áp đặt bất kỳ phân vùng nghiêm ngặt nào giữa mã và không gian dữ liệu. Nếu một chương trình chỉ cần 1K dữ liệu, mã có thể tăng lên tới 15K. Nếu nó chỉ cần 2K mã, dữ liệu có thể tăng lên 14K. Linh hoạt hơn nhiều so với việc có một khu vực 8K chỉ cho mã và một khu vực 8K chỉ cho dữ liệu.


1

Một khía cạnh chưa được thảo luận là đối với các bộ vi điều khiển nhỏ, thông thường chỉ có một bus địa chỉ 16 bit, kiến ​​trúc Harvard có hiệu quả nhân đôi (hoặc gấp ba) không gian địa chỉ. Bạn có thể có 64K mã, 64K RAM và 64k I / O được ánh xạ bộ nhớ (nếu hệ thống đang sử dụng I / O được ánh xạ bộ nhớ thay vì số cổng, thì sau này đã tách địa chỉ I / O khỏi mã & Dung lượng RAM).

Nếu không, bạn phải nhồi nhét mã, RAM và tùy chọn địa chỉ I / O trong cùng một không gian địa chỉ 64K.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.