2016-04-16 6 views
0

Я хочу реализовать сумматор модулей, когда sel=0, и вычитатель модуля при sel=1. Я узнал, что генерация может использоваться для условного вызова модуля внутри другого модуля.условно вызывать модуль с использованием case case

3.   module checker(o,a,b,sel); 
4.   output reg o; 
5.   input a,b,sel; 
6.   [email protected](*) 
7.   begin 
8.   generate 
9.   case (sel)        
10.  1'b0 : adder a1(.sum(o),.a(a),.b(b)); 
11.  1'b1 : subtractor s1(.diff(o),.a(a),b(b)); 
12.  endcase 
13.  endgenerate 
14.  end 
15.  endmodule 

     //errors shown are: 

    D:/FILES/verilog files/Neha/checker.v" Line 8: Syntax error near "generate". 
    D:/FILES/verilog files/Neha/checker.v" Line 11: Port connections cannot be mixed ordered and named. 
    D:/FILES/verilog files/Neha/checker.v" Line 13: Syntax error near "endgenerate". 
    D:/FILES/verilog files/Neha/checker.v" Line 10: Instantiation is not allowed in sequential area except checker instantiation. 
    D:/FILES/verilog files/Neha/checker.v" Line 11: Instantiation is not allowed in sequential area except checker instantiation 

Заранее благодарен!

ответ

2

Мы разрабатываем оборудование здесь, а не записываем программное обеспечение. A Verilog module - это кусок оборудования. Вы не можете «вызывать» Verilog module больше, чем вы можете «называть» чип на печатной плате.

Ваши модули adder и subtractor являются кусками оборудования. Вы не можете «называть» их. Что вам нужно, некоторые аппаратные - возможно, мультиплексор - выбрать два выхода и управлять o вывод:

module checker(o,a,b,sel); 
    output /* is this really 1 bit wide? */ o; 
    input /* are these really 1 bit wide? */ a,b; 
    input sel; 

    wire /* are these really 1 bit wide? */ sum, diff;; 

    adder  a1(.sum(sum), .a(a), .b(b)); 
    subtractor s1(.diff(diff), .a(a), .b(b)); 

    assign o = sel ? diff : sum; 

endmodule 

Кстати - наверняка ваши входы и выходы более чем 1 бит в ширину?

+0

Это был всего лишь пример, мне нужны входы и выходы как 32 бит в ширину. и необходимо выполнить сложение или умножение с плавающей запятой на основе case case (то есть условно, как при sel == 0, добавление F.P и при выполнении умножения sel == 1 F.P)! – Neha

+0

надеюсь, что вы поняли, о чем я прошу! – Neha

+0

@Neha Это 'sel' _static_ или _dynamic_? Если он был статичным, вы можете использовать оператор 'generate', как вы пытались сделать. Но похоже, что 'sel' является динамическим, потому что это вход в' checker'. В этом случае, как сказал @rahulcodesinverilog, вы не можете использовать оператор 'generate'; вместо этого вы _have_ в _instantiate_ (не «вызываете») оба модуля и используете мультиплексор для переключения между их выходами (как я сделал). Я не совсем понимаю, зачем нужно использовать оператор 'case', но если вы должны использовать statememt' case', тогда замените мой 'assign' блоком' always', содержащим один. –

1

Вы не можете сделать это. Начиная с generate блок выдается перед симуляцией, case в generate нуждается в параметре или макросе.

Вы можете дать sel в качестве входных данных для обоих модулей и выполнить операции соответственно.

Вот как ваш модуль может выглядеть следующим образом:

module add_sub(input a,b,sel,output wire [1:0] s); 

assign s = (sel) ? (a + b) : (a - b); 

endmodule 

В зависимости от sel, операция должна быть выполнена.

Верхний модуль просто создает модуль add_sub.

module checker(o,a,b,sel); 

add_sub a1(.a(a), .b(b), .sel(sel), .s(o)); 

endmodule 
+0

Это был просто пример, который я использовал, чтобы научиться условно вызывать модуль. на самом деле я работаю над арифметикой с плавающей запятой, которая требует 32 бит входов и выходов, которые могут выполнять сложение и умножение с плавающей запятой условно! – Neha

0

Вы не можете создавать аппаратные средства на ходу при включении. Следовательно, логика должна быть там.

Если вы хотите сэкономить на воротах, вы можете использовать одиночный сумматор вместо одного сумматора и одного вычитателя. Передайте значение значения b или -b (2 комплимента) для него на основе выбора. Таким образом, вы можете сэкономить на логике вычитания. Пожалуйста, используйте ниже пример и правильно код.

assign b_final = sel ? b : -b; 
assign s = a+ b_final;