Verilog: Mengubah beberapa status dalam satu pernyataan kasus

Pada dasarnya saya mencoba menampilkan jumlah atau hasil kali dua angka (diinput menggunakan sakelar pada FPGA) ke tampilan 7-segmen. Saya tahu bahwa bit penjumlahan dan perkalian saya berfungsi dengan baik, karena saya telah mengujinya secara terpisah.

Saya mengalami masalah dengan LSB. Tidak peduli apa pun, defaultnya adalah F dan tidak pernah berubah. Saya pikir Verilog tidak mengizinkan saya untuk memodifikasi Cout1 dan Cout0 dalam pernyataan kasus yang sama. Apakah ada solusi untuk ini? Lihat kode saya, di bawah.

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

Terima kasih sebelumnya semuanya :)


person Walby    schedule 10.12.2017    source sumber


Jawaban (2)


Dalam simulasi, pernyataan kasus akan mengeksekusi pencocokan pertama. Semuanya akan cocok dengan dua kondisi pertama (5'b0xxxx, 5'b1xxxx). Jika Anda memindahkan kondisi ini ke akhir, maka kondisi tersebut tidak akan pernah tercapai karena akan ada kecocokan dalam rentang 5'bx0000 hingga 5'bx1111.

Tidak ada tumpang tindih antara bagian perawatan. Oleh karena itu, solusi paling sederhana adalah dengan membagi Cout1 dan Cout0 menjadi pernyataan konstitusi yang terpisah:

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

Hal lain yang perlu diperhatikan:

person Greg    schedule 11.12.2017
comment
Terima kasih, ini semua sangat membantu-dan terima kasih juga atas sumber daya tambahannya. Saya membuat keputusan untuk menukar casex dengan casez. - person Walby; 12.12.2017
comment
Anda harus melihat ikon terima jawaban jika ini memenuhi pertanyaan Anda. Ini akan membantu orang lain dengan pertanyaan serupa. - person Greg; 14.12.2017

2 istilah berikut dari pernyataan kasus Anda mencakup semua kemungkinan nilai pemilih PrintSum. Karena mereka adalah yang pertama dalam daftar, tidak ada nilai lain yang akan dimasukkan ke sana.

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

Anda perlu memperbaiki hal di atas untuk memberikan nilai yang bermakna sehingga persyaratan lainnya dapat dijalankan juga.

Anda juga dapat mengatur ulang item seperti ini.

    // 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
Bukankah kedua adegan tersebut akan menghasilkan satu nilai yang terkena dan mengakhiri kasus itu? (Saya juga mencoba mengganti kedua item, sayangnya tidak berhasil) - person Walby; 11.12.2017
comment
itu akan mencapai pencocokan pertama terlebih dahulu. Jadi, jika PrintSum memiliki 4 bit lebih rendah yang disetel ke '0000', maka akan mencapai suku pertama. Namun untuk '00001' akan cocok dengan istilah '0xxxx', dan untuk '10001', '1xxxx'. - person Serge; 11.12.2017