¿Puede alguien ayudarme a completar este código de Verilog para este circuito secuencial?

1

Todavía soy bastante nuevo en Verilog y todo, y podría necesitar ayuda para completar / corregir mi código para este problema. Hice el diagrama de estado, la tabla de estado / asignación, minimicé la ecuación e incluso me hice algunos de los registros de Verilog, pero no soy muy bueno para entender a Verilog.

Aquí está el mensaje:

  

Derive un circuito secuencial con una entrada (w) y una salida (z)   utilizando D flip flops que detecta una secuencia de entrada de 101. Use un Moore   Modele y muestre todo su trabajo, incluida la máquina de estados, el estado   tabla, asignación de estado, tabla de asignación de estado y la final   circuito.

PS, tampoco sé cómo dibujar completamente el circuito. Pero aparte de eso, aquí está el progreso que he logrado:

(No tengo un representante lo suficientemente alto como para insertar imágenes si alguien puede hacer eso por mí, gracias)

Diagrama de estado:

Tabladeestados,asignaciónyecuaciónmínima

Además del diagrama del circuito, tengo la primera parte hecha. Ahora tengo que implementar esto como un programa Verilog ... aunque no estoy muy seguro de a dónde voy. He visto algunos ejemplos y esto es lo que tengo hasta ahora:

código Verilog hasta ahora

module my_circ(Clock, Resetn, w, z);

    input Clock, Resetn, w;
    output z;
    reg [3:1] y2, y1, Y2, Y1 //not sure about this line.. probably throws the rest off
    parameter [3:1] A = 2'b00, B = 2'b01, C = 2'b10, D = 2'b11;

    always @(w,y2,y1)
        case (y2)
            A: if (w)  Y2 = 0;
                       Y1 = 1;
               else    Y2 = 0;
                       Y1 = 0;
            B: if (w)  Y2 = 0;
                       Y1 = 1;

    /////////// I don't think this is right at all :(
            default:    Y1 = ...

    always @(negedge Resetn, posedge Clock)
        if (Resetn == 0) //something :/
        else //something else :/

    assign z = (...); //something :/

endmodule

