2-ff synchronizer ให้การประสานที่เหมาะสมอย่างไร


9

การใช้ตัวซิงโครไนซ์แบบ 2-ff เป็นมาตรฐานสำหรับสัญญาณข้ามขอบเขตนาฬิกา และมีกระดาษ / ตัวเลขมากมายแสดงให้เห็นถึงกลไกเช่นนี้:ป้อนคำอธิบายรูปภาพที่นี่

ดูเหมือนBCLKสามารถลิ้มลองชีพจรของADATครั้งเดียว (ที่สองขอบของการเพิ่มขึ้นBCLK ) ซึ่งเป็นสาเหตุที่ทำให้การส่งออกใน metastability bq1_dat วิธีการสามารถbq1_datลิ้มลอง "สูง" บนขอบนาฬิกาที่ใช้งานต่อไปหรือไม่


นอกเหนือจากคำถามของฉันฉันต้องการเพิ่มสิ่งที่ฉันคิดว่าสัญญาณจะผ่านไปยังโดเมนนาฬิกาอื่นได้อย่างปลอดภัย (สมมติว่า 2-FF นั้นเพียงพอต่อความต้องการ MTBF) โปรดแก้ไขฉันหากมีข้อผิดพลาด

ป้อนคำอธิบายรูปภาพที่นี่

ps: สถานะที่แพร่กระจายได้ไม่แสดง "รูปคลื่น" แต่เป็นระดับที่ไม่ใช่ '1' หรือ '0' รูปต่อไปนี้แสดงตัวอย่างของเอาต์พุต metastableป้อนคำอธิบายรูปภาพที่นี่

ร่างเดิมมาจากเอกสารประกอบการบรรยายสำหรับ EE108A บรรยาย 13: metastability และการประสานข้อมูลความล้มเหลว (โอ๊ยเมื่อดี flip-flop ไปแย่)โดย WJ Dally


4
ฉันแค่อยากจะบอกว่าไดอะแกรมที่แสดงเอาท์พุท metastable "หลงไปรอบ ๆ " นั้นทำให้เข้าใจผิดอย่างยิ่ง นั่นไม่ใช่ความสามารถในการแพร่กระจายของข้อมูล เมื่อ FF ไปสู่การแพร่กระจายได้แรงดันไฟฟ้าจะถูกส่งไปยังแรงดันไฟฟ้ากลางที่เฉพาะเจาะจงหนึ่งตัว หลังจากเวลาที่คาดเดาไม่ได้บางอย่างแรงดันไฟฟ้าจะแกว่งสูงหรือต่ำและวิธีการที่จะไปก็คาดเดาไม่ได้
Dave Tweed

@Dave Tweed ♦ขอบคุณสำหรับความคิดเห็น ในเอกสารเกือบทั้งหมดที่ฉันได้อ่านเกี่ยวกับการแพร่กระจายของข้อมูลฉันเห็นรูปคลื่น "เดินไปรอบ ๆ " ฉันค้นหาไปรอบ ๆ และพบโพสต์ ( หาก flip flop มีการละเมิดการตั้งค่าและไปที่ metastable จะรับประกันได้หรือไม่ว่าจะเข้าสู่ค่าอินพุตเมื่อเสร็จสิ้นการสั่นหรือไม่? ) ที่มีการถ่ายภาพจาก o-scope ลิงค์ไปยังการอ้างอิงดั้งเดิมของตัวเลขนั้นรวมอยู่ในโพสต์นั้น
fiedel

ใช่นั่นแสดงให้เห็นถึงจุดของฉันอย่างสมบูรณ์แบบและการนำเสนอ Powerpoint มาจากมีข้อมูลที่ดีมากมายในนั้น
Dave Tweed

คำตอบ:


8

