เป็นไปได้อย่างไรที่ไดรฟ์ VGA แสดงที่ความถี่สัญญาณนาฬิกาสูงเช่นนี้?


12

ฉันกำลังทำงานกับวงจรดิจิตอลโดยใช้ส่วนประกอบแยกเพื่อขับเคลื่อนการแสดงผล 640x480 VGA ในโหมดข้อความ 80x30

สำหรับการแสดงผล 640x480 นาฬิกาพิกเซลคือ 25.175MHz ซึ่งมีระยะเวลาประมาณ 40ns ฉันไม่เข้าใจว่าฉันควรจะให้พิกเซลใหม่แก่จอแสดงผลนี้บ่อยแค่ไหน

สถาปัตยกรรมพื้นฐานสำหรับวงจรของฉันเป็นดังนี้:

  1. ตัวนับไบนารีสำหรับพิกเซลแนวนอนจะนับที่ 25.175MHz ถึง 800 (640 พิกเซลที่มองเห็น + 160 สำหรับระเบียงด้านหน้าซิงค์และระเบียงด้านหลัง) ที่ 800 เพิ่มตัวนับบรรทัดแนวตั้ง (และรีเซ็ตที่ 525 บรรทัด)

  2. การใช้ตำแหน่งแนวนอนและแนวตั้งให้หาพิกัด x, y ของอักขระปัจจุบัน

  3. ใช้ x, y พิกัดของตัวอักษรดัชนีในหน่วยความจำวิดีโอเพื่อดึงตัวอักษร ASCII

  4. ใช้อักขระ ASCII เพื่อจัดทำดัชนีใน ROM อักขระเพื่อรับรูปแบบบิตสำหรับอักขระ

  5. ใช้ขนานกับอนุกรม shift register เพื่อแปลงอักขระ 8 บรรทัดเป็นบิตแต่ละบิตที่ความถี่สัญญาณนาฬิกา

ถ้าคุณทำตามเชนมันจะไป: Counter -> RAM -> ROM -> Parallel กับ Serial Shift Register

เมื่อใช้ส่วนประกอบที่เร็วที่สุดที่ฉันพบการขยายเวลาและการเข้าถึงจะเพิ่มขึ้นประมาณ 15ns + 20ns + 70ns + 15ns = 120ns ซึ่งมากกว่าช่วง 40 40 สำหรับ 25MHz

ที่ความละเอียดและอัตราการรีเฟรชที่สูงขึ้นคุณสามารถมีนาฬิกาพิกเซลสูงกว่า 100MHz ซึ่งจะเป็นช่วงเวลา 10ns

เป็นไปได้อย่างไรที่จะมอบพิกเซลใหม่ให้กับจอแสดงผลทุก ๆ 10ns เมื่อเวลาในการเข้าถึง RAM / ROM นั้นเหนือกว่านั้นโดยที่ไม่ได้พิจารณาสัญญาณอื่น ๆ ทั้งหมดในระบบของคุณ


7
คุณใช้ RAM วิดีโอเฉพาะและนาฬิกาที่ส่งสัญญาณวิดีโอของคุณโดยตรง คุณทำงานเพื่อหาสิ่งที่จะแสดงนานก่อนที่จะแสดงจริง
Hearth

2
ไปอ่านเกี่ยวกับMaximite เพียงแค่ใช้อุปกรณ์ต่อพ่วงของ MCU และตัวต้านทานจำนวนเล็กน้อยเพื่อขับเคลื่อนพอร์ต VGA เริ่มต้นด้วยการตรวจสอบอุปกรณ์ต่อพ่วง PIC32 ที่เขาใช้ ทำงานได้ดี (ฉันมี Maximite อยู่ที่นี่)
จอน

"ตำราวิดีโอราคาถูก" โดย "Don Lancaster"
Jasen

คำตอบ:


17

มีสองเหตุผลหลักที่ทำให้คุณพบกับความท้าทายนี้

ก่อนอื่นคุณกำลังใช้ส่วนที่เก่ากว่าและไม่ต่อเนื่อง (รวมระดับต่ำกว่า) มากกว่าที่เคยถูกใช้ในยุคของ VGA

แต่ต่อไปคุณจะใช้พวกเขาในทางที่ผิดปกติ โดยเฉพาะวิธีการของคุณไม่ได้pipelinedหมายความว่าคุณจะต้องเพิ่มความล่าช้าหลายอย่างเมื่อพิจารณาช่วงเวลาของคุณและทำให้อัตรา

ในทางตรงกันข้ามการออกแบบดิจิตอลแบบซิงโครนัสซึ่งพยายามทำความเร็วให้พยายามทำให้น้อยที่สุดระหว่างรีจิสเตอร์

