2016-03-20 15 views
-2

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

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

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, A-B, а & Ь, и | B и присвоить его вычисленное значение г.

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

Но для & b и a | b он не присваивает ничего z.

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

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

+1

Я [положил задержку после установки ввода] (http://codepad.org/xCv3b5N8), и кажется, что он работает хорошо. Пожалуйста, напишите [Минимальный, Полный и Подтверждаемый пример] (http://stackoverflow.com/help/mcve). – MikeCAT

ответ

0

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

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

Я замечаю, что есть input [2:0] op. Это выглядит как домашнее задание для меня, и я думаю, вас попросили разработать ALU. 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, который, вероятно, должен что-то сделать.

0

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

Смежные вопросы