คำตอบง่ายๆคือพวกเขาไม่ได้ทำด้วยตัวเอง synchroniser นั้นไม่ได้มีไว้เพื่อให้แน่ใจว่าข้อมูลได้รับการขัดจังหวะ แต่ให้แน่ใจว่าคุณไม่ได้ลงเอยด้วยสัญญาณ metastable ที่ส่งสัญญาณอื่น ๆ จำนวนมากและก่อให้เกิดปัญหา FF ที่สองในขณะที่แผนภาพแสดงให้เห็นถึงการจับเอาท์พุท FF แรก metastable และป้องกันไม่ให้มันเผยแพร่เพิ่มเติมผ่านการออกแบบ

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

  1. Trigger Signals - หรือสัญญาณใด ๆ ที่เป็นสัญญาณพัลส์ซึ่งต้องเริ่มทำงานอย่างอื่น สิ่งเหล่านี้มักไม่มีข้อมูลและสิ่งที่คุณสนใจก็คือมีขอบที่เพิ่มขึ้นเพื่อเริ่มสิ่งที่เกิดขึ้นในโดเมนนาฬิกาอื่น ในการทำให้สิ่งเหล่านี้ข้ามคุณจะต้องใช้ตัวประสาน (โดยหลักแล้วจะทำสิ่งที่แสดงในแผนภาพของคุณ) แต่คุณต้องเพิ่มอีกเล็กน้อย

    ตัวเลือกที่ง่ายที่สุดคือการขยายพัลส์ - โดยหลักแล้วคุณต้องแน่ใจว่าพัลส์อินพุทนั้นมากกว่า 1 ช่วงเวลาของนาฬิกาปลายทาง (ควรจะยาวกว่า 1 รอบโดยอย่างน้อยก็ใหญ่กว่าการตั้งค่าและถือเวลาสำหรับการลงทะเบียนปลายทาง) . ตัวอย่างเช่นหากคุณเปลี่ยนจากนาฬิกา 20MHz เป็นนาฬิกา 15MHz คุณจะตรวจสอบให้แน่ใจว่าชีพจรของคุณเป็นสองรอบนาฬิกาที่อินพุตซึ่งจะช่วยให้มั่นใจว่าจะได้รับการนำเสนอไปยังนาฬิกาปลายทางและไม่สูญหาย นอกจากนี้ยังตอบคำถามของคุณในการรับประกันสัญญาณที่จะผ่าน หากพัลส์กว้างกว่าช่วงเวลาของนาฬิกาปลายทางหนึ่งนั่นหมายความว่าถ้ามันกระจายไปที่ขอบนาฬิกาแรกและสิ้นสุดการมองว่าเป็น 0 จากนั้นบนขอบนาฬิกาที่สองมันจะจับพัลส์แน่นอน

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

  2. รถบัสควบคุม - หรือประเภทของข้อมูลบัส สิ่งเหล่านี้จะยากขึ้นเพราะถ้าคุณมีสตรีมข้อมูลแบบหลายบิตที่ต้องซิงค์อยู่เสมอ ในกรณีนี้สิ่งที่คุณต้องทำคือใช้สิ่งที่เรียกว่า "การจับมือกัน" โดยทั่วไปคุณโหลดข้อมูลของคุณบนนาฬิกาแหล่งที่มาและถือไว้ จากนั้นคุณส่งสัญญาณคำขอ (เช่นเดียวกับใน 1) ผ่านตัวประสาน เมื่อสัญญาณการร้องขอข้ามคุณทราบว่าบัสข้อมูลจะถูกทำให้เสถียรในโดเมนปลายทาง จากนั้นคุณสามารถบันทึกลงในธนาคารที่ลงทะเบียนในปลายทาง ปลายทางจะส่งพัลส์ตอบรับกลับมาอีกครั้งเพื่อแจ้งแหล่งที่มาว่าสามารถโหลดคำถัดไป

    คุณจะใช้รถบัสประเภทนี้ถ้าคุณต้องการส่งคำควบคุมไปยังนาฬิกาปลายทางที่คุณจำเป็นต้องรู้ว่ามันได้รับก่อนที่จะส่งอีก (เช่นถ้าคุณกำลังส่งคำสั่งให้ทำอะไร)

  3. Data บัส - สำหรับข้อมูลที่คุณมีแหล่งข้อมูลที่คายข้อมูลออกมาอย่างต่อเนื่องหรือระเบิดคุณจะดีกว่าในการใช้ FIFO มากกว่า synchronisers FIFO ใช้หน่วยความจำสองนาฬิกาเพื่อเก็บข้อมูลพร้อมกับตัวนับเพื่อติดตามจำนวนข้อมูลที่อยู่ใน FIFO คุณเขียนข้อมูลลงใน FIFO เมื่อมีที่ว่างแล้วเพิ่มที่อยู่การเขียน โดยทั่วไปแล้วที่อยู่นี้จะถูกเข้ารหัสในรูปแบบ "การเข้ารหัสสีเทา" ซึ่งทำให้แน่ใจได้ว่าการเพิ่มที่อยู่ในแต่ละครั้งจะทำให้เกิดเพียงอันเดียวบิตในแอดเดรสบัสเพื่อเปลี่ยน (หมายความว่าคุณไม่จำเป็นต้องซิงโครไนซ์หลายบิต) ที่อยู่นี้จะถูกโอนไปยังโดเมนปลายทาง (ผ่านหนึ่งในเครือข่ายซิงโครไนซ์ของคุณ) ซึ่งจะถูกเปรียบเทียบกับที่อยู่ที่อ่าน หากมีข้อมูลใน FIFO ก็สามารถอ่านได้จากหน่วยความจำโดยใช้พอร์ตนาฬิกาปลายทาง ที่อยู่ในการอ่านนั้นเป็นรหัสสีเทาในทำนองเดียวกันและส่งกลับไปยังแหล่งข้อมูลผ่านทางซิงโครไนซ์อื่นเพื่อให้พอร์ตการเขียนสามารถคำนวณได้หากมีที่ว่างใน FIFO

  4. รีเซ็ตสัญญาณ - โดยทั่วไปแล้วจะใช้เวอร์ชันซิงโครไนเซอร์ที่แก้ไขแล้วในสิ่งที่รู้ว่าเป็น "Asynchronous Assert, Synchronous Deassert" ในเวอร์ชั่นดัดแปลงนี้อินพุตข้อมูลไปยังฟล็อปฟล็อปแรกเชื่อมโยงกับ GND และสัญญาณการรีเซ็ตขาเข้าจะเชื่อมต่อกับสัญญาณที่ตั้งไว้ล่วงหน้าแบบอะซิงโครนัสของฟลิปฟล็อปแต่ละตัวใน synchroniser ซึ่งส่งผลให้สัญญาณเอาท์พุทซึ่งไม่ตรงกันทั้งหมดเมื่อสัญญาณสูง แต่โซ่ synchroniser ทำให้แน่ใจว่าสัญญาณนาฬิกาพร้อมกันในระดับต่ำโดยการตอกบัตรผ่านศูนย์ในห่วงโซ่การลงทะเบียน

    synchroniser ประเภทนี้แย่มากสำหรับข้อมูลและการควบคุม แต่เหมาะอย่างยิ่งในการรีเซ็ตสัญญาณ หากปลายทางปลายทางทั้งหมดดึงข้อมูลผลลัพธ์ของสายโซ่นี้ไปยังอินพุตรีเซ็ตแบบอะซิงโครนัสของการลงทะเบียนใด ๆ ในโดเมนก็มีความกังวลเล็กน้อยเกี่ยวกับความสามารถในการแพร่กระจายของการยืนยัน (แม้ว่าจะเป็นแบบอะซิงโครนัส) เนื่องจากการลงทะเบียนทั้งหมด จากนั้นเมื่อสัญญาณการรีเซ็ตถูก deasserted ในโดเมนต้นทางมันจะทำการซิงโครไนซ์ในโดเมนปลายทางซึ่งหมายความว่ารีจิสเตอร์ทั้งหมดออกจากการรีเซ็ตในรอบสัญญาณนาฬิกาเดียวกัน (แทนที่จะเป็น +/- 1 รอบถ้ามันเป็นแบบอะซิงโครนัส


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


นอกจากคำตอบของทอมแล้วฉันต้องการเพิ่มการอ้างอิงถึงPoCซึ่งมีการนำไปใช้งานสำหรับกรณีเหล่านี้ เอกสาร Synchronizerที่มีอยู่บน RTD เพิ่มเติมจากทฤษฎีการเชื่อมโยง flip-flop 2 สำหรับการซิงโครไนซ์ 2-FF พื้นฐาน PoC ยังมีการใช้งานเฉพาะ ( sync_Bits) สำหรับ Xilinx และ Altera FPGAs เพื่อปรับปรุงพฤติกรรมการแพร่กระจาย ซิงโครไนซ์ 2-FF ใช้ในsync_Strobeการสร้างซิงโครไนซ์ที่ซับซ้อนมากขึ้นสำหรับพัลส์
Paebbels

ขอบคุณสำหรับการแนะนำอย่างละเอียดเกี่ยวกับกลยุทธ์การซิงโครไนซ์ ภาพนี้มาจาก "เทคนิคการออกแบบและตรวจสอบโดเมนผ่านนาฬิกาข้ามโดเมน (CDC) โดยใช้ systemverilog" โดย Clifford E. Cummings ฉันเข้าใจว่าสำหรับสัญญาณหนึ่งบิตความกว้างจะต้องมีอย่างน้อย 1 รอบนาฬิกา + เวลาตั้งค่า + เวลาที่ถือของด้านรับเพื่อให้ผ่านได้อย่างปลอดภัย ในภาพนี้เกณฑ์นี้ไม่เป็นที่น่าพอใจเนื่องจากชีพจรของ adat ถูกสุ่มตัวอย่างโดยตัวอย่าง bclk เพียงครั้งเดียวบนขอบที่ตกลงมาซึ่งทำให้ bq1_dat สามารถแพร่กระจายได้
fiedel

... ดังนั้นการอ่าน bq1_dat ที่ขอบที่เพิ่มขึ้นถัดไปของ bclk อาจเป็น '0' หรือ '1' ดังนั้นการซิงโครไนซ์ในภาพจึงดูเหมือนจะไม่สำเร็จ ฉันถูกไหม?
fiedel

@ Paebbels ขอบคุณสำหรับการอ้างอิง จะดู =)
fiedel

