Модуль 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
оператор представляет собой некоторое оборудование, которое в этом случае управляет wire
z
, Итак, ты за рулем 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
вывод, который предположительно должен сделать что-то.