verilog: implementación de código binario decimal y contador de código gris

0

Estoy tratando de implementar un contador de 8 bits que realiza tanto BCD (Binary Code decimal) como una secuencia de código gris. Si el control de entrada = 0, el circuito contará en BCD y si el control de entrada = 1, el circuito contará en secuencia de código gris. Aquí está mi implementación:

module grayBCDcounter(
    input clk, control,
    output reg [2:0] y1,
);

reg [2:0] state          // there will be 8 states: 1st state :000
                         // 2nd state: 001, 3rd state: 010 and so on
                         // my last state will be 111

parameter s0=3'b000, s1=3'b001, s2=3'b010, s3=3'b011,
                s4=3'b100, s5=3'b101, s6=3'b110, s7=3'b111;

always @ (posedge clk)
begin
case(state)
s0: state <= s0;
s1: state <= s1;
s2: if (control == 0)
       begin
          state <= s2;
       end
    else if(control ==1)
       begin
          state <= s3;
       end    
s3: // and so on
endcase
end

always @ (posedge clk)
   begin

   if (state == s0)
     begin
        y1 <= 0;
     end
   else if(state == s1)
     begin
        y1 <= 1;
     end
   else if // so on
   end
   end

endmodule

Cuando la variable de control es 0, quiero ejecutar s0, s1, s2, s3, s4, s5, etc., como puede ver (BCD), y cuando la variable de control es 1, quiero ejecutar s0, s1 , s3, s2, s6, s7, s5, s4 respectivamente (código gris)

Cuando ejecuto un caso de prueba en él, de alguna manera solo se imprime s0 y parece ser constante durante la ejecución. Mi conjetura es que el estado nunca sale de s0.

¿Algún consejo sobre cómo debo implementar los códigos?

    
pregunta cohsta

1 respuesta

1

Creo que no usas FSM, en lugar de eso, crea un código simple como el de abajo,

module grayBCDcounter(
  input clk, rst_n, control,
  output wire [2:0] y1 
);

reg  [2:0] bcd_cnt, gray_cnt, cnt;

always @ (posedge clk or negedge rst_n)
begin
  if (!rst_n) begin
    bcd_cnt  <= 3'b0;
    cnt      <= 3'b0;
    gray_cnt <= 3'b0;
  end else begin
    bcd_cnt  <= (bcd_cnt + 1'd1) & {3{control}};
    cnt      <= (cnt + 1'd1) & {3{!control}};
    gray_cnt <= cnt ^ (cnt >> 1);
  end
end

assign y1 = control ? bcd_cnt : gray_cnt;

endmodule

Pruébalo.

    
respondido por el Prakash Darji

Lea otras preguntas en las etiquetas