그러한 높은 픽셀 클럭 주파수에서 VGA 디스플레이를 어떻게 구동 할 수 있습니까?


12

80x30 텍스트 모드에서 640x480 VGA 디스플레이를 구동하기 위해 개별 구성 요소를 사용하는 디지털 회로에서 작업하고 있습니다.

640x480 디스플레이의 경우 픽셀 클록은 25.175MHz이며 약 40ns의주기를 갖습니다. 나는 종종 디스플레이에 새로운 픽셀을 제공 할 수 있어야한다고 생각하지 않습니다.

회로의 기본 아키텍처는 다음과 같습니다.

  1. 수평 픽셀의 이진 카운터는 25.175MHz ~ 800 (앞 현관, 싱크, 뒷 현관의 경우 640 개의 가시 픽셀 + 160)에서 카운트됩니다. 800에서 수직 라인 카운터를 증가시킵니다 (그리고 525 라인에서 리셋)

  2. 수평 및 수직 위치를 사용하여 현재 문자의 x, y 좌표를 도출합니다.

  3. 문자의 x, y 좌표를 사용하여 비디오 메모리로 색인하여 ASCII 문자를 검색하십시오.

  4. ASCII 문자를 사용하여 문자 ROM에서 색인화하여 문자의 비트 패턴을 얻습니다.

  5. 병렬-직렬 시프트 레지스터를 사용하여 픽셀 클록 주파수에서 문자의 8 픽셀 라인을 개별 비트로 변환

체인을 따라 가면 카운터-> RAM-> ROM-> 직렬 시프트 레지스터와 병렬

내가 찾을 수있는 가장 빠른 구성 요소를 사용하면 전파 지연 및 액세스 시간이 약 15ns + 20ns + 70ns + 15ns = 120ns에 이르며 25MHz의 40ns보다 훨씬 큽니다.

더 높은 해상도와 재생률에서 100ns를 초과하는 픽셀 클록을 가질 수 있으며 이는 10ns주기입니다.

RAM / ROM의 액세스 시간이 이미 시스템의 다른 모든 신호를 고려하지 않고 이미 위에있을 때 10ns마다 디스플레이에 새로운 픽셀을 제공하는 방법은 무엇입니까?


7
전용 비디오 RAM을 사용하고 비디오 신호에 직접 클럭킹합니다. 실제로 표시하기 전에 표시 할 항목 을 파악하는 작업을 합니다.
난로

2
Maximite 에 대해 읽어보십시오 . 단지 MCU의 주변 장치 하드웨어와 몇 개의 저항을 사용하여 VGA 포트를 구동합니다. 그가 사용하는 PIC32 주변 장치를 검사하여 시작하십시오. 잘 작동합니다. (여기에 Maximite가 있습니다.)
jonk

"Don Lancaster"의 "The Cheap Video Cookbook"
Jasen

답변:


17

이 도전을 찾는 두 가지 주요 이유가 있습니다.

첫째, 당신은 VGA 시대에 이것을 사용했던 것보다 더 오래되고 더 이산적인 (더 낮은 규모의 통합) 부품을 사용하고 있습니다.

그러나 다음에는 비정형 방식으로 사용하고 있습니다. 특히, 접근 방식이 아니기 때문에 간격을 결정할 때 여러 지연 pipelined을 추가해야 하므로 속도를 계산해야합니다.

반대로, 속도를 달성하려는 동기식 디지털 설계는 레지스터간에 가능한 한 적은 노력을 기울입니다.

세부 사항은 약간 다를 수 있지만 대략적으로 말하면 다음과 같이 작동합니다.

  • 주소를 늘리거나 재설정하면 레지스터로 이동합니다.
  • 주소를 동기 메모리에 고정시킵니다
  • 동기 메모리 의 출력을 래치
  • 이것을 동기 문자 생성기 의 주소에 고정시킵니다.
  • 문자 생성기의 출력을 출력 레지스터에 래치
  • 팔레트 조회를 적용하십시오 ...
  • 동기식 DAC로 ...

이와 같이 작업을 분류하면 조합 지연 1 개와 전파 지연 1 개, 클록 설정에 필요한 레지스터 설정 및 유지 시간 만 얻을 수 있습니다.

