Mejorando el código de Verilog

-1

He escrito un desplazador de 8 bits en verilog

'timescale 1ns / 1ps

/* this is a very simple example of a 8 bit shift */
/* the shift amount is always 1 */
/* sw = 0 means left shift while sw = 1 means right shift */
/* this is an example of a combinational ciruit */

module shifter_8bit(input [7:0] A,
                    input sw,
                    output reg [7:0] B);

    /* whenever the value of any of the input signal changes, we want the system to act */
    /* therefore this would go into an always block */
    always @(A, sw)
        begin
            /* because we are providing support for both LS as well as RS, we need a 2-1 MUX */
            case(sw)
                /* As sw is a one bit, we can have only two possibilities */
                1'b0:
                    /* left shift A by 1 */
                    begin
                        B[7] = A[6];
                        B[6] = A[5];
                        B[5] = A[4];
                        B[4] = A[3];
                        B[3] = A[2];
                        B[2] = A[1];
                        B[1] = A[0];
                        B[0] = 0;
                    end
                1'b1:
                    /* right shift A by 1 */
                    begin
                        B[7] = 0;
                        B[6] = A[7];
                        B[5] = A[6];
                        B[4] = A[5];
                        B[3] = A[4];
                        B[2] = A[3];
                        B[1] = A[2];
                        B[0] = A[1];
                    end
            endcase
        end
endmodule

Vengo de un fondo en C, y todo lo que me interesa es proporcionar y usar la abstracción, que claramente falta en este módulo. Aunque esto se sintetiza correctamente, no es muy atractivo para el ojo. También he creado un módulo de cambio de 4 bits y deseo usarlos. Sin embargo, siempre que trato de usarlos en el bloque siempre, me da un problema.

¿Hay alguna manera de modificar el código que he escrito y usar el módulo de cambio de 4 bits y no afectar a la síntesis general? En general, ¿hay alguna regla que deba seguir para obtener un código de calidad de verilog o se trata de la síntesis?

Mejor, Bilal

    
pregunta Bilal Wasim

2 respuestas

0
wire [7:0] B = sw ? { 1'b0, A[7:1] } : { A[6:0], 1'b0 };

No creo que necesites bloquear siempre para este circuito combinatorio.

    
respondido por el Anonymous
0

Bueno, siempre puedes hacer cambios así:

B = {A[6:0], 1'b0};

y

B = {1'b0, A[7:1]};

No puedes instanciar módulos dentro de bloques siempre; Tendrá que publicar el código de su cambiador de 4 bits para obtener una buena respuesta. Sin embargo, es posible crear módulos parametrizados donde puede especificar el ancho cuando lo ejecute, algo como esto:

module shift_lr #
(
    parameter WIDTH = 8
)
(
    input  wire [WIDTH-1:0] din;
    input  wire             shift_dir;
    output wire [WIDTH-1:0] dout;
);

assign dout = shift_dir ? {1'b0, din[WIDTH-1:1]} : {din[WIDTH-2:0], 1'b0};

endmodule


shift_lr #(
    .WIDTH(4)
)
shift_lr_4_inst (
    .din(...),
    .shift_dir(...),
    .dout(...)
);
    
respondido por el alex.forencich

Lea otras preguntas en las etiquetas