Para usar la demora en la máquina de estado de mealey

-1

Tengo tres estados en mi máquina mealey, cuando dcsel = 0 luego pasa al estado de escala de grises s1, si dcsel = 1 entonces pasa al estado de corrección de puntos s2, restablece = 1 y permanece en estado inactivo s0. Quiero que en estado de corrección de escala de grises y puntos después de la demora del ciclo de ocho horas debe generar una señal sin cambiar a otro estado. Significo que la enbala generada debe ser independiente de la transición de estado. ¿Puedo usar tarea para llamar demora? Intenté usarlo, pero tengo dudas de si funcionará.

He intentado el código verilog es

always @(dcsel or state or rst)
  case (state)

    idle: begin
      if (dcsel == 1'b1 & rst==1'b0 & hold_wr_dc == 1) begin
        // valid_wr_en  to enbale fifo to  write after 8 sclk
        next_state = dc;
        valid_wr_en <= 1;
      end else if (rst) begin
        next_state = idle;
        valid_wr_en = 0;
      end else if (dcsel==1'b0 & rst==1'b0 & hold_wr_gs == 1) begin
        next_state = gs;
        valid_wr_en =  1;
      end
    end

    gs: begin
      if (dcsel==1'b1 & rst==1'b0) begin
        next_state = dc;
        valid_wr_en = valid_en;
        valid_rd_en
      end else if(dcsel==1'b0 & rst==1'b0) begin
        next_state = gs;
        valid_wr_en = valid_en;
        valid_rd_en
      end else if(rst) begin
        next_state = idle;
        valid_wr_en = 1'bz;
        valid_rd_en
      end
    end

    dc: begin
      if (dcsel==1'b1 & rst==1'b0) begin
        next_state = dc;
        valid_wr_en = valid_en;
        valid_rd_en
      end else if(dcsel==1'b0 & rst==1'b0) begin
        next_state = gs;
        valid_wr_en = valid_en;
      end else if(rst) begin
        next_state = idle;
        valid_wr_en =  1'bz;
        valid_rd_en
      end // else: !if(dcsel)
    end
  endcase

always @(posedge sclk, posedge rst) begin
  if (rst)
    cnt <=0;
  else if(cnt != 'd8)
    cnt <= cnt +1;
  else if(cnt == 'd8)   // grayscale ,wait till 6 sclk to write in fifo
    hold_wr_gs < = 1;
  else if(cnt == 'd6)   // for dot correction wait till 8 sclk to write in fifo
     hold_wr_dc <=  1;
  else
    cnt <= 3'b0;
end
    
pregunta Manzer

1 respuesta

2

Habría varias formas de agregar los 8 retrasos de reloj. Una forma es agregar un lote de nuevos estados a su máquina de estado (básicamente, agregar tres bits de estado más) de manera que cuando pase de estado a otro donde se desea el retraso, simplemente vaya como algo así como:

S3 -> S10 -> S11 -> S13 -> S14 -> S15 -> S16 -> S17 -> S0

Otra forma es introducir un valor de contador adicional que se maneje fuera de los fracasos de la máquina de estado principal. Similar a lo anterior en la transición podría verse así:

S3  ->  Sx ->  Sx ->  Sx ->  Sx ->  Sx ->  Sx ->  Sx ->  Sx  ->  S0
 cnt<-0   cnt++  cnt++  cnt++  cnt++  cnt++  cnt++  cnt++   cnt=7?
    
respondido por el Michael Karas

Lea otras preguntas en las etiquetas