Как упростить ввод для декодера в Verilog HDL - PullRequest
0 голосов
/ 27 октября 2019

Я делаю декодер для ПЛИС. Код verilog компилируется, но переключатели ничего не делают. Я четыре раза проверил назначения выводов, и они верны, поэтому я думаю, что с моим кодом есть некоторые логические проблемы.

/ * Таблица истинности:

enable  p  a1  a0  y0  y1  y2  y3  
0       0  0   0   1   0   0   0
0       0  0   1   0   1   0   0
0       0  1   0   0   0   1   0
0       0  1   1   0   0   0   1
0       1  0   0   0   1   1   1
0       1  0   1   1   0   1   1
0       1  1   0   1   1   0   1
0       1  1   1   1   1   1   0
1       x  x   x   x   z   z   z

Это мойкод:

*/
module decoder2x4( 
input enable,
input p,
input [1:0] a,
output [3:0] y
);

assign y[0] = (( ~p & ~a[1] & ~a[0]) | (~a[1] & a[0]) |(a[1] & ~a[0]) |     ( p & a[1] & a[0]) ) & ~enable;
assign y[1] = (( ~p & ~a[1] & a[0]) | ( p & ~a[1] & ~a[0]) |( p & a[1] & ~a[0])| ( p & a[1] & a[0])) & ~enable;
assign y[2] = (( ~p & a[1] & ~a[0]) | ( p & ~a[1] & ~a[0]) |( p & ~a[1] & a[0])| ( p & a[1] & a[0])) & ~enable;
assign y[3] = (( ~p & a[1] & a[0]) | ( p & ~a[1] & ~a[0]) |( p & ~a[1] & a[0])| ( p & a[1] & ~a[0])) & ~enable;

endmodule

1 Ответ

1 голос
/ 27 октября 2019

Это не тот способ, которым вы используете код HDL, если только это не школьное задание.

Я скопировал это из работы Пьера. Вриенс сделал вам таблицу:

enable  p  a1  a0  y0  y1  y2  y3  
0       0  0   0   1   0   0   0
0       0  0   1   0   1   0   0
0       0  1   0   0   0   1   0
0       0  1   1   0   0   0   1
0       1  0   0   0   1   1   1
0       1  0   1   1   0   1   1
0       1  1   0   1   1   0   1
0       1  1   1   1   1   1   0
1       x  x   x   x   z   z   z   <<< Probably a typo here

Нижняя строка немного особенная, поэтому я использую if для этого. Сброс, который мы можем поставить в случае:

always @( * )
begin
   if (enable)
      {y0, y1, y2, y3} = 4'hz; // **
   else
      case ( {p, a1, a0 } )
      3'b000 : {y0, y1, y2, y3} = 4'b1000;
      3'b001 : {y0, y1, y2, y3} = 4'b0100;
      3'b010 : {y0, y1, y2, y3} = 4'b0010;
      3'b011 : {y0, y1, y2, y3} = 4'b0001;
      3'b100 : {y0, y1, y2, y3} = 4'b0111;
      3'b101 : {y0, y1, y2, y3} = 4'b1011;
      3'b110 : {y0, y1, y2, y3} = 4'b1101;
      3'b111 : {y0, y1, y2, y3} = 4'b1110;                   
      endcase
end // always 

Обратите внимание, что это максимально копирует оригинальную таблицу, что уменьшает вероятность ошибок. Редактор с редактированием столбцов очень помогает!

** Я предполагаю, что вы хотите, чтобы все выходные данные были 'z'. В вашей таблице у вас есть xzzz.

...