이러한 방식으로 제작 된 디자인은 출력을 생성하는 데 많은 클럭이 필요합니다. 대기 시간 은 실제로 순수 조합 설계보다 높습니다. 그러나 훨씬 빠른 클럭의 각 사이클에서 새로운 올바른 출력을 생성합니다.

그리고 비디오입니다. CRT가 픽셀 카운터 뒤에 수십 개의 픽셀을 그리는지 여부는 중요하지 않습니다. 물론 동기화 신호의 타이밍에서 데이터를 고려하여 실제로 데이터와 비교할 때 정확합니다. DAC에서 나옵니다.

실제로 거의 모든 복잡한 디지털 시스템은 파이프 라인 CPU가 이전 계산 결과 또는 조건부 분기에 대한 종속성에 도달 할 때까지 좋은 아이디어이므로 작동합니다. 다음 강의에서 디지털 시스템 수업을 듣게됩니다. 그러나 운 좋게도 VGA 상황은 훨씬 더 간단합니다. 특히 화면을 그리는 동안 문자 버퍼가 변경 될 때 찢어짐 효과에 대해 아직 걱정하지 않는다면 더욱 그렇습니다.

이것을 구축하려는 경우 실용적인 문제는 FPGA에서 수행하십시오. 내부 메모리를 사용하는 경우 동기 메모리를 강제로, 외부 메모리를 사용하는 경우 동기 IO 레지스터를 강제로 수행합니다. 적절한 디자인으로 많은 방해가 될 것입니다. 패브릭 자체가 이산 부품보다 빠를 것입니다. 실수로 실수를 범하면 다시 컴파일하는 데 오랜 시간을 소비하지 않고 다시 컴파일하는 동안 엄지 손가락 만 돌리면됩니다. .


"특히 화면을 그리는 동안 문자 버퍼가 변경 될 때 찢어짐 효과에 대해 아직 걱정하지 않는 경우"-비디오 코 프로세서의 초기 시절부터 코 프로세서는 메인 프로세스에 그렇지 않은 것으로 알리는 방법이있었습니다. 현재 메모리를 화면에 덤프하고 비디오 버퍼를 변경하려면 지금해야합니다.
John Dvorak

나는 당신이 이것을 너무 복잡하게 생각합니다. 그는 이미 픽셀 클럭 당 1 비트를 출력하는 8 비트 시프트 레지스터를 사용하고 있다고 언급했다. 아마도 이것은 래치가있는 8 비트 시프트 레지스터입니다. 즉, 그는 8 픽셀 클럭마다 새로운 바이트를 가져 와서 3.125MHz의 속도로 가져와야한다는 것을 의미합니다. 그것은 320ns 모두가 데이터를 시프트 레지스터 래치로 가져 오도록하는데, 이것은 그가 생각했던 120ns보다 훨씬 길다.
Chris_F

매우 간단한 저해상도 흑백 사례의 경우 예, 바이트 타이밍은 그리 까다로울 수 없지만 문제의 핵심 부분은 일반적인 "실제"비 사소 해상도의 "실제"시스템의 성능을 이해하려고하는 것이 었습니다. 가능합니다. 그리고 그 대답은 다른 모든 유용한 디지털 시스템과 동일합니다 : 더 빠른 기술과 파이프 라인 동기 설계.
Chris Stratton

2

내가 찾을 수있는 가장 빠른 구성 요소를 사용하면 전파 지연 및 액세스 시간이 약 15ns + 20ns + 70ns + 15ns = 120ns에 이르며 25MHz의 40ns보다 훨씬 큽니다.

그래픽 어댑터는 단일 픽셀을 그리는 것이 아니라 전체 스캔 라인을 그리는 것임을 잊습니다. 따라서 이것은 완전히 파이프 라인 가능한 문제입니다.

또한 지금까지 50 년 동안 비디오 제작 하드웨어가 있다는 것을 잊지 마십시오. 문제는 일반적으로 특수한 유형의 RAM을 사용하여 하나의 포트에서 문자를 렌더링하고 비디오 신호 DAC로 순차적으로 읽습니다. 그 하드웨어는 현재보고있는 것보다 훨씬 빠릅니다.

회로의 기본 아키텍처는 다음과 같습니다.

  1. 수평 픽셀의 이진 카운터는 25.175MHz ~ 800 (앞 현관, 싱크, 뒷 현관의 경우 640 개의 가시 픽셀 + 160)에서 카운트됩니다. 800에서 수직 라인 카운터를 증가시킵니다 (그리고 525 라인에서 리셋)

  2. 수평 및 수직 위치를 사용하여 현재 문자의 x, y 좌표를 도출합니다.

