Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Verilog

Declaración del caso Verilog

El case La instrucción comprueba si la expresión dada coincide con una de las otras expresiones de la lista y se bifurca en consecuencia. Normalmente se utiliza para implementar un multiplexor. La construcción if-else puede no ser adecuada si hay muchas condiciones que verificar y se sintetizaría en un codificador de prioridad en lugar de un multiplexor.

Sintaxis

Un caso de Verilog declaración comienza con el case palabra clave y termina con el endcase palabra clave. La expresión entre paréntesis se evaluará exactamente una vez y se comparará con la lista de alternativas en el orden en que se escriben y se ejecutan las declaraciones para las que la alternativa coincide con la expresión dada. Un bloque de declaraciones múltiples debe agruparse y estar dentro de begin y end .

  
  
	// Here 'expression' should match one of the items (item 1,2,3 or 4)
	case (<expression>) 
		case_item1 : 	<single statement>
		case_item2,
		case_item3 : 	<single statement>
		case_item4 : 	begin
		          			<multiple statements>
		        			end
		default 	 : <statement>
	endcase

  

Si ninguno de los elementos del caso coincide con la expresión dada, las declaraciones dentro del default se ejecuta el elemento. El default declaración es opcional, y solo puede haber un default declaración en una declaración de caso. Las declaraciones de casos se pueden anidar.

La ejecución saldrá del bloque de casos sin hacer nada si ninguno de los elementos coincide con la expresión y un default no se da declaración.

Ejemplo

El módulo de diseño que se muestra a continuación tiene una señal de selección de 2 bits para enrutar una de las otras tres entradas de 3 bits a la señal de salida indicada. Un case se utiliza para asignar la entrada correcta a la salida en función del valor de sel. Dado que sel es una señal de 2 bits, puede tener 2 2 combinaciones, de 0 a 3. La declaración predeterminada ayuda a establecer la salida en 0 si sel es 3.

  
  
module my_mux (input       [2:0] 	a, b, c, 		// Three 3-bit inputs
                           [1:0]	sel, 			  // 2-bit select signal to choose from a, b, c
               output reg  [2:0] 	out); 			// Output 3-bit signal 
  
  // This always block is executed whenever a, b, c or sel changes in value
  always @ (a, b, c, sel) begin 		
    case(sel)
      2'b00    : out = a; 		// If sel=0, output is a
      2'b01    : out = b; 		// If sel=1, output is b
      2'b10    : out = c; 		// If sel=2, output is c
      default  : out = 0; 		// If sel is anything else, out is always 0
    endcase
  end
endmodule

  

Esquema de hardware

El código rtl se elabora para obtener un esquema de hardware que representa un multiplexor 4 a 1.

Vea que la salida es cero cuando sel es 3 y corresponde a las entradas asignadas para otros valores.

Registro de simulación
ncsim> run
[0]  a=0x4 b=0x1 c=0x1 sel=0b11 out=0x0
[10] a=0x5 b=0x5 c=0x5 sel=0b10 out=0x5
[20] a=0x1 b=0x5 c=0x6 sel=0b01 out=0x5
[30] a=0x5 b=0x4 c=0x1 sel=0b10 out=0x1
[40] a=0x5 b=0x2 c=0x5 sel=0b11 out=0x0
ncsim: *W,RNQUIE: Simulation is complete.

En una declaración de caso, la comparación solo tiene éxito cuando cada bit de la expresión coincide con una de las alternativas, incluidos 0, 1, x y z. En el ejemplo que se muestra arriba, si alguno de los bits en sel es x o z, el default se ejecutará porque ninguna de las otras alternativas coincidió. En tal caso, la salida será todo ceros.

Registro de simulación
ncsim> run
[0] a=0x4 b=0x1 c=0x1 sel=0bxx out=0x0
[10] a=0x3 b=0x5 c=0x5 sel=0bzx out=0x0
[20] a=0x5 b=0x2 c=0x1 sel=0bxx out=0x0
[30] a=0x5 b=0x6 c=0x5 sel=0bzx out=0x0
[40] a=0x5 b=0x4 c=0x1 sel=0bxz out=0x0
[50] a=0x6 b=0x5 c=0x2 sel=0bxz out=0x0
[60] a=0x5 b=0x7 c=0x2 sel=0bzx out=0x0
[70] a=0x7 b=0x2 c=0x6 sel=0bzz out=0x0
[80] a=0x0 b=0x5 c=0x4 sel=0bxx out=0x0
[90] a=0x5 b=0x5 c=0x5 sel=0bxz out=0x0
ncsim: *W,RNQUIE: Simulation is complete.

Si la declaración del caso en el diseño tiene x y z en las alternativas del elemento del caso, los resultados serían bastante diferentes.

  
  
module my_mux (input  		[2:0] 	a, b, c,
													[1:0]		sel,
							output reg	[2:0] 	out);
  
  // Case items have x and z and sel has to match the exact value for
  // output to be assigned with the corresponding input
  always @ (a, b, c, sel) begin
    case(sel)
      2'bxz			:	out = a;
      2'bzx			:	out = b;
      2'bxx			:	out = c;
      default 	:	out = 0;
    endcase
  end
endmodule

  
Registro de simulación
ncsim> run
[0] a=0x4 b=0x1 c=0x1 sel=0bxx out=0x1
[10] a=0x3 b=0x5 c=0x5 sel=0bzx out=0x5
[20] a=0x5 b=0x2 c=0x1 sel=0bxx out=0x1
[30] a=0x5 b=0x6 c=0x5 sel=0bzx out=0x6
[40] a=0x5 b=0x4 c=0x1 sel=0bxz out=0x5
[50] a=0x6 b=0x5 c=0x2 sel=0bxz out=0x6
[60] a=0x5 b=0x7 c=0x2 sel=0bzx out=0x7
[70] a=0x7 b=0x2 c=0x6 sel=0bzz out=0x0
[80] a=0x0 b=0x5 c=0x4 sel=0bxx out=0x4
[90] a=0x5 b=0x5 c=0x5 sel=0bxz out=0x5
ncsim: *W,RNQUIE: Simulation is complete.

¿En qué se diferencia un caso de if-else?

El case declaración es diferente de if-else-if de dos maneras:

  • Expresiones dadas en un if-else bloque son más generales mientras que en un case bloque, una sola expresión se compara con varios elementos
  • case proporcionará un resultado definitivo cuando haya valores X y Z en una expresión


Verilog

  1. Introducción a Verilog
  2. Declaración de cambio de C#
  3. Declaración de interrupción de C#
  4. Declaración de continuación de C#
  5. Declaración de caso de cambio de C ++ con EJEMPLO
  6. Tutorial de Verilog
  7. Concatenación Verilog
  8. Asignaciones de Verilog
  9. Bloqueo y no bloqueo de Verilog
  10. Funciones de Verilog
  11. Tarea Verilog