Paralelo en la salida de serie Verilog Shift Register, comportamiento extraño durante la sincronización

0

Hola, estoy intentando implementar un registro de desplazamiento de salida en serie paralelo basado en la hoja de datos para el registro de desplazamiento de salida paralelo en serie de 74LV165A

la hoja de especificaciones se puede encontrar en hoja de datos para 74LV165A

Si hago que mi banco de pruebas comience por desplazarse en serie, luego intente bloquear los datos en la entrada paralela, los datos no aparecen. Si comienzo el banco de pruebas con el bloqueo paralelo habilitado, los datos aparecen en la Q y se marcará una vez que se habilite el cambio.

Mi objetivo es cambiar varios conjuntos de datos a través de este registro; sin embargo, actualmente este comportamiento lo impide. Cualquier ayuda sería muy apreciada, evento si es solo una pista :)

Actualmente estoy monitoreando la información de configuración y reinicio y las líneas Q.

module nand3(input one, input two, input three, output out);
    assign out = !(one&two&three);
endmodule

module nand2(input one, input two, output out);
    assign out = !(one&two);
endmodule

module DFlipFlop(input clk, input reset, input D, input set, output Q);

reg Q;

initial
     Q<=0;

always @(posedge clk or negedge reset or negedge set)
begin
    if(!reset)
            Q<=0;
    else if(!set)
            Q<=1;
    else
            Q<=D;

end

endmodule

module control_mux(input [7:0]set_bits, input CP, input CE, input PL, output [16:0]bus); // bit 16 is clk, bits 15 -> 8 are set, bits 7 -> 0 of bus are reset

assign VCC = 1;

nand3 control(!CP, !CE, PL, bus[16]);

nand2 set1(!PL, set_bits[7], bus[15]);
nand2 set2(!PL, set_bits[6], bus[14]);
nand2 set3(!PL, set_bits[5], bus[13]);
nand2 set4(!PL, set_bits[4], bus[12]);
nand2 set5(!PL, set_bits[3], bus[11]);
nand2 set6(!PL, set_bits[2], bus[10]);
nand2 set7(!PL, set_bits[1], bus[9]);
nand2 set8(!PL, set_bits[0], bus[8]);

nand2 reset1(!PL, bus[15], bus[7]);
nand2 reset2(!PL, bus[14], bus[6]);
nand2 reset3(!PL, bus[13], bus[5]);
nand2 reset4(!PL, bus[12], bus[4]);
nand2 reset5(!PL, bus[11], bus[3]);
nand2 reset6(!PL, bus[10], bus[2]);
nand2 reset7(!PL, bus[9],   bus[1]);
nand2 reset8(!PL, bus[8],   bus[0]);

endmodule

module testbench;

    reg [7:0]set_bits;
                  reg [7:0]set_bits2;
    reg CE, PL, CP, D;

    wire [16:0]bus; 
    wire [7:0]Q;

    always
        #5 CP = !CP;

    initial
    begin
        CP = 0;
        D = 0;
        set_bits = 8'b11001011;

                                     PL = 0; CE = 1;
         #10 PL = 1;  CE = 0;
    end

    initial
        #500 $finish;

    initial
    begin
        $display("CP,      CE,        PL,       b16        b15        b14       b13        b12        b11        b10        b9        b8       b7       b6      b5      b4      b3      b2     b1     b0  Q7  Q6  Q5 Q4 Q3 Q2 Q1 Q0");
        $monitor("%b            %b            %b           %b            %b            %b            %b            %b            %b            %b            %b          %b        %b         %b         %b         %b        %b       %b       %b       %b      %b    %b    %b    %b    %b    %b    %b    %b", CP, CE, PL, bus[16], bus[15], bus[14], bus[13], bus[12], bus[11], bus[10], bus[9], bus[8], bus[7], bus[6], bus[5], bus[4], bus[3], bus[2], bus[1], bus[0], Q[7], Q[6],Q[5],Q[4],Q[3],Q[2],Q[1],Q[0]);
    end

    control_mux CM(set_bits, CP, CE, PL, bus);
    DFlipFlop FF(bus[16], bus[7], D, bus[15], Q[7]);
    DFlipFlop FF2(bus[16], bus[6], Q[7], bus[14], Q[6]);
    DFlipFlop FF3(bus[16], bus[5], Q[6], bus[13], Q[5]);
    DFlipFlop FF4(bus[16], bus[4], Q[5], bus[12], Q[4]);
    DFlipFlop FF5(bus[16], bus[3], Q[4], bus[11], Q[3]);
    DFlipFlop FF6(bus[16], bus[2], Q[3], bus[10], Q[2]);
    DFlipFlop FF7(bus[16], bus[1], Q[2], bus[9], Q[1]);
    DFlipFlop FF8(bus[16], bus[0], Q[1], bus[8], Q[0]);

endmodule
    
pregunta HighAndroid

1 respuesta

1

Has malinterpretado el esquema. Esta línea:

nand3 control(!CP, !CE, PL, bus[16]);

está en contradicción con:

  • CP es activo alto,
  • CE está activo bajo (observe la barra sobre el " CE " en el esquema).
  • sin embargo, utiliza dos señales invertidas en la instanciación,

También:

  • el bus que cree que un bus es solo un cable (¡tenga en cuenta los puntos de conexión!)
  • y no entiendo completamente el concepto control_mux ...

Ahora, al consultar la documentación de NXP, su esquema difiere de lo que adjuntó.

Y, por último, ¿por qué creas puertas instantáneamente en lugar de simplemente codificar la funcionalidad?

Me gusta:

module sr_74LV165A (
  input DS, CP, CE_n, PL_n,
  input D0, D1, D2, D3, D4, D5, D6, D7,
  output Q7, Q7_n
);

reg [0:7] shr;
wire      clk;

assign clk = CP | CE_n | !PL_n;

always @(posedge clk or negedge PL_n)
  if   (!PL_n) shr <= { D0, D1, D2, D3, D4, D5, D6, D7 };
  else         shr <= { DS, shr[0:6] };

assign Q7   =  shr[7];
assign Q7_n = !shr[7];

endmodule

Después de todo, esto es solo un registro de desplazamiento con carga asíncrona paralela.

    
respondido por el TFuto

Lea otras preguntas en las etiquetas