¿Cómo usar un módulo en verilog como en el operador de compilación como OR, AND, XOR, etc.?

-1

Quería modular GR como operador. ¿Cómo puedo?

 module GR(ou,a,b);
    input [7:0] a,b;
    input reset;
    output ou;
    wire o1,o2,o3,o4;
    assign ou=o1 || o2 || o3 || o4;
    TBC call1(o1,a[1],b[1]);
    TBC call2(o2,a[3],b[3]);
    TBC call3(o3,a[5],b[5]);
    TBC call4(o4,a[7],b[7]);
    endmodule
**************************************************************************      
    module TBC(o,a,b);
    input a,b;
    output o;
    assign o=a && (~b);
    endmodule 
module five(outt,ack,reset,a1,b1,c1,d1,e1,clka);
input [7:0] a1,b1,c1,d1,e1;
input clka,reset;
output reg [7:0] outt;
output reg ack;

always @(negedge clka) begin
                     if(GR(a1[1],b1[2])) begin
                     b1[2]<=a1[1];a1[1]<=b1[2];
                     end

end
endmodule 

¿Qué corrección necesito?

Editar: Como se sugiere a continuación, comentar, hago funcionar como se muestra a continuación *

function GR;
input [7:0] a,b;
wire o1,o2,o3,o4;
begin 
 GR=o1 || o2 || o3 || o4;
 o1=a[1]&&(~b[1]);
 o2=a[3]&&(~b[3]);
 o3=a[5]&&(~b[5]);
 o4=a[7]&&(~b[7]);
end 
endfunction 

Pero está dando error: Error de sintaxis cerca de "cable"

    
pregunta RO.BST

1 respuesta

1

Está utilizando un HDL, es decir, está describiendo hardware. No "llama" a bits de hardware como llamaría a una función en C o Java o lo que sea. Este no es un lenguaje procesal. Cualquier hardware que requiera en su diseño debe ser descrito e instanciado en el momento de la compilación. Siempre existirá en su diseño (el hardware no aparece y desaparece mágicamente cuando su diseño se está ejecutando).

Necesitas una estructura como esta:

module something(
    ...
);

wire outputOfInstanceWithSensibleName;

//Lets *instantiate* our module. We aren't "calling" it, we are adding
//the hardware that it describes to our design.
someOtherThing instanceWithSensibleName (
    .a(somethingConnectedToA),
    .b(somethingConnectedToB),
    .o(outputOfInstanceWithSensibleName)
);

//Then we do something depending on what the output of that instance is.
always @ (...) begin
    if (outputOfInstanceWithSensibleName) begin
        //Do something when the output of the instance with a sensible name is high
    end else begin
        //Maybe something else when its output is low.
    end
end

endmodule

module someOtherThing(
    input a,
    input b,
    output o
);

...

endmodule

Es importante darse cuenta de que el bloque siempre describe una acción que siempre está sucediendo. Si está utilizando una sensibilidad de borde de reloj, la acción siempre ocurrirá en ese borde de reloj (lógica síncrona). Si no está usando un reloj, la acción siempre ocurrirá todo el tiempo (lógica asíncrona).

Observe cómo creamos una instancia del hardware por separado del bloque siempre. Si la acción se basa en algún otro hardware para calcular un valor, se debe crear una instancia de ese hardware y conectar su salida mediante un cable a nuestro bloque siempre. La conexión es simplemente un caso de cablear un extremo a la salida de la instancia de hardware como se muestra, y luego usar el otro extremo en algún cálculo (por ejemplo, una declaración, etc.) o conectarlo a la entrada de otro módulo.

    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas