Làm thế nào có thể điều khiển màn hình VGA ở tần số xung nhịp cao như vậy?


12

Tôi đang làm việc trên một mạch kỹ thuật số bằng cách sử dụng các thành phần riêng biệt để điều khiển màn hình VGA 640x480 ở chế độ văn bản 80x30.

Đối với màn hình 640x480, đồng hồ pixel là 25.175 MHz, có khoảng thời gian khoảng 40ns. Tôi không hiểu làm thế nào tôi có thể cung cấp một pixel mới cho màn hình này thường xuyên.

Kiến trúc cơ bản cho mạch của tôi như sau:

  1. Bộ đếm nhị phân cho các pixel ngang đếm lên tới 25.175 MHz đến 800 (640 pixel hiển thị + 160 cho hiên trước, đồng bộ hóa, hiên sau). Ở mức 800, tăng bộ đếm dòng dọc (và đặt lại ở 525 dòng)

  2. Sử dụng vị trí ngang và dọc, suy ra tọa độ x, y của ký tự hiện tại.

  3. Sử dụng tọa độ x, y của ký tự, lập chỉ mục vào bộ nhớ video để truy xuất ký tự ASCII.

  4. Sử dụng ký tự ASCII để lập chỉ mục trong ROM ký tự để lấy mẫu bit cho ký tự

  5. Sử dụng song song với thanh ghi dịch chuyển nối tiếp để chuyển đổi dòng ký tự 8 pixel thành các bit riêng lẻ ở tần số xung nhịp pixel

Nếu bạn theo chuỗi, nó sẽ đi: Bộ đếm -> RAM -> ROM -> Song song với Đăng ký thay đổi nối tiếp

Sử dụng các thành phần nhanh nhất tôi có thể tìm thấy, độ trễ lan truyền và thời gian truy cập lên tới khoảng 15ns + 20ns + 70ns + 15ns = 120ns, lớn hơn nhiều so với khoảng thời gian 40ns cho 25 MHz.

Ở độ phân giải cao hơn và tốc độ làm mới, bạn có thể có đồng hồ pixel cao hơn 100 MHz, đó sẽ là khoảng thời gian 10ns.

Làm thế nào có thể cung cấp pixel mới cho màn hình cứ sau 10ns khi thời gian truy cập RAM / ROM đã vượt quá mức đó, thậm chí không xem xét tất cả các tín hiệu khác trong hệ thống của bạn?


7
Bạn sử dụng RAM video chuyên dụng và đồng hồ trực tiếp vào tín hiệu video của bạn. Bạn làm việc để tìm ra những gì sẽ hiển thị lâu trước khi bạn thực sự hiển thị nó.
Nghe tin

2
Đi đọc về Maximite . Nó chỉ sử dụng phần cứng ngoại vi của MCU và một vài điện trở để điều khiển cổng VGA. Bắt đầu bằng cách kiểm tra thiết bị ngoại vi PIC32 anh ta sử dụng. Hoạt động tốt. (Tôi có một Maximite ở đây.)
jonk

"Cuốn sách nấu ăn video giá rẻ" của "Don Lancaster"
Jasen

Câu trả lời:


17

Có hai lý do chính khiến bạn tìm thấy thử thách này.

Đầu tiên, bạn đang sử dụng các bộ phận cũ hơn và rời rạc hơn (tích hợp quy mô thấp hơn) so với những gì đã được sử dụng để làm điều này trong kỷ nguyên của VGA.

Nhưng tiếp theo, bạn đang sử dụng chúng một cách không điển hình. Cụ thể, cách tiếp cận của bạn không pipelinedcó nghĩa là bạn phải thêm nhiều độ trễ khi xác định khoảng thời gian của mình và do đó đánh giá.

Ngược lại, các thiết kế kỹ thuật số đồng bộ cố gắng đạt được tốc độ cố gắng làm ít nhất có thể giữa các thanh ghi.

Mặc dù các chi tiết có thể khác nhau một chút, nhưng nói một cách thô thiển thì nó sẽ hoạt động như thế này:

  • Bạn tăng hoặc đặt lại địa chỉ, sau đó đăng ký.
  • Bạn chốt địa chỉ vào bộ nhớ đồng bộ
  • Bạn chốt đầu ra của bộ nhớ đồng bộ
  • Bạn chốt cái này vào địa chỉ của trình tạo ký tự đồng bộ
  • Bạn chốt đầu ra của trình tạo ký tự vào thanh ghi đầu ra
  • áp dụng bảng tra cứu ...
  • vào bộ xử lý đồng bộ ...

Khi bạn phá vỡ một nhiệm vụ như thế này, bạn chỉ nhận được một độ trễ tổ hợp cộng với một số độ trễ lan truyền và đăng ký thiết lập và thời gian giữ cần phải khớp giữa các đồng hồ.

Một thiết kế được xây dựng theo cách này sẽ mất nhiều đồng hồ để tạo ra một đầu ra - độ trễ thực sự sẽ cao hơn một thiết kế kết hợp thuần túy. Nhưng nó tạo ra một đầu ra chính xác mới trên mỗi chu kỳ của đồng hồ nhanh hơn nhiều.

Và này, đó là video, sẽ không thực sự quan trọng nếu CRT đang vẽ một tá pixel phía sau bộ đếm pixel - tất nhiên bạn phải tính đến điều đó trong thời gian của các tín hiệu đồng bộ để chúng chính xác so với khi dữ liệu thực sự đi ra khỏi DAC.

Trong thực tế, hầu hết tất cả các hệ thống kỹ thuật số phức tạp đều hoạt động theo cách này, vì đó là một ý tưởng tuyệt vời - cho đến khi CPU có đường ống phụ thuộc vào kết quả tính toán trước đó hoặc một nhánh có điều kiện ... Sau đó, mọi thứ trở nên thú vị, như họ đã nói về trong bài giảng tiếp theo của lớp hệ thống kỹ thuật số - nhưng may mắn là tình huống VGA của bạn đơn giản hơn rất nhiều, đặc biệt là nếu bạn chưa lo lắng về hiệu ứng xé rách nếu bộ đệm ký tự thay đổi trong khi màn hình được vẽ.

Như một vấn đề thực tế nếu bạn muốn xây dựng điều này, hãy thực hiện nó trong một đồ họa. Điều đó sẽ buộc khá nhiều bộ nhớ đồng bộ vào bạn nếu bạn sử dụng các bộ nhớ trong hoặc các thanh ghi IO đồng bộ nếu bạn sử dụng bộ nhớ ngoài. Bạn sẽ nhận được rất nhiều ảnh hưởng đến một thiết kế phù hợp, bản thân vải sẽ nhanh hơn các bộ phận rời rạc của bạn, và tất nhiên nếu bạn mắc lỗi, bạn chỉ cần xoay ngón tay cái trong khi nó biên dịch lại thay vì mất một ngày dài để nối lại .


"đặc biệt là nếu bạn chưa lo lắng về hiệu ứng xé rách nếu bộ đệm nhân vật thay đổi trong khi màn hình được vẽ" - đó là lý do từ những ngày đầu tiên của bộ xử lý video, bộ đồng xử lý có cách thông báo cho quy trình chính rằng chúng không phải là hiện đang bỏ bộ nhớ của họ lên màn hình và nếu họ muốn thay đổi bộ đệm video, họ nên làm điều đó ngay bây giờ.
John Dvorak

Tôi nghĩ rằng bạn đang quá phức tạp này. Anh ấy đã tuyên bố rằng anh ấy đang sử dụng một thanh ghi dịch chuyển 8 bit, cho ra một bit trên mỗi đồng hồ pixel. Có lẽ đây là một thanh ghi thay đổi 8 bit có chốt. Điều đó có nghĩa là anh ta chỉ phải tìm nạp một byte mới một lần đồng hồ 8 pixel, với tốc độ 3.125 MHz. Điều đó cung cấp cho bạn tất cả 320ns để lấy dữ liệu vào chốt đăng ký thay đổi, dài hơn nhiều so với 120ns mà anh ta nói sẽ mất.
Chris_F

Đối với trường hợp đơn sắc có độ phân giải thấp rất đơn giản, vâng, thời gian của byte sẽ không quá khó khăn, nhưng một phần quan trọng của câu hỏi là người hỏi đang cố gắng hiểu hiệu suất của các hệ thống "thực" điển hình của độ phân giải không tầm thường như thế nào có khả năng. Và câu trả lời cũng giống như tất cả các hệ thống kỹ thuật số hữu ích khác: công nghệ nhanh hơn và thiết kế đồng bộ theo đường ống.
Chris Stratton

2

Sử dụng các thành phần nhanh nhất tôi có thể tìm thấy, độ trễ lan truyền và thời gian truy cập lên tới khoảng 15ns + 20ns + 70ns + 15ns = 120ns, lớn hơn nhiều so với khoảng thời gian 40ns cho 25 MHz.

Bạn quên rằng bộ điều hợp đồ họa sẽ không bao giờ chỉ vẽ một pixel - mà ít nhất là một dòng quét đầy đủ. Vì vậy, đây sẽ là một vấn đề hoàn toàn đường ống.

Ngoài ra, đừng quên rằng cho đến nay đã có năm thập kỷ sản xuất phần cứng video. Vấn đề của bạn thường sẽ được giải quyết bằng một loại RAM đặc biệt, trong đó bạn kết xuất các chữ cái của mình trên một cổng và được đọc tuần tự cho một tín hiệu video DAC. Phần cứng đó là cách, cách nhanh hơn những gì bạn đang xem.

