#verilog
#verilog
Вопрос:
(Verilog) Ниже приведен 32-разрядный арифметико-логический модуль (ALU) [см. Слайды]. Он имеет два мультиплексора 2-1 и один мультиплексор 3-1 3-1, 32-разрядный сумматор, 32-разрядное вычитающее устройство и 16-разрядный множитель. В таблице функций показаны различные функции, которые этот модуль ALU выполняет для разных значений F (3-разрядный управляющий сигнал). Обратите внимание на взаимосвязь между различными модулями внутри ALU. Пожалуйста, опишите этот ALU с помощью Verilog. Ваша реализация должна начинаться с меньших блоков, отображаемых в ALU, а затем использовать эти меньшие блоки для построения всего ALU. Другими словами, ваша реализация должна способствовать повторному использованию меньших модулей (т. Е. модульных). Оптимизируйте свою реализацию, если это возможно.
таблица функций на изображении
module adding(r,a,b);
input[31:0] a;
input[31:0] b;
output[31:0] r;
assign r=a b;
endmodule
module ALU(F,A,B,R);
input[2:0] F;
input[31:0] A;
input[31:0] B;
output[31:0] R;
reg R;
always @(F)
begin
if ( F == 3'b000 ) adding ad(R,A,B);
else if ( F == 3'b001 ) R = A 1;
else if ( F == 3'b010 ) R = A-B;
else if ( F == 3'b011 ) R = A-1;
else if ( F == 3'b10x ) R = A*B;
end
endmodule
это то, что я делал до сих пор, но я получил ошибки!! Я продолжу с другим утверждением, поскольку я знаю, как создать первый небольшой модуль
Комментарии:
1. В чем ошибки?
Ответ №1:
Обратите внимание на некоторые основные проблемы синтаксиса verilog.
- несоответствие ширины бита в объявлении R.
- список чувствительности не завершен для блока always.
- создание экземпляра модуля не допускается в соответствии со структурным if.
- Я не знаю, предназначены ли неопределенные ветви для
F
, это приводит к тому, что, возможно, вы не хотите.
Поскольку вы в основном работаете над разделением модуля, это связано с пунктом 3. Вам нужно будет создать экземпляры базовых (повторно используемых) модулей отдельно, а затем выбрать выходные данные через F.
wire [31:0] adder_b;
wire [31:0] adder_resu<
assign adder_b = F[0] ? 32'h1 : B; // select input outside 'adding'
adding ad (adder_result, A, ader_b);
always@(*)begin
if(F2:1] == 2'b00) R = adder_resu<
...
end
Ответ №2:
Есть много способов написать простой код в verilog.it зависит от требований некоторое время здесь я представлял различные способы написания этого кода.
первый с помощью ключевого слова assign, а второй с помощью операторов case.
assign result = (opcode==3'b000) ? A B :
((opcode==3'b001)? A 1 :
((opcode==3'b010)? A-B :
((opcode==3'b011)? A-1 : A*B)));
always @(*) begin
casex(opcode)
3'b000: result=A B;
3'b001: result=A 1;
3'b010: result=A-B;
3'b011: result=A-1;
3'b1xx: result=A*B;
endcase
end