ความแตกต่างระหว่างคำสั่ง If-else และคำสั่ง Case ใน VHDL


11

ฉันต้องการเข้าใจว่าการสร้างโครงสร้างในโค้ด VHDL แตกต่างกันอย่างไรใน RTL

  • ทุกคนสามารถบอกความแตกต่างระหว่างโครงสร้างIf-Elseและ คำสั่ง Caseของกระบวนการใน VHDL ในแง่ของวิธีการที่โค้ดถูกอนุมานในวงจร RTL โดยเครื่องมือสังเคราะห์ได้หรือไม่
  • พิจารณากรณีของหลาย ๆ if-else ที่ซ้อนกันและผสม case-statement ด้วย if-elseสร้างขึ้นภายในกระบวนการ
  • นอกจากนี้เมื่อใดที่จะใช้สิ่งก่อสร้าง?

PS: ฉันได้เห็นคำถามที่เกี่ยวข้อง "หลายถ้างบในกระบวนการใน vhdl" แต่ที่ไม่ตอบคำถามของฉันในอย่างไรก็ตาม


ฉันไม่สามารถแสดงความคิดเห็นเกี่ยวกับวิธีการตั้งค่าประตูทางกายภาพ แต่ในคอมไพเลอร์ส่วนใหญ่ที่ปล่อยแอสเซมบลี x86 จะมี if-else อยู่เป็นเช็คเดี่ยวพร้อมการกระโดดตามเงื่อนไข (เช่น jg, jl, jz, jnz, ฯลฯ ) ในขณะที่สวิตช์จัดระเบียบกรณีตามลำดับตัวเลขและทำซ้ำdec/ jzคำสั่งซึ่งมีประสิทธิภาพมากขึ้น อาจใช้การเพิ่มประสิทธิภาพที่คล้ายกันนี้
พหุนาม

@Polynomial พฤติกรรมของ If-else และเคสแตกต่างกันอย่างมากในภาษาฮาร์ดแวร์เมื่อเทียบกับการเขียนโปรแกรมเชิงเส้นทั่วไปของคุณ การปรับให้เหมาะสมของรหัสออปชันนั้นไม่เกี่ยวข้องกันมากนักเนื่องจากคำสั่ง HDL เรียกใช้งาน "ทันที"
W5VO

คำตอบ:


10

ทุกคนสามารถบอกความแตกต่างระหว่างโครงสร้าง If-Else และคำสั่ง Case ของกระบวนการใน VHDL ในแง่ของวิธีการที่โค้ดถูกอนุมานในวงจร RTL โดยเครื่องมือสังเคราะห์ได้หรือไม่

if-elsif-elseสร้างอนุมานลำดับความสำคัญของเครือข่ายเส้นทาง:

แผนผัง

จำลองวงจรนี้ - แผนผังที่สร้างโดยใช้CircuitLab

สิ่งนี้สอดคล้องกับ

if bool_expr_1 then
    sig <= val_expr_1;
elsif bool_expr_2 then
    sig <= val_expr_2;
elsif bool_expr_3 then
    sig <= val_expr_3;
else
    sig <= val_expr_4;
end if;

caseสร้างบนมืออื่น ๆ ที่อ้างถึงใหญ่ 'ol MUX:

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

สิ่งนี้สอดคล้องกับ

case case_expr is
  when c0 =>
    sig <= val_expr_0;
  when c1 =>
    sig <= val_expr_1;
  when c2 =>
    sig <= val_expr_2;
      ...
  when others =>
    sig <= val_expr_N;
end case;

เห็นได้ชัดว่านี่คือการออกแบบที่ง่ายมากโดยมีนิพจน์ค่าเดียวเท่านั้นทำให้ได้ผลลัพธ์เดียว

พิจารณากรณีของหลาย ๆ if-else ที่ซ้อนกันและผสม case-statement ด้วย if-else สร้างขึ้นภายในกระบวนการ

ตามข้างต้นคุณสามารถดูว่าพวกเขาจะทำรัง / ผสมอย่างไร

นอกจากนี้เมื่อใดที่จะใช้สิ่งก่อสร้าง?

เนื่องจากมีif-elseลำดับความสำคัญ infers ควรใช้เมื่อเงื่อนไขอินพุตมากกว่าหนึ่งอาจเกิดขึ้น การใช้caseมืออีกข้างหนึ่งมีความเหมาะสมเมื่อปัจจัยการผลิตเป็นพิเศษร่วมกัน


ฉันเข้าใจว่าสถานะของกรณีทำงานได้กับเงื่อนไขอินพุตเดียวเท่านั้นและหากอื่นสามารถทำงานได้กับเงื่อนไขอินพุตหลายรายการ แต่โครงสร้างทั้งสองสร้าง mux เป็นหลัก (ไม่มี clk) เป็นไปไม่ได้หรือที่การสังเคราะห์ตรรกะอาจเพิ่มประสิทธิภาพอินพุตเดี่ยว if-else ให้กับ mux ขนาดใหญ่เดี่ยวแทนที่จะเป็นเชนของ muxes? นอกจากนี้เครือข่ายการกำหนดเส้นทางลำดับความสำคัญคืออะไร ... นี่ไม่ใช่แค่เชนของ muxes แทนที่จะเป็น 1 mux ใหญ่?
nurabha

นอกจากนี้เมื่อเรามีกระบวนการที่ไวต่อนาฬิกาถ้า - อื่นสามารถสร้างองค์ประกอบตามลำดับเช่นการลงทะเบียนแลตช์ ฯลฯ คำสั่งเคสสามารถสร้างตรรกะตามลำดับได้หรือไม่
nurabha

ใช่เครือข่ายการกำหนดเส้นทางลำดับความสำคัญเป็นสิ่งที่แน่นอน - เครือข่ายของ muxes อย่างไรก็ตามลักษณะของสิ่งif-elseก่อสร้างนั้นเป็นที่ที่เกิดขึ้น เงื่อนไขแรกต้องล้มเหลวเพื่อให้เงื่อนไขที่สองถูกทดสอบ นี่ไม่ใช่กรณีสำหรับเอ่อการcaseสร้างและนี่คือสาเหตุที่if-elseคำสั่งไม่สามารถสังเคราะห์เป็น mux ขนาดใหญ่เดี่ยวได้
Angelo Stavrow

1
และใช่caseคำสั่งสามารถสร้างตรรกะตามลำดับเช่นกัน ฉันพบ"Real World VHDL"ชุดสไลด์บรรยายจากมหาวิทยาลัยกลาสโกว์ซึ่งอาจเป็นประโยชน์กับคุณ
Angelo Stavrow

นี่เป็นข้อมูลอ้างอิงที่ดี
นูระบา

4

ในโพสต์บล็อกเก่านี้ผู้เขียนเขียนและสังเคราะห์ VHDL สองรุ่นที่เทียบเท่ากับการใช้งานได้ กรณีหนึ่งใช้ if-else อีกกรณีใช้กรณี ผลลัพธ์:

ฉันสังเคราะห์รหัสนี้และได้ผลลัพธ์ที่แน่นอนแม้ RTL schematic นั้นเหมือนกันทั้งสองโปรแกรม

และข้อสรุปของเขา:

นี่แสดงให้เห็นว่าคำสั่ง 'case' และ 'if ... elsif ... else' นั้นมีประสิทธิภาพเท่าเทียมกัน แต่ถ้าคุณต้องการเขียนโค้ดที่ชัดเจนคุณควรใช้ 'case' ในกรณีที่เป็นประโยชน์อย่างมาก ผลลัพธ์ขึ้นอยู่กับเงื่อนไขจำนวนมาก แต่ถ้าจำนวนเงื่อนไขมีขนาดเล็กมาก (2 หรือ 3) จากนั้นคุณสามารถใช้ 'if ..elseif..else'

นอกจากนี้ยังมีการโพสต์หลายสิบรายการในหัวข้อนี้ใน Stack Overflow สำหรับทุกภาษาที่เข้าใจได้ ข้อสรุปโดยทั่วไปเหมือนกันว่าไม่มีความแตกต่างของประสิทธิภาพการทำงานที่ชาญฉลาด บางครั้งหากมีหลายกรณีคอมไพเลอร์อาจฉลาดพอที่จะสร้างตารางการค้นหาซึ่งจะให้ประสิทธิภาพที่ดีขึ้นเล็กน้อย

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

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