ในขณะที่รายละเอียดอาจจะแตกต่างกันเล็กน้อยการพูดอย่างหยาบคาย

  • คุณเพิ่มหรือรีเซ็ตที่อยู่จากนั้นไปที่การลงทะเบียน
  • คุณสลักที่อยู่ลงในหน่วยความจำแบบซิงโครนัส
  • คุณสลักเอาท์พุทของหน่วยความจำแบบซิงโครนัส
  • คุณสลักลงในที่อยู่ของเครื่องกำเนิดอักขระซิงโครนัส
  • คุณสลักเอาต์พุตของตัวสร้างอักขระลงในเอาต์พุตรีจิสเตอร์
  • ใช้การค้นหาจานสี ...
  • เข้าสู่ DAC แบบซิงโครนัส ...

เมื่อคุณแยกงานออกมาเป็นแบบนี้คุณจะได้รับหน่วงเวลา combinatorialเพียงครั้งเดียวรวมถึงการหน่วงเวลาการแพร่กระจายและการตั้งค่าการลงทะเบียนและเวลาที่ต้องใช้ให้พอดีกับนาฬิกา

การออกแบบที่สร้างขึ้นด้วยวิธีนี้จะใช้นาฬิกาหลายตัวในการสร้างเอาต์พุต - ความหน่วงแฝงจะสูงกว่าการออกแบบแบบ combinatorial หมดจด แต่มันจะสร้างเอาต์พุตที่ถูกต้องใหม่ในแต่ละรอบของนาฬิกาที่เร็วขึ้นมาก

และนี่คือวิดีโอมันไม่สำคัญว่า CRT กำลังวาดพิกเซลโหลหลังตัวนับพิกเซล - แน่นอนว่าคุณต้องคำนึงถึงเรื่องนี้ในช่วงเวลาของสัญญาณซิงค์เพื่อให้ถูกต้องเมื่อเปรียบเทียบกับข้อมูลจริง ออกมาจาก DAC

ในทางปฏิบัติระบบดิจิตอลที่ซับซ้อนเกือบทั้งหมดทำงานด้วยวิธีนี้เนื่องจากเป็นความคิดที่ดี - จนกระทั่ง CPU ที่ใช้ไปป์ไลน์ต้องพึ่งพาผลการคำนวณก่อนหน้าหรือสาขาที่มีเงื่อนไข ... จากนั้นสิ่งต่าง ๆ น่าสนใจตามที่พวกเขาพูดถึง ในการบรรยายครั้งต่อไปของคลาสระบบดิจิทัล - แต่โชคดีที่สถานการณ์ VGA ของคุณนั้นง่ายกว่ามากโดยเฉพาะอย่างยิ่งถ้าคุณยังไม่ต้องกังวลเกี่ยวกับการฉีกขาดเอฟเฟกต์ถ้าบัฟเฟอร์อักขระเปลี่ยนไปในขณะที่หน้าจอกำลังถูกวาด

เป็นเรื่องจริงถ้าคุณต้องการสร้างสิ่งนี้ให้ทำใน FPGA นั่นจะบังคับความทรงจำแบบซิงโครนัสให้กับคุณถ้าคุณใช้หน่วยความจำภายในหรือ IO แบบซิงโครนัสจะลงทะเบียนถ้าคุณใช้หน่วยความจำภายนอก คุณจะได้รับการผลักดันอย่างมากต่อการออกแบบที่เหมาะสมผ้าของตัวเองจะเร็วกว่าชิ้นส่วนที่ไม่ต่อเนื่องของคุณและแน่นอนว่าถ้าคุณทำผิดพลาดคุณจะต้องใช้นิ้วโป้งนิ้วโป้งในขณะที่มันคอมไพล์มากกว่าใช้สายยาว .


"โดยเฉพาะอย่างยิ่งถ้าคุณยังไม่ต้องกังวลกับการฉีกขาดเอฟเฟกต์หากบัฟเฟอร์ของตัวละครเปลี่ยนไปในขณะที่หน้าจอกำลังถูกดึง" - นั่นเป็นสาเหตุมาจากตัวประมวลผลวิดีโอในวันแรกสุดตัวประมวลผลร่วมมีวิธีแจ้งกระบวนการหลักว่า กำลังทิ้งหน่วยความจำของพวกเขาลงบนหน้าจอและหากพวกเขาต้องการเปลี่ยนบัฟเฟอร์วิดีโอพวกเขาควรทำทันที
John Dvorak

