หากคุณใช้โฟลว์การออกแบบ Modular Logic Lock Region ในโครงการของคุณ คุณอาจเลือกทําพิน I/O ทั้งหมดในพิน I/O เสมือนของโมดูล เป็นวิธีการนําเข้าโมดูลในการออกแบบระดับสูงสุดได้อย่างง่ายดาย นอกจากนี้ หากคุณต้องการคอมไพล์คอร์ IP เพื่อดูว่ามีการใช้ทรัพยากรจํานวนเท่าใด แต่ใช้พินมากเกินไปสําหรับอุปกรณ์เป้าหมายของคุณ ทําให้พินเสมือนอาจอนุญาตให้คอร์พอดี
ขั้นตอนง่ายๆ ต่อไปนี้ทําให้พินทั้งหมดในพิน I/O เสมือนการออกแบบของคุณ ประการแรก มีการสังเคราะห์การออกแบบเพื่อตรวจสอบว่าโหนดใดเป็นพิน ถัดไป ชุดรหัสชื่อจะถูกตั้งค่าให้สอดคล้องกับพินในการออกแบบ จากนั้นจะมีการนําการกําหนดVIRTUAL_PINไปใช้กับพินทุกพิน สุดท้ายคําสั่ง export_assignments เขียนงานที่ได้รับมอบหมายใหม่ทั้งหมดไปยังไฟล์การตั้งค่า Quartus II (.qsf) ของโครงการ
ตัวอย่างใช้คําสั่ง get_names และ get_name_info ซึ่งมีให้มาตั้งแต่เวอร์ชัน 4.0 ของซอฟต์แวร์ Quartus II (เวอร์ชัน 2.0 ของ แพ็คเกจ ::quartus::p roject) ดูตัวอย่างสุดท้ายในหน้านี้สําหรับรหัสที่จะทํางานเริ่มต้นด้วยเวอร์ชัน 3.0 ของซอฟต์แวร์ Quartus II และมีความสามารถขั้นสูงมากขึ้น
load_package flow proc make_all_pins_virtual {} { execute_module -tool map set name_ids [get_names -filter * -node_type pin] foreach_in_collection name_id $name_ids { ตั้งค่าpin_name [get_name_info -info full_path $name_id] post_message "การมอบหมายVIRTUAL_PINไปยัง $pin_name" set_instance_assignment -to $pin_name -name VIRTUAL_PIN ON } export_assignments }
การปรับปรุงรหัสตัวอย่าง
มีหลายวิธีที่สามารถปรับปรุงโค้ดตัวอย่างได้
ลบการมอบหมายVIRTUAL_PINที่มีอยู่
คุณสามารถเพิ่มคําสั่งต่อไปนี้ไปที่จุดเริ่มต้นของขั้นตอนเพื่อลบการบ้านVIRTUAL_PINที่มีอยู่ทั้งหมด นี่เป็นขั้นตอนที่เป็นประโยชน์เพื่อให้แน่ใจว่าการบ้านอยู่ในสถานะที่ทราบแล้ว เพิ่มคําสั่งนี้ก่อนคําสั่งexecute_module
remove_all_instance_assignments -name VIRTUAL_PIN
ยกเว้นพินบางตัวด้วยตนเอง เช่น นาฬิกา
สําหรับซอฟต์แวร์ Quartus II เพื่อดําเนินการปรับแต่งการกําหนดเวลาให้เหมาะสมกับการออกแบบ นาฬิกาต้องเชื่อมต่อกับพิน I/O ระดับสูงสุดในอุปกรณ์เป้าหมาย และนาฬิกาต้องมีการตั้งค่านาฬิกา ซึ่งเป็นเรื่องจริง แม้ว่าพินอื่นๆ ทั้งหมดในการออกแบบจะเป็นพิน I/O เสมือนก็ตาม ดังนั้นตัวอย่างพื้นฐานข้างต้นป้องกันไม่ให้ซอฟต์แวร์ Quartus II ทําการเพิ่มประสิทธิภาพเวลาในระหว่างการคอมไพล์เนื่องจากพินทั้งหมด รวมถึงนาฬิกาจะมีการมอบหมายVIRTUAL_PIN
คุณสามารถเพิ่มพารามิเตอร์ไปยังขั้นตอนที่ยอมรับรายการสัญญาณที่แยกจากการบ้านVIRTUAL_PIN รายการนี้มักจะเป็นชื่อของพินนาฬิกาในการออกแบบของคุณ ตัวอย่างต่อไปนี้ยอมรับรายชื่อที่จะไม่รวม นอกจากนี้ยังมีคําสั่งในการลบการบ้านVIRTUAL_PINที่มีอยู่ที่กล่าวถึงข้างต้น
แพคเกจขั้นตอนload_packageต้องใช้ cmdline proc make_all_pins_virtual { args } { set options {\ { "exclude.arg" "" "รายการสัญญาณที่แยก" } \ ชุดอาร์เรย์ที่เลือก [::cmdline::getoptions quartus(0 $options) remove_all_instance_assignments -name VIRTUAL_PIN execute_module -ชุดแผนผังเครื่องมือ name_ids [get_names -filter * -node_type pin] foreach_in_collection name_id $name_ids { ตั้งค่าpin_name [get_name_info -info full_path $name_id] หาก { -1 == [lsearch -exact $opts(ไม่รวม) $pin_name] } { post_message "การมอบหมายVIRTUAL_PINไปยัง $pin_name" set_instance_assignment -to $pin_name -name VIRTUAL_PIN ON } อื่น { post_message "ข้ามการมอบหมายVIRTUAL_PINไปยัง $pin_name" } } export_assignments }
คุณสามารถเรียกขั้นตอนด้วยคําสั่งนี้ ตัวอย่างนี้อนุมานว่าคุณมีนาฬิกาสองนาฬิกาในการออกแบบที่ใช้ชื่อว่า clk_a และ clk_b
make_all_pins_virtual -ไม่รวม { clk_a clk_b }
ระบุ & จัดการนาฬิกาโดยอัตโนมัติ
ตัวอย่างก่อนหน้าที่จะไม่รวมสัญญาณบางตัวจะมีข้อเสียที่จะต้องป้อนด้วยมือ เป็นไปได้ที่จะตรวจสอบสัญญาณนาฬิกาด้วยคําสั่งในแพ็คเกจ ::quartus:advanced_timing แพคเกจนี้พร้อมใช้งานสําหรับการโหลดเฉพาะ quartus_tan ปฏิบัติการ ดังนั้นคุณต้องใช้ quartus_tan เรียกใช้สคริปต์ด้วยตัวอย่างต่อไปนี้ คําสั่งในตัวอย่างนี้ทั้งหมดรองรับตั้งแต่เวอร์ชัน 3.0 ของซอฟต์แวร์ Quartus II
การระบุนาฬิกาโดยอัตโนมัติมีข้อได้เปรียบที่ช่วยให้คุณสามารถสมัครงานUSE_CLK_FOR_VIRTUAL_PINโดยอัตโนมัติได้ คุณสามารถใช้การบ้านUSE_CLK_FOR_VIRTUAL_PINร่วมกับการมอบหมายVIRTUAL_PINเพื่อเชื่อมโยงการตั้งค่านาฬิกากับนาฬิกาในการออกแบบของคุณ ซึ่งจะช่วยให้ Quartus II Fitter มีข้อมูลที่ถูกต้องเกี่ยวกับข้อกําหนดเวลาเมื่อคุณคอมไพล์การออกแบบด้วยพิน I/O เสมือน สําหรับข้อมูลเพิ่มเติมเกี่ยวกับการกําหนดนี้ โปรดดูหัวข้อ ตัวเลือกตรรกะนาฬิกาเสมือน ใน วิธีใช้ Quartus II
ขั้นตอนตัวอย่างต่อไปนี้ทําให้พิน I/O ทั้งหมดในพิน I/O เสมือนการออกแบบของคุณ นอกจากนี้ยังทําการบ้านตั้งนาฬิกาเสมือนตามความเหมาะสมอีกด้วย
รหัสตัวอย่างแรกสังเคราะห์การออกแบบของคุณ จากนั้น Netlist กําหนดเวลาที่มีอยู่จะพยายามลบรายการจับเวลาที่มีอยู่ก่อนสร้างเน็ตลิสต์ใหม่ คําสั่ง get_timing_nodes สร้างชุดโหนดสองชุดจาก Netlist กําหนดเวลา: pin_idsและclk_ids คอลเลกชันทั้งสองมีแต่เพียงผู้เดียว ไม่มีโหนดในคอลเลกชัน clk_ids อยู่ในคอลเลกชัน pin_ids แม้ว่านาฬิกาจะอยู่บนพิน I/O ก็ตาม
ลูป foreach_in_collection แรกจะได้รับชื่อของพินแต่ละพินในการออกแบบ (ไม่รวมพินนาฬิกา) และทําการบ้านVIRTUAL_PIN
ลูป foreach_in_collection ที่สองจะได้รับชื่อของนาฬิกาแต่ละนาฬิกาในการออกแบบ คําสั่ง get_instance_assignment จะดึงการตั้งค่านาฬิกาที่เกี่ยวข้องหากมีอยู่ หากไม่มีการตั้งค่านาฬิกา (สตริงไม่ว่างเปล่า) สคริปต์จะทําการมอบหมายUSE_CLOCK_FOR_VIRTUAL_PINให้กับชื่อนาฬิกาด้วยค่าของชื่อการตั้งค่านาฬิกา
make_all_pins_virtualการกําหนดเวลาload_packageโฟลว์ load_package load_package advanced_timing proc { } { { remove_all_instance_assignments -name VIRTUAL_PIN remove_all_instance_assignments -name USE_CLK_FOR_VIRTUAL_PIN -execute_moduleรายละเอียดแผนที่เครื่องมือ { delete_timing_netlist } ชุด create_timing_netlist -post_map ตั้งค่าpin_ids [get_timing_nodes -type pin] ตั้งค่าclk_ids [get_timing_nodes -type clk] # ทําให้การมอบหมายVIRTUAL_PINไปยังทุกพินใน design foreach_in_collection pin_id $pin_ids { ตั้งค่าpin_name [get_timing_node_info -info name $pin_id] post_message "การมอบหมายVIRTUAL_PINไปยัง $pin_name" set_instance_assignment -to $pin_name -name VIRTUAL_PIN ON } # สําหรับแต่ละนาฬิกาในการออกแบบ ตรวจสอบว่านาฬิกาได้รับ การกําหนดค่า CLOCK_SETTINGSที่เกี่ยวข้องหรือไม่ foreach_in_collection clk_id $clk_ids { ตั้งค่าclk_name [get_timing_node_info -info name $clk_id] ตั้งค่าclk_stgs [get_instance_assignment -to $clk_name \CLOCK_SETTINGS] # หากมีการตั้งค่านาฬิกาสําหรับนาฬิกานี้ ให้ ทําการบ้าน #USE_CLK_FOR_VIRTUAL_PIN หาก { ![ สตริงเท่ากับ "" $clk_stgs] } { post_message "การมอบหมายUSE_CLK_FOR_VIRTUAL_PIN \ ไปยัง $clk_name ที่มีค่า $clk_stgs" set_instance_assignment -to $clk_name \ -name USE_CLK_FOR_VIRTUAL_PIN $clk_stgs } } export_assignments }