Verilog: Как бороться с условиями провода? - PullRequest
0 голосов
/ 30 мая 2019

Отсюда следует вопрос: Почему переменная провода вызывает неправильную левую часть в непрерывном назначении?

Ниже приведен мой скорректированный код, но у меня все еще есть проблема согласования b (который является регистром) и Y (который является проводом) при тех же условиях if. Я понимаю, что провод должен рассматриваться как результат комбинаций, к которым он присоединен, и ему нельзя просто присвоить значение, и уж точно не как функцию самого себя. И все то, что нельзя использовать assign для регистрации или что провода нельзя использовать в if блоках.

Но проблема заключается в том, что, если вычислить b, а если b!=0, как мне исправить ошибку b th bit (Y[b]) и заставить ее переворачиваться с 1 на 0 или наоборот?

// Hamming code 1-bit error correction
module HCG(I,e,O);
  input [4:1] I;   // input BCD
  input [7:1] e;   // noise simulation
  wire [7:1] X;    // Hamming code
  wire [7:1] Y;     // Hamming code after addition of noise
  wire [3:1] P;     // Parity at start
  wire [3:1] S;    // Parity at end
  integer b;       // the error bit    
  output [4:1] O;  // corrected output

  assign X[1]=I[1]^I[2]^I[4];   // Hamming code generator
  assign X[2]=I[1]^I[3]^I[4];
  assign X[3]=I[1];
  assign X[4]=I[2]^I[3]^I[4];
  assign X[5]=I[2];
  assign X[6]=I[3];
  assign X[7]=I[4];

  assign P[1]=X[1]; // Parity at start
  assign P[2]=X[2];
  assign P[3]=X[4];

  assign Y[1]=e[1]^X[1]; // noise added
  assign Y[2]=e[2]^X[2];
  assign Y[3]=e[3]^X[3];
  assign Y[4]=e[4]^X[4];
  assign Y[5]=e[5]^X[5];
  assign Y[6]=e[6]^X[6];
  assign Y[7]=e[7]^X[7];

  assign S[1]=Y[3]^Y[5]^Y[7]; // Parity at end
  assign S[2]=Y[3]^Y[6]^Y[7];
  assign S[3]=Y[5]^Y[6]^Y[7];

  always @(I,e)
  begin
    b=0; // initialize b to zero
  if(S[1]!=P[1])
    b=b+1;
  if(S[2]!=P[2]) // b is cumulative if each of the conditions is true
    b=b+2;
  if(S[3]!=P[3])
    b=b+4;
  if(b!=0)
    begin
    Y[b]=!(Y[b]); // HOW TO CORRECT THIS?
    end
  end

  assign O[1]=Y[3]; // assigning outputs
  assign O[2]=Y[5];
  assign O[3]=Y[6];
  assign O[4]=Y[7];

endmodule

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Как я уже сказал в комментариях: ваш код очень ... неоптимальный. Так что здесь я отвечу только:

Y [Ь] = (У [Ь]!); // КАК ИСПРАВИТЬ ЭТО?

Если вы пишете Y [b] =! (Y [b]) (а часы не задействованы), вы создали комбинаторный цикл: Y [b] становится не Y [b], который сразу же становится не-не Y [b], который сразу становится не-не-не Y [b] и т. Д.

Вы должны использовать прямую рабочую логику: создайте новую переменную, например. Z равно Y, но бит b (b! = 0) инвертирован.

always @( * )
   case (b)
   1 : Z = Y ^ 4'b0010;
   2 : Z = Y ^ 4'b0100;
   3 : Z = Y ^ 4'b1000;
   default : Z = Y;
   endcase

(Конечно, это также помогает, если вы знакомы с работой различных логических операций.)

Не проверено, возможны опечатки

0 голосов
/ 30 мая 2019

Итак, моя проблема заключалась в том, что я пытался изменить Y, когда это действительно нельзя было изменить (если не изменились входы или провода, которые его определяли). Я исправил проблему, заставив новую переменную reg z принять значения Y и затем вместо нее перевернуть Z s b th-bit.

module HCG(I,e,O);
  input [4:1] I;   // input BCD
  input [7:1] e;   // noise simulation
  wire [7:1] X;    // Hamming code
  wire [7:1] Y;     // Hamming code after addition of noise
  wire [3:1] P;     // Parity at start
  wire [3:1] S;    // Parity at end
  integer b;       // the error bit
  reg [7:1] Z;     // corrected hamming code
  output [4:1] O;  // corrected output

  assign X[1]=I[1]^I[2]^I[4];   // Hamming code generator
  assign X[2]=I[1]^I[3]^I[4];
  assign X[3]=I[1];
  assign X[4]=I[2]^I[3]^I[4];
  assign X[5]=I[2];
  assign X[6]=I[3];
  assign X[7]=I[4];

  assign P[1]=X[1]; // Parity at start
  assign P[2]=X[2];
  assign P[3]=X[4];

  assign Y[1]=e[1]^X[1]; // noise added
  assign Y[2]=e[2]^X[2];
  assign Y[3]=e[3]^X[3];
  assign Y[4]=e[4]^X[4];
  assign Y[5]=e[5]^X[5];
  assign Y[6]=e[6]^X[6];
  assign Y[7]=e[7]^X[7];

  assign S[1]=Y[3]^Y[5]^Y[7]; // Parity at end
  assign S[2]=Y[3]^Y[6]^Y[7];
  assign S[3]=Y[5]^Y[6]^Y[7];

  always @( *)
  begin
    b=0; // initialize b to zero
    Z=Y; // initialize Z1~Z7 with Y1~Y1
  if(S[1]!=P[1])
    b=b+1;
  if(S[2]!=P[2]) // b is cumulative if each of the conditions is true
    b=b+2;
  if(S[3]!=P[3])
    b=b+4;
  if(b!=0)
    Z[b]=~(Y[b]); // correct the incorrect b'th-bit
  end

  assign O[1]=Z[3]; // assigning outputs
  assign O[2]=Z[5];
  assign O[3]=Z[6];
  assign O[4]=Z[7];

endmodule
...