Verilog: การเปลี่ยนสถานะหลายสถานะในคำสั่งกรณีเดียว

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

ฉันมีปัญหากับ LSB ไม่ว่าจะใช้ค่าเริ่มต้นเป็น F ก็ตามและไม่เคยเปลี่ยนแปลงเลย ฉันคิดว่า Verilog ไม่อนุญาตให้ฉันแก้ไขทั้ง Cout1 และ Cout0 ในคำสั่ง case เดียวกัน มีวิธีแก้ไขปัญหานี้หรือไม่? ดูรหัสของฉันด้านล่าง

always@*
    if (key1press)
    casex(PrintSum)

        // Hex 1 (MSB)
        // Works!
        5'b0xxxx : Cout1 = 7'b1000000;  //0 if S[4] = 0
        5'b1xxxx : Cout1 = 7'b1111001;  //1 if S[4] = 1

        // Hex 0 (LSB)
        // Doesn't work :(
        5'bx0000 : Cout0 = 7'b1000000;  //0
        ...
        5'bx1111 : Cout0 = 7'b0001110;  //F
        //default  : begin
        //            Cout1 = 7'b1000000;   //0 by default
        //            Cout0 = 7'b1000000;   //0 by default
        //end
    endcase

ขอบคุณล่วงหน้าทุกคน :)


person Walby    schedule 10.12.2017    source แหล่งที่มา


คำตอบ (2)


ในการจำลอง คำสั่ง case จะดำเนินการจับคู่แรก ทุกอย่างจะตรงกับสองเงื่อนไขแรก (5'b0xxxx, 5'b1xxxx) หากคุณย้ายเงื่อนไขเหล่านี้ไปจนสุด ก็จะไม่มีวันบรรลุเงื่อนไขดังกล่าว เนื่องจากจะมีการแข่งขันในช่วง 5'bx0000 ถึง 5'bx1111

ไม่มีการทับซ้อนกันระหว่างบิตการดูแล ดังนั้น วิธีแก้ปัญหาที่ง่ายที่สุดคือแยก Cout1 และ Cout0 ออกเป็นข้อความรัฐธรรมนูญแยกกัน:

begin
  if (PrintSum[4]) begin
    Cout1 = 7'b1111001;  //1 if S[4] = 1
  end
  else begin
    Cout1 = 7'b1000000;  //0 if S[4] = 0
  end

  case(PrintSum[3:0])
    4'b0000 : Cout0 = 7'b1000000;  //0
    // ...
    4'b1111 : Cout0 = 7'b0001110;  //F
  endcase
end

สิ่งอื่นๆ ที่ควรทราบ:

person Greg    schedule 11.12.2017
comment
ขอบคุณ ทั้งหมดนี้มีประโยชน์จริงๆ และขอขอบคุณสำหรับแหล่งข้อมูลเพิ่มเติมด้วย ฉันตัดสินใจเปลี่ยน casex เป็น casez - person Walby; 12.12.2017
comment
คุณควรนาฬิกาไอคอนตอบรับหากสิ่งนี้ตรงตามความต้องการของคุณ มันจะช่วยผู้อื่นที่มีคำถามที่คล้ายกัน - person Greg; 14.12.2017

2 เงื่อนไขต่อไปนี้จากคำสั่ง case ของคุณครอบคลุมค่าที่เป็นไปได้ ทั้งหมด ของตัวเลือก PrintSum เนื่องจากเป็นรายการ int eh รายการแรก จึงไม่มีค่าอื่นใดที่จะเข้าไปที่นั่น

    5'b0xxxx : Cout1 = 7'b1000000;  //0 if S[4] = 0
    5'b1xxxx : Cout1 = 7'b1111001;  //1 if S[4] = 1

คุณต้องแก้ไขข้างต้นเพื่อให้ค่าที่มีความหมายเพื่อให้คำอื่นๆ ดำเนินการได้เช่นกัน

คุณอาจจัดเรียงรายการใหม่เช่นนี้

    // Hex 0 (LSB)
    // Doesn't work :(
    5'bx0000 : Cout0 = 7'b1000000;  //0
    ...
    5'bx1111 : Cout0 = 7'b0001110;  //F


   // Hex 1 (MSB)
    // Works!
    5'b0xxxx : Cout1 = 7'b1000000;  //0 if S[4] = 0
    5'b1xxxx : Cout1 = 7'b1111001;  //1 if S[4] = 1
person Serge    schedule 10.12.2017
comment
ทั้งสองฉากจะไม่ส่งผลให้ค่าหนึ่งถูกโจมตีและยุติคดีใช่หรือไม่ (ฉันลองเปลี่ยนทั้งสองรายการด้วย โชคไม่ดีเลย) - person Walby; 11.12.2017
comment
มันจะตีคู่แรกก่อน ดังนั้น หาก PrintSum มีบิตล่าง 4 บิตตั้งค่าเป็น '0000' ก็จะถึงเทอมแรก อย่างไรก็ตาม สำหรับ '00001' จะตรงกับคำว่า '0xxxx' และสำหรับ '10001' จะตรงกับ '1xxxx' - person Serge; 11.12.2017