아뇨, 왜 그렇게 하시겠습니까? 행 픽셀을 연속 된 메모리 영역에 넣고 DAC에 선형으로 넣기 만하면됩니다. CPU / MCU 구현에 관한 것이라면 CPU는 그렇게하지 않고 DMA 장치도 프로그래밍 할 수 있습니다. CPU 코어 상호 작용없이 병렬 데이터 포트에 예를 들어서 하나의 값만 취하면됩니다.

  1. 문자의 x, y 좌표를 사용하여 비디오 메모리로 색인하여 ASCII 문자를 검색하십시오.

아, 당신은 즉시 렌더링하고 싶습니다 – 좋은 선택이지만 현대적인 RAM 비용에서는 드문 경우입니다. 대신, 캐릭터를 미리 프레임 버퍼로 렌더링하거나 장치가 매우 슬림 한 경우 캐릭터 행을 DAC로 직접 파이프 아웃합니다 (위의 DMA 설명 참조).


1
현대적인 것들은 사전 렌더링 된 프레임 버퍼를 선호하는 경향이 있지만, 많은 램없이 작업하려고한다면 분명히 나쁜 선택입니다. FPGA에서이 작업을 수행하는 경우 DMA 상태 머신이 문자 셀 맵에서 주소를 가져 와서 해당 문자 글리프에서 읽을 수 있습니다.
R .. GitHub 중지 지원 얼음 얼음

여기에 완전히 동의하십시오! 따라서 세 번째 질문에 대한 대답 섹션입니다.
Marcus Müller

2

파이프 라이닝과는 별개로 (당신이해야 할 일이 많이 있습니다), 중요한 무언가가 빠져 있습니다 ....

병렬 입력, 직렬 출력 시프트 레지스터 클록은 25 홀수 Mhz에서 도트 아웃되지만 문자의 너비가 8 픽셀 인 경우 입력은 ~ 3.2MHz에 불과하며 VGA 시대 LS 시리즈에 쉽게 도달 할 수 있습니다. 시프트 레지스터가 현재 것으로 완료되면 다음 바이트를 준비해야합니다 (파이프 라인이 들어오는 위치).

텍스트 버퍼와 CG ROM을 구동하기 위해 ~ 25MHz에서 픽셀 클록과 그 중 1/8에서 메모리 클록을 생성 한 다음 해당 메모리와 CG ROM 액세스 항목을 파이프 라인하십시오.

한 가지 더 트릭은 텍스트 버퍼 출력이 주어진 텍스트 줄 내에서 각 줄에 대해 반복되므로 80 바이트의 텍스트를 링 버퍼로 클록 한 다음 다음 7 줄에 대한 램 읽기를 중지 할 수 있습니다 (8 가정) 라인 문자)를 사용하면 CPU 측면에서 80 바이트의 램이 필요하지만 사용 가능한 메모리를 확보 할 수 있습니다.


1

따라서 분명히 작동하지 않습니다. 파이프 라인이 필요합니다.

1) 문자를 메모리에 연속적으로 저장하십시오. 왼쪽 상단에서 시작하십시오.

2) 블랭킹 간격 동안 캐릭터를 가져옵니다. 메모리 순서로 문자를 계속 가져옵니다.

3) 각각의 디코딩 된 문자 + 라인 인덱스를 ROM에 파이프 라인하십시오.

4) ROM 출력을 버퍼로 파이프 라인하십시오.

5) 버퍼를 시프트 레지스터로 파이프 라인하십시오. 이로부터 40ns 간격으로 픽셀을 연속적으로 읽습니다.

(그러면 320ns마다 새로운 문자를 시프트 레지스터에로드해야합니다. 이는 시스템 전체를 파이프 라인하지 않고도 가능합니다.)

6) 수평 블랭킹 동안 줄의 시작 부분으로 돌아가거나 다음 문자로 넘어갑니다 (예 : 다음 줄의 시작 부분).

보너스 기능 : 320ns마다 문자 만 필요하므로 문자 + 컬러 쌍을 읽고 MSDOS 스타일 또는 스펙트럼 스타일 컬러 문자를 수행 할 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.