Kiến trúc cơ bản cho mạch của tôi như sau:

  1. Bộ đếm nhị phân cho các pixel ngang đếm lên tới 25.175 MHz đến 800 (640 pixel hiển thị + 160 cho hiên trước, đồng bộ hóa, hiên sau). Ở mức 800, tăng bộ đếm dòng dọc (và đặt lại ở 525 dòng)

  2. Sử dụng vị trí ngang và dọc, suy ra tọa độ x, y của ký tự hiện tại.

Không, tại sao bạn sẽ làm điều đó? Bạn chỉ cần đặt pixel hàng của mình vào vùng nhớ liền kề và tuyến tính đưa nó ra cho bộ xử lý của bạn - nếu đây là về triển khai CPU / MCU, bạn thậm chí sẽ không để CPU của mình làm điều đó, mà là một đơn vị DMA, được lập trình không làm gì ngoài lấy một giá trị khác và đưa nó ra ví dụ như một cổng dữ liệu song song, không có bất kỳ tương tác lõi CPU nào.

  1. Sử dụng tọa độ x, y của ký tự, lập chỉ mục vào bộ nhớ video để truy xuất ký tự ASCII.

Ah, bạn muốn kết xuất nhanh - sự lựa chọn tốt, nhưng khác thường với chi phí RAM hiện đại. Thay vào đó, bạn chỉ cần kết xuất nhân vật vào bộ đệm khung trước hoặc nếu thiết bị cực kỳ mỏng, hãy trực tiếp rút ống ra (xem phần giải thích DMA của tôi ở trên) hàng nhân vật cho bộ xử lý.


1
Mặc dù các công cụ hiện đại có xu hướng thích bộ đệm khung được kết xuất sẵn, rõ ràng chúng là một lựa chọn tồi nếu bạn đang cố gắng làm việc mà không có nhiều ram. Nếu bạn đang làm điều này trong một đồ họa, bạn có thể tạo máy trạng thái DMA lấy địa chỉ từ sơ đồ ô ký tự và sau đó đọc từ các glyphs ký tự tương ứng.
R .. GitHub DỪNG GIÚP ICE

hoàn toàn đồng ý ở đây! do đó, phần trả lời của tôi về câu hỏi thứ ba.
Marcus Müller

2

Khác với đường ống (rất nhiều những gì bạn nên làm), bạn đang thiếu một cái gì đó quan trọng ....

Đồng hồ song song, thanh ghi thay đổi nối tiếp chấm ở mức 25 Mhz lẻ, chắc chắn, nhưng nếu các ký tự của bạn có chiều rộng 8 pixel, đầu vào của nó chỉ ở mức ~ 3,2 MHz, dễ dàng trong tầm với cho dòng LS thời đại VGA, cho tất cả điều đó bạn cần chuẩn bị sẵn byte kế tiếp khi thanh ghi thay đổi kết thúc với byte hiện tại (đây là nơi đường ống dẫn đến).

Tạo đồng hồ pixel ở tốc độ ~ 25 MHz và đồng hồ bộ nhớ ở mức 1/8 để điều khiển bộ đệm văn bản và CG ROM, sau đó dẫn đường cho bộ nhớ và công cụ truy cập CG ROM.

Một mẹo nữa, đầu ra bộ đệm văn bản sẽ được lặp lại cho mỗi dòng trong bất kỳ dòng văn bản đã cho nào, vì vậy có thể bạn có thể đồng hồ 80 byte văn bản vào bộ đệm vòng và sau đó dừng đọc ram cho 7 dòng tiếp theo (giả sử 8 ký tự dòng), điều này cho phép bạn giải phóng bộ nhớ cho CPU sử dụng, với chi phí cần 80 byte ram được treo ở bên cạnh.


1

Vì vậy, rõ ràng là không hoạt động; bạn cần một đường ống dẫn

1) Lưu trữ các ký tự liên tục trong bộ nhớ. Bắt đầu ở phía trên bên trái.

2) Lấy một ký tự trong khoảng thời gian trống. Tiếp tục tìm nạp các ký tự theo thứ tự bộ nhớ.

3) Đường ống từng ký tự được giải mã cộng với chỉ số dòng vào ROM.

4) Đường ống đầu ra ROM vào bộ đệm.

5) Đường ống đệm vào một thanh ghi thay đổi. Đọc các pixel liên tục trong khoảng thời gian 40ns từ đây.

(Điều đó có nghĩa là bạn cần tải một ký tự mới vào thanh ghi ca mỗi 320ns, thậm chí có thể thực hiện được mà không cần đường ống cho toàn bộ phần còn lại của hệ thống.)

6) Trong quá trình xóa ngang, quay trở lại đầu dòng hoặc chuyển sang ký tự tiếp theo (tức là bắt đầu dòng tiếp theo.)

Tính năng phần thưởng: vì bạn chỉ cần một ký tự sau mỗi 320ns, bạn cũng có thể đọc một cặp ký tự + màu và thực hiện các ký tự màu theo phong cách MSDOS hoặc Spectrum-Style.

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.