คุณควรแก้ไขสิ่งนี้ในคำถามของคุณไม่ใช่โพสต์เป็นคำตอบ แต่โดยพื้นฐานแล้วใช่คุณอาจหรืออาจไม่ได้รับ 1 ในผลลัพธ์ในตัวอย่างนั้น
Tom Carpenter

1

1) การใช้รูปวาดของคุณเป็นตัวอย่าง aclk และ bclk ไม่ตรงกันกัน กล่าวอีกนัยหนึ่งพวกเขามีแหล่งนาฬิกาที่แตกต่างกัน พวกเขากำลังแสดง adat เป็นข้อมูลที่ถูกต้อง แต่ทำข้อมูลให้ตรงกันกับ aclk เท่านั้น นี่คือที่ที่ bclk synchronizer เข้ามาเล่น

2) รูปวาดนี้สมมติว่าเป็นสถานการณ์ที่เลวร้ายที่สุดโดยที่ bq1_dat เป็นเอาต์พุตยุ่งเพราะ bq1 FF จับส่วนหนึ่งของจุดสิ้นสุดของข้อมูลเพียงส่วนเดียวเท่านั้นสร้างสถานะ metastable ซึ่งผลลัพธ์มักเป็นขยะ นี่คือเคล็ดลับ Bq2 มี bclk เช่นเดียวกับ bq1 แต่ใช้เวลา 2 รอบนาฬิกาของ bclk สำหรับข้อมูลที่จะผ่านและปรากฏที่ bq2_dat

