módulo Verilog para leer / escribir un registro

1

Me gustaría crear un módulo que pueda cambiar el valor de un registro que se le pasa (+/- 1) usando un puerto de entrada. Escribí esto:

module tune(
    input clk,
    input read,
    input [15:0] x,
    inout [15:0] y,
    input plus,
    input minus
);

reg [15:0] a;
reg [15:0] b;

assign y = read ? a:'bz;

always@(posedge clk) begin
    b<=y;
    a<=x;
    if (plus) b<=b+1;
end

endmodule

Cuando leer es ALTO, espero que y se inicialice con el valor de x . Cuando leer es BAJO, espero generar el valor de b (que puede disminuir o aumentar usando menos o más ). Sin embargo, actualmente plus no hace nada y lee alterna y entre 0xFFFF y 2 (cuando paso 2'd42 a x).

Admito que no tengo un buen conocimiento de las asignaciones de no bloqueo. ¿Qué debo cambiar para que mi código funcione, o hay una mejor manera de implementar el comportamiento deseado?

    
pregunta Jinkai

2 respuestas

1
  

Cuando la lectura es ALTA, espero que y se inicialice al valor de x.

Lo único que realmente hace su código cuando read es alto es hacer que y genere el valor de a . Tan pronto como read vuelve a bajar, y vuelve a ser una entrada (porque le asigna el valor z ).

  

Cuando la lectura es BAJA, espero generar el valor de b (que se puede disminuir o incrementar usando menos o más).

Dado que b no es una salida, y nunca usa b para establecer ningún otro cable o registro, no está claro cómo espera que suceda.

  

Actualmente, sin embargo, además no hace nada

¿Estás seguro? En su código, si plus es alto en un borde ascendente de clk , entonces b obtendrá el valor y+1 .

  

y lea y alterna entre 0xFFFF y 2

¿Está seguro de que el valor es 0xFFFF y no 0xXXXX? Porque cuando read es bajo, este código no asigna ningún valor a y . Parece que su banco de pruebas está aplicando un pull-up o un valor alto débil a los bits de y .

    
respondido por el The Photon
0

Así es como lo hice al final

module tune #(parameter INIT=0, DELAY=19, BITS=16)(
    input clk,
    output reg [BITS-1:0] y = INIT,
    input enb,
    input add,
    input sub
);

reg [DELAY:0] count = 0;

always@(posedge clk) begin
    if (add^sub && count==0 && enb) y = add ? y+1:y-1;
    count <= count + 1;
end

endmodule
    
respondido por el Jinkai

Lea otras preguntas en las etiquetas