Después de intentar escribir ese Verilog, me doy cuenta de que no tengo ni idea de cómo implementar esto :( Intenté seguir diferentes ejemplos, pero todos los que puedo encontrar usan 3 estados en lugar de 4 como este. ¿Crees que debería tener varios casos? Y, por lo tanto, sé dónde establecer qué variables y en qué establecerlas.

Cualquier consejo me ayudará. Gracias.

    
pregunta ModdedLife

3 respuestas

0

En realidad, la estructura de tu verilog se ve bien. Son los detalles los que están mal, en muchos lugares. Aquí hay algunos:

reg [3:1] y2, y1, Y2, Y1

Sí, el punto y coma faltante desactiva el compilador. Más al punto, [3:1] le dice que cada de estos registros tiene tres bits de ancho, pero solo tienen un bit de ancho en la planificación. Tradicionalmente, usamos 0 para el bit menos significativo (de modo que la interpretación binaria tenga un peso de 2 ^ n en el bit n). La línea de parámetros sería, por lo tanto, [1:0] , ya que se extiende a tres bits de ancho.

always @(w,y2,y1)
always @(negedge Resetn, posedge Clock)

La lista de sensibilidad está separada por or , no por coma.

    case (y2)
        A: if (w)  Y2 = 0;
                   Y1 = 1;
           else    Y2 = 0;
                   Y1 = 0;

y2 en esta declaración de caso solo coincide con un bit en su planificación (tres en el código, pero eso tuvo menos sentido). Puedes concatenar bits usando {y2,y1} ; de hecho, extender el caso a case ({y2,y1,w}) le permitirá usar coincidencias de casos como {A,1'b0}: y eliminar las declaraciones if por completo.

En segundo lugar, estás tratando de administrar grupos de declaraciones (ambas asignaciones a Y2 e Y1) con if ; para hacerlo, es necesario incluirlos con begin y end . Alternativamente, podría hacer una asignación más amplia como {Y2,Y1} <= B; , que termina siendo más legible, ya que puede usar sus estados nombrados.

En tercer lugar, la asignación usando = puede causar cierta confusión (actúa más como lenguajes secuenciales, mientras que <= no modifica el significado de un registro dentro de tu siempre). En este caso, está bien ya que el bloque es totalmente combinatorio y no depende de sus propios resultados.

Finalmente (para la sección case ), simplemente puede agregar más coincidencias. Ni siquiera necesita una coincidencia de default , pero probablemente es conveniente usar default para ir al estado A en este caso.

always @(negedge Resetn, posedge Clock)
    if (Resetn == 0) //something :/
    else //something else :/

Algo y algo más serían actualizaciones de registro, como {y2,y1} <= {Y2,Y1}; . Es la sensibilidad del borde del reloj la que convierte los registros en flipflops.

Finalmente, ya que ahora deberías entender qué define un ancho de registro, ¿por qué no haces dos registros de ancho de bit llamados state y next_state para reemplazar {y2,y1} y {Y2,Y1} respectivamente?

    
respondido por el Yann Vernier
1

Tu diagrama de estado se ve bien.

Tu tabla de transición de estado se ve bien.

Tu Verilog no está del todo bien. Está muy lejos de ser correcto, es difícil saber dónde empezar a arreglarlo.

En mi experiencia, la mejor manera de escribir Verilog, especialmente para síntesis, es simplemente seguir las plantillas proporcionadas por el proveedor de la herramienta de síntesis. Por ejemplo, Xilinx tiene una Guía de síntesis y simulación que muestra cómo codificar varios Tipos de estructuras en verilog. Los ejemplos de máquinas de estados finitos comienzan en la p. 79.

Este es su ejemplo de una simple máquina de estados finitos en Verilog:

module v_fsm_1 (clk, reset, x1, outp);
 input clk, reset, x1;
 output outp;
 reg outp;
 reg [1:0] state;
 parameter s1 = 2'b00; parameter s2 = 2'b01;
 parameter s3 = 2'b10; parameter s4 = 2'b11;
 initial begin
   state = 2'b00;
 end

always@(posedge clk or posedge reset) begin
   if (reset) begin
     state <= s1; outp <= 1'b1;
   end
   else begin
     case (state)
       s1: begin
         if (x1==1'b1) begin
           state <= s2;
           outp <= 1'b1;
         end
         else begin
           state <= s3;
           outp <= 1'b0;
         end
       end
       s2: begin
         state <= s4; outp <= 1'b1;
       end
       s3: begin
         state <= s4; outp <= 1'b0;
       end
       s4: begin
         state <= s1; outp <= 1'b0;
       end
     endcase
   end
 end
endmodule

Esto es para una máquina de estado totalmente diferente a la suya, por lo que deberá averiguar cómo expresar su máquina en este formato.

Observe la estructura: una declaración de caso gigante que maneja todas las transiciones y salidas de estado. Además, parametrizan la codificación de estado para que la herramienta de síntesis pueda reasignar los códigos reales si hay una razón para hacerlo. Para su asignación, ya que tuvo que determinar el estado de la codificación, es igualmente válido simplemente usar valores literales como 1'b00 en su código en lugar de nombres de parámetros como st0 .

Otra cosa a tener en cuenta es que el estilo de Xilinx requiere que las asignaciones de salida "miren hacia adelante" a lo que la salida debe estar en el próximo estado. Esto permite que la salida dependa tanto del estado actual como del estado anterior, pero esta es una característica que no necesita. Para su problema, podría ser más sencillo generar la generación en un bloque separado.

    
respondido por el The Photon
0

Echa un vistazo a esto. Podría darte una mejor idea. Este es similar pero con una secuencia de entrada diferente Sequence_Detector

    
respondido por el Rancho

Lea otras preguntas en las etiquetas