VHDL: จำนวนเต็มสำหรับการสังเคราะห์


17

ฉันสับสนเล็กน้อยถ้าฉันควรใช้จำนวนเต็มใน VHDL สำหรับสัญญาณสังเคราะห์และพอร์ต ฯลฯ

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

ฉันได้ไปและทำใหม่โครงการปัจจุบันของฉันเพื่อใช้ไม่ได้ลงนาม ... และดีมันน่าเกลียดอย่างเห็นได้ชัด

การใช้จำนวนเต็มเป็นวิธีที่ไม่ถูกต้องหรือไม่? มีปัญหาอะไร? มีความไม่แน่นอนเกี่ยวกับความกว้างของเครื่องมือที่จะจับคู่จำนวนเต็มหรือไม่


คำถามที่ดี. ฉันสงสัยว่าตัวเอง ฉันเริ่มต้นด้วยการใช้จำนวนเต็มบวกและประเภทอื่น ๆ ทั่ว แต่มันกลายเป็นขนดกมากที่จะได้รับการสังเคราะห์อย่างถูกต้อง ฉันหวังว่าบางคนสามารถอธิบายได้ว่าทำไมทุกคนถึงใช้ std_logic ในภาษาที่พิมพ์ออกมาสูง
Trygve Laugstøl

1
ใช่. มันไม่บ้าเหรอ? พิมพ์สูงในการปฏิบัติปัจจุบันมีแนวโน้มที่จะส่งผลให้DATA_I <= TO_UNSIGNEDจำนวนมาก(32010, DATA_I'LENGTH); พิมพ์เนื้อหา ... ที่ไม่รบกวนใครเลยเหรอ? :) แน่นอนว่าดูเหมือนสัมภาระที่ไม่จำเป็นจำนวนมาก (โดยเฉพาะอย่างยิ่งเมื่อเพิ่มSTD_LOGIC_VECTOR ()ลงในนั้น) ฉันได้ประกาศประเภทและขนาดของฉันแล้วสิ่งนี้ควรเป็นDATA_I <= 32010; ที่ควรจะเป็นนัย จะไประหว่างการลงนาม / ไม่ได้ลงนาม ฯลฯ สามารถและควรมีความชัดเจน ... แต่การกำหนดหรือการดำเนินการที่ชัดเจนในจำนวนเต็มควรเป็นนัย
darron

คำตอบ:


15

เลขจำนวนเต็มดีในการสังเคราะห์ฉันใช้พวกเขาตลอดเวลา

ฉันใช้ std_logic ที่พอร์ตระดับบนสุด แต่ภายในฉันใช้จำนวนเต็มเรียงอยู่ทั่วสถานที่

ไม่เป็นไร!

ระวัง:

  • คุณกำลังจำลองเป็นคนแรกไม่ใช่คุณ :) - ประเภทจำนวนเต็มไม่ได้ "โรลโอเวอร์" โดยอัตโนมัติในการจำลอง - มันเป็นข้อผิดพลาดที่จะออกไปนอกช่วงที่คุณระบุไว้ หากคุณต้องการพฤติกรรมการพลิกคว่ำคุณต้องกำหนดรหัสให้ชัดเจน
  • -(2วันที่ 31-1)+2วันที่ 31-1-2วันที่ 31unsignedsigned
  • หากคุณไม่ได้บังคับพวกเขาบางครั้งคุณสามารถจบด้วยเคาน์เตอร์แบบ 32 บิตที่น้อยกว่าจะทำ (ถ้าเครื่องมือ synth และต่อมาไม่สามารถ "เห็น" ว่าพวกเขาสามารถเพิ่มประสิทธิภาพบิตออกไป)

กลับหัวกลับหาง:

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

เมื่อคุณทำเช่นการใช้งานแบบเวกเตอร์ที่คุณกำลังใช้ieee.numeric_std, ไม่ieee.std_logic_arithเป็นไม่ได้คุณ?

ผมใช้integers ที่ฉันสามารถทำได้ แต่ถ้าผมต้องการอย่างชัดเจน "เคาน์เตอร์ม้วนมากกว่า n บิต" unsignedผมมักจะใช้


ใช่ฉันใช้ numeric_std ฉันเดาว่าส่วนใหญ่ฉันกังวลเกี่ยวกับเครื่องมือ Xilinx ... พวกเขายังคงสร้าง std_logic_vector สำหรับทุกสิ่งและ "ไม่ได้ลงนาม" ไม่ได้แม้แต่ในการเน้นไวยากรณ์
darron

1
@darron ไม่ต้องกังวลกับการเน้นไวยากรณ์ เครื่องมือเน้นข้อความและตัวแก้ไขไวยากรณ์เป็นซอฟต์แวร์ที่แตกต่างอย่างสิ้นเชิงจากเครื่องมือสังเคราะห์ นอกจากนี้ยังไม่ได้ลงนามคือ "เพียงแค่" ประเภทข้อมูล มันเป็นส่วนหนึ่งของไลบรารีมาตรฐานไม่ใช่ภาษาเอง
Philippe

ขอบเขตล่างไม่ใช่ -2 ^ 32 + 1 แทนใช่ไหม ถ้าเป็น -2 ^ 31 - 1 คุณต้องมีอีกหนึ่งบิตเพื่อเป็นเพียงตัวเลขเดียว - แปลกมาก
Bregalad

@Bregalad - จับได้ดี - มันผิดไปซักพัก!
Martin Thompson

@MartinThompson หรือคุณสามารถเขียนมันเป็น - (2 ^ 32-1) หากคุณต้องการที่จะเก็บเครื่องหมายลบ
Bregalad

7

ม.ค. Decaluwe เราเขียนกระดาษสีขาวทั้งหมดเกี่ยวกับปัญหาของจำนวนเต็มเปรียบเทียบกับเวกเตอร์บิต ผมคาดว่าคำตอบของเขาจะใช้จำนวนเต็มเมื่อใดก็ตามที่เป็นไปได้ http://www.jandecaluwe.com/hdldesign/counting.html


6

ไม่มีอะไรผิดปกติเกี่ยวกับการใช้จำนวนเต็มสำหรับ RTL ต่อ seแต่มีเหตุผลบางอย่างที่หลีกเลี่ยงได้ นี่เป็นคำถามเกี่ยวกับ "การปฏิบัติที่ดีที่สุด" แบบอัตนัยและในที่สุดคุณจะต้องค้นหาตัวเองในสิ่งที่คุณต้องการ เพื่อช่วยในเรื่องนั้นฉันจะแบ่งปันประสบการณ์และความคิดเกี่ยวกับเรื่องนี้

โดยเฉพาะอย่างยิ่งผมอยู่ในความโปรดปรานของการใช้ ( จำกัด ) จำนวนเต็มยังเมื่อเขียนสำหรับการสังเคราะห์ บางครั้งฉันทำมัน แต่ในทางปฏิบัติฉันมักจะติดsignedและunsignedและฉันจะอธิบายอย่างละเอียดว่าทำไม

คุณจะถูกบังคับให้ใช้ดาต้าประเภทเวกเตอร์ในส่วนของการออกแบบของคุณ:

  • ผู้ขาย -IP หรือ IP ของบุคคลที่สามแทบจะไม่ได้ใช้ integerชนิดสำหรับพอร์ต

  • เช่นเมื่อส่งข้อมูลผ่าน BlockRam แม้ว่าคุณจะอนุมานแล้วดังนั้นไม่จำเป็นต้องเชื่อมต่อกับ IP / แมโคร / ดั้งเดิมคุณจะต้องแปลงเป็น vectorized ทุกประเภท

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

เนื่องจากคุณไม่สามารถใช้integerการออกแบบเต็มรูปแบบได้คุณอาจต้องการข้ามมันทั้งหมดเข้าด้วยกันเนื่องจาก:

  • ในบางจุดคุณจะต้องทำการแปลงต่อไปและสิ่งนี้จะเป็นส่วนหนึ่งของการใช้integerงานตั้งแต่แรก

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

ข้อเสียของการใช้integer :

  • ตรงกันข้ามกับประเภทเวกเตอร์, จำนวนเต็มไม่มี'U'และ'X' ; ฉันพบว่ามีประโยชน์มากในการจำลองสถานการณ์ คุณจะเห็นว่าสัญญาณที่ไม่มีการกำหนดค่าเริ่มต้นแพร่กระจายผ่านการออกแบบและคุณอาจตอบสนองหากคุณเห็นสัญญาณที่ไม่ได้กำหนดค่าเริ่มต้นจำนวนมากหลังจากการรีเซ็ต กรณีนี้จะไม่เกิดขึ้นหากใช้จำนวนเต็ม

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

กรณีทั่วไปที่ฉันพบว่าintegerเป็นตัวเลือกที่ดีจริงๆ:

  • สำหรับการดีบักสัญญาณ / ตัวนับที่คุณตรวจสอบผ่าน chipScope / signalTap เป็นต้น

  • การแสดงตัวนับภายในทั้งหมดที่ไม่เคยเข้าหรือออกจากรหัสของคุณเอง ใช่มีเช่นมีกรณีเช่นนี้หากคุณกำลังเขียน FIFO และคุณจะเขียนตายนับ / อ่านในรูปแบบสัญญาณfull, empty, almostFullฯลฯ ( แต่เลขคณิตในชี้เป็นวิธีที่ดีกว่าตายคำนวณในกรณีนี้ .. )

ข้อสรุปของตัวเอง:ฉันใช้จำนวนเต็มบางครั้ง แต่เท่าที่จำเป็นและส่วนใหญ่ในกรณีที่อธิบายข้างต้น ฉันไม่เห็นค่าใช้จ่ายมากนักในการใช้งานunsignedและsignedแทนที่จะเป็นจำนวนเต็มดังนั้นมักจะติดกับพวกเขา

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