ฉันคิดว่าคุณกำลังยุ่งกับเรื่องนี้มากเกินไป เขาแจ้งว่าเขาใช้ register shift 8 บิตซึ่งเอาต์พุตหนึ่งบิตต่อนาฬิกาพิกเซล สมมุติว่านี่คือการลงทะเบียน shift แบบ 8 บิตพร้อมสลัก นั่นหมายความว่าเขาจะต้องดึงข้อมูลไบต์ใหม่เพียงครั้งเดียวซึ่งเคยมีขนาด 8 พิกเซลซึ่งมีอัตรา 3.125MHz นั่นทำให้คุณทั้งหมด 320ns ได้รับข้อมูลไปยังสลักลงทะเบียน shift ซึ่งยาวกว่า 120ns มากที่เขาบอกว่าจะใช้
Chris_F

สำหรับกรณีโมโนโครมความละเอียดต่ำที่ง่ายมากใช่ระยะเวลาของไบต์จะไม่ท้าทายเกินไป แต่คำถามสำคัญส่วนหนึ่งคือผู้ถามพยายามเข้าใจว่าประสิทธิภาพของระบบ "จริง" ทั่วไปของการแก้ปัญหาที่ไม่น่ารำคาญ เป็นไปได้. และคำตอบก็เหมือนกับระบบดิจิตอลอื่น ๆ ที่มีประโยชน์: เทคโนโลยีที่เร็วกว่าและการออกแบบซิงโครนัสแบบไปป์ไลน์
Chris Stratton

2

เมื่อใช้ส่วนประกอบที่เร็วที่สุดที่ฉันพบการขยายเวลาและการเข้าถึงจะเพิ่มขึ้นประมาณ 15ns + 20ns + 70ns + 15ns = 120ns ซึ่งมากกว่าช่วง 40 40 สำหรับ 25MHz

คุณลืมว่าอะแดปเตอร์กราฟิกจะไม่เพียงวาดพิกเซลเดียว - แต่อย่างน้อยเส้นสแกนเต็ม ดังนั้นนี่จะเป็นปัญหาที่เกิดขึ้นอย่างสมบูรณ์

อย่าลืมว่าฮาร์ดแวร์ที่ผลิตวิดีโอมานานกว่าห้าทศวรรษแล้ว โดยทั่วไปปัญหาของคุณจะได้รับการแก้ไขด้วย RAM ชนิดพิเศษที่คุณแสดงตัวอักษรบนพอร์ตเดียวและอ่านลำดับสัญญาณวิดีโอ DAC ตามลำดับ ฮาร์ดแวร์นั้นเป็นวิธีเร็วกว่าที่คุณมองอยู่

สถาปัตยกรรมพื้นฐานสำหรับวงจรของฉันเป็นดังนี้:

  1. ตัวนับไบนารีสำหรับพิกเซลแนวนอนจะนับที่ 25.175MHz ถึง 800 (640 พิกเซลที่มองเห็น + 160 สำหรับระเบียงด้านหน้าซิงค์และระเบียงด้านหลัง) ที่ 800 เพิ่มตัวนับบรรทัดแนวตั้ง (และรีเซ็ตที่ 525 บรรทัด)

  2. การใช้ตำแหน่งแนวนอนและแนวตั้งให้หาพิกัด x, y ของอักขระปัจจุบัน

ไม่ทำไมคุณจะทำอย่างนั้น? คุณเพียงแค่ใส่แถวพิกเซลของคุณลงในพื้นที่หน่วยความจำต่อเนื่องและวางมันลงไปใน DAC เชิงเส้นของคุณ - ถ้ามันเกี่ยวกับการใช้งาน CPU / MCU คุณจะไม่ปล่อยให้ CPU ทำเช่นนั้น แต่เป็นหน่วย DMA ที่ตั้งโปรแกรมไว้ ไม่ต้องทำอะไรนอกจากรับค่าหนึ่งจากค่าอื่นแล้วนำออกมาเช่นพอร์ตข้อมูลแบบขนานโดยไม่ต้องมีการโต้ตอบกับซีพียูหลัก

  1. ใช้ x, y พิกัดของตัวอักษรดัชนีในหน่วยความจำวิดีโอเพื่อดึงตัวอักษร ASCII

อาคุณต้องการแสดงผลทันที - ตัวเลือกที่ดี แต่ผิดปกติในราคา RAM ที่ทันสมัย คุณเพียงแค่ทำให้ตัวละครกลายเป็นบัฟเฟอร์เฟรมไว้ล่วงหน้าหรือหากอุปกรณ์ของคุณมีรูปร่างเพรียวบางมากก็จะส่งไปยังท่อโดยตรง (ดูคำอธิบาย DMA ของฉันด้านบน) แถวอักขระไปยัง DAC


1
ในขณะที่สิ่งที่ทันสมัยมีแนวโน้มที่จะชอบ framebuffers ที่แสดงผลล่วงหน้าพวกเขาเห็นได้ชัดว่าเป็นตัวเลือกที่ไม่ดีถ้าคุณกำลังพยายามทำงานโดยไม่ต้องใช้ RAM มาก หากคุณกำลังทำสิ่งนี้ใน FPGA คุณสามารถทำให้เครื่อง DMA รับที่อยู่จากแผนที่เซลล์อักขระแล้วอ่านจากร่ายมนตร์อักขระที่เกี่ยวข้อง
.. GitHub หยุดช่วยน้ำแข็ง

เห็นด้วยอย่างเต็มที่ที่นี่! ดังนั้นส่วนคำตอบของฉันในคำถามที่สาม
Marcus Müller

2

นอกเหนือจากการวางท่อ (ซึ่งเป็นสิ่งที่คุณควรทำอย่างมาก) คุณกำลังพลาดสิ่งสำคัญ ....

การลงทะเบียนอนุกรมในการลงทะเบียนอนุกรมขนานนั้นมีจุดที่ 25 Mhz แปลก ๆ แน่นอน แต่ถ้าตัวละครของคุณมีความกว้าง 8 พิกเซลสัญญาณเข้าจะอยู่ที่ ~ 3.2MHz ซึ่งง่ายต่อการเข้าถึงสำหรับซีรีย์ยุคยุค LS สำหรับทุกสิ่งนั้น คุณจำเป็นต้องมีไบต์ต่อไปให้พร้อมเมื่อการลงทะเบียน shift เสร็จสิ้นด้วยรายการปัจจุบัน (นี่คือที่มาของไพพ์ไลน์)

สร้างนาฬิกาพิกเซลที่ ~ 25MHz และนาฬิกาหน่วยความจำที่ 1 / 8th ของนั้นเพื่อขับบัฟเฟอร์ข้อความและ CG ROM แล้วไปที่หน่วยความจำและ CG ROM เข้าถึงสิ่งต่างๆ

เคล็ดลับอีกข้อหนึ่งเอาท์พุทบัฟเฟอร์ข้อความจะถูกทำซ้ำสำหรับแต่ละบรรทัดภายในบรรทัดของข้อความที่กำหนดดังนั้นบางทีคุณสามารถนาฬิกา 80 ไบต์ของข้อความลงในบัฟเฟอร์แหวนแล้วหยุดอ่าน RAM สำหรับ 7 บรรทัดถัดไป (สมมติว่า 8 อักขระบรรทัด) สิ่งนี้ช่วยให้คุณเพิ่มหน่วยความจำเพื่อให้ CPU ใช้งานโดยมีค่าใช้จ่ายที่ต้องใช้ RAM 80 ไบต์ที่แขวนอยู่ด้านข้างของสิ่งของ


1

เห็นได้ชัดว่ามันใช้งานไม่ได้ คุณต้องการท่อส่ง

1) จัดเก็บอักขระต่อเนื่องในหน่วยความจำ เริ่มที่ด้านซ้ายบน

2) ดึงตัวอักษรในช่วงเวลาว่างเปล่า ดำเนินการดึงอักขระต่อไปตามลำดับหน่วยความจำ

3) ไปป์ไลน์อักขระที่ถอดรหัสแต่ละตัวพร้อมดัชนีบรรทัดลงใน ROM

4) ไปป์ไลน์ ROM เอาต์พุตลงในบัฟเฟอร์

5) ไปป์ไลน์บัฟเฟอร์ลงใน shift register อ่านพิกเซลอย่างต่อเนื่องในช่วงเวลา 40ns จากนี้

(นั่นแปลว่าคุณต้องโหลดตัวละครใหม่เข้าไปใน shift register ทุก ๆ 320ns ซึ่งอาจทำได้โดยไม่ต้องไปป์ไลน์ที่เหลือทั้งหมดของระบบ)

6) ระหว่างการ blanking แนวนอนให้กลับไปที่จุดเริ่มต้นของบรรทัดหรือเลื่อนไปที่อักขระถัดไป (เช่นเริ่มต้นบรรทัดถัดไป)

คุณสมบัติโบนัส: เนื่องจากคุณต้องการเพียงตัวอักษรทุก ๆ 320 มิลลิวินาทีคุณสามารถอ่านตัวอักษร + คู่สีและทำทั้งตัวอักษรสไตล์ MSDOS หรือสไตล์สเปกตรัม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.