3) bclk แรกที่จับส่วนหนึ่งของข้อมูลทำให้เกิดผลลัพธ์ที่ยุ่งเหยิง แต่ bclk ตัวที่สองคือหนึ่งรอบสัญญาณนาฬิกาต่อมามีเวลาเพียงพอสำหรับข้อมูลที่ไม่ชัดเจนจาก bq1_dat เพื่อชำระให้อยู่ในสถานะสูงหรือต่ำ ชีพจรยุ่ง bq1_dat กินเวลานานพอสำหรับ bq2 ในการจับลอจิกที่ถูกต้อง '1' (ตรรกะสูง) และส่งต่อไปยัง bq2_dat ว่าเป็นข้อมูลที่ถูกต้องและซิงโครไนซ์ในขณะนี้ (ตรรกะสูง)

4) ดาวน์สตรีมนาฬิกาที่ใช้ bclk จะมีการซิงโครไนซ์ข้อมูลเพื่อทำงานกับ แจ้งให้ทราบว่ามีเพียง FF BCLK แรกที่มีการจัดการกับรัฐ ผลลัพธ์อาจเป็นตรรกะต่ำถ้า adat เป็นเพียงปิโกหรือนาโนวินาทีสายเกินไป โปรดจำไว้ว่า flip-flop ตัวอย่างการป้อนข้อมูลเฉพาะบนขอบที่เพิ่มขึ้นของนาฬิกา เกิดอะไรขึ้นก่อนหรือหลังขอบที่เพิ่มขึ้นจะถูกละเว้น


โปรดทราบว่าการหน่วงเวลา bclk ให้การวัดความน่าจะเป็นเท่านั้นและจำนวนที่แน่นอนขึ้นอยู่กับทั้งเทคโนโลยี FF และระยะเวลา bclk ในบางกรณีความละเอียดสูง 3 หรือมากกว่าอาจจำเป็นต้องได้รับอัตราข้อผิดพลาดลงไปถึงระดับที่ยอมรับได้
WhatRoughBeast

@WhatRoughBeast ฉันรู้ว่าในสถานการณ์กรณีที่เลวร้ายที่สุดของขั้นตอนการซิงค์ที่จำเป็นจำนวนมากรวมถึงการกรองแบบดิจิตอล เห็นได้ชัดว่าคำตอบของฉันง่ายเกินไป
Sparky256

@ Sparky256 ปริศนาตัวฉันคืออะไร 3) ในความคิดเห็นของคุณ bq2 สามารถจับตัว '1' ได้อย่างไรเมื่อ bq1_dat อยู่ในสถานะ metastable
fiedel

@fiedel มีสองสิ่งที่ทำให้ bq2 สามารถจับภาพอินพุตที่สะอาด (อย่างน้อย) ก่อนอื่นสถานะ metastable ต้องคงอยู่สำหรับรอบสัญญาณนาฬิกาเต็ม ประการที่สองค่า metastable (หลอกกลาง - รถไฟ) จาก bq1 อาจไม่น่า (หรือปรับให้เหมาะสมเพื่อหลีกเลี่ยง) จะอยู่ในหน้าต่างที่จะทำให้ bq2 จะ metastable - แต่ส่วนใหญ่เป็นคนแรกของเหล่านี้ สมมติว่าเทคโนโลยีส่งผลให้โอกาสในการแพร่กระจาย 5% ยังคงมีอยู่นานพอ สเตจซิงค์ 3-FF จะลดค่านี้เป็น 0.25% เนื่องจากเซลล์ทั้งสองต้องล้มเหลว เมสซี่กำลังใช้การเบี่ยงเบนเอกซ์โปเนนเชียลที่กำหนดอย่างชัดเจนจากสถานะที่เกือบจะเสถียร
Sean Houlihane

@SeanHoulihane ขอบคุณสำหรับคำอธิบาย คำว่า 'ขอบที่เพิ่มขึ้น' ทำให้เกิดความสับสนเนื่องจากหน้าต่างของการรับข้อมูล (metastable หรือเสถียร) อยู่ที่จุดกึ่งกลางของขอบที่เพิ่มขึ้นซึ่งใช้เวลาเพียงไม่กี่วินาทีของ pico หรือ nano เท่านั้น เฉพาะในช่วงเวลานั้นเท่านั้นคือข้อมูลอินพุตที่ตรรกะ '1' หรือ '0' ไม่ว่าจะเป็น metastable หรือเสถียรขึ้นอยู่กับระดับแรงดันไฟฟ้าของมันเมื่อเทียบกับเกณฑ์ของ IC สำหรับตรรกะ 1 หรือ 0
Sparky256
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.