Модуль Verilog не может вычислить a&b и a|b

Я создаю модуль verilog, который вычисляет один из a+b, ab, a & b или a | б.

Проблема в том, что он вычисляет для a + b и ab. но он не может вычислить a & b и a | б и ничего не вернуть.

input [31:0] a, b;
input [2:0] op;
output [31:0] z;
output ex; 
wire[31:0]a0,a1,a2,a3;

assign a0 = a & b;
assign a1 = a | b;
assign a2 = a + b;
assign a3 = a - b;

assign z=a0;
//assign z=a1;
//assign z=a2;
//assign z=a3;

endmodule

модуль в основном вычисляет a+b, ab, a & b и a | b и присваивает его вычисленное значение z.

И он успешно вычисляет для a + b и ab и помещает вычисленное значение в z.

Но для a & b и a | b он ничего не назначает z.

Как я могу решить это?

Большое спасибо, если вы можете мне помочь.

2 ответа

Здесь есть некоторая путаница. Ваш оригинальный отправленный код в порядке; z будет назначен, как вы хотите. Другой ответ неверен - нет нескольких драйверов; они закомментированы. Предложение о задержке также неверно - задержка не будет иметь никакого значения для вашей логики.

Я уверен, что это назначает что-то z, Проблема в том, что вы пытаетесь назначить слишком много z,

каждый assign оператор представляет собой некоторое оборудование, которое в этом случае управляет wirez, Итак, ты за рулем z 4 раза параллельно из 4 отдельных аппаратных блоков. Если вам нравится, у вас есть короткое замыкание. (Помните, что Verilog - это язык описания аппаратного обеспечения. Вы разрабатываете здесь аппаратное обеспечение, а не пишете программное обеспечение. Если вы назначаете провод из более чем одного места, вы закорачиваете выходы некоторых кусков аппаратного обеспечения вместе.)

Я заметил, что есть input [2:0] op, Это выглядит как домашнее задание для меня, и я думаю, что вас попросили разработать ALU. АЛУ - это кусок аппаратного обеспечения (в данном случае комбинационная логика), который может выполнять различные операции над своими входами (своими операндами), которые в этом случае a а также b, Какую операцию он выполняет, должен быть выбран другим управляющим входом, который в этом случае почти наверняка должен быть op,

Итак, вам нужен код, который тестирует op и диски z либо с a+b, a-b, a&b или же a|b, Очевидная конструкция для этой работы - case заявление:

case (op)
  3'b000:
    z =     // some expression, eg a + b, it depends on what op code 000 is supposed to mean
  3'b001:
    z =     // some other expression here

            // etc etc

  default:  // perhaps...
    z =     // ...something to drive z if none of the other branches are used
endcase

case заявление должно идти внутри always блок. Поскольку я подозреваю, что это домашнее задание, я не буду давать вам ответ, я дам вам понять, как это сделать.

Наконец, я вижу, что op имеет ширину 3 бита. Это говорит о том, что у вас ALU более 4 различных операций. Я также вижу, что есть ex вывод, который предположительно должен сделать что-то.

Другие вопросы по тегам