Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Verilog

Declaração de caso Verilog


O case A instrução verifica se a expressão fornecida corresponde a uma das outras expressões na lista e ramifica de acordo. Normalmente é usado para implementar um multiplexador. A construção if-else pode não ser adequada se houver muitas condições a serem verificadas e sintetizar em um codificador de prioridade em vez de um multiplexador.

Sintaxe


Um caso Verilog instrução começa com o case palavra-chave e termina com o endcase palavra-chave. A expressão entre parênteses será avaliada exatamente uma vez e comparada com a lista de alternativas na ordem em que são escritas e as instruções para as quais a alternativa corresponde à expressão fornecida são executadas. Um bloco de várias instruções deve ser agrupado e estar dentro de begin e 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

  

Se nenhum dos itens case corresponder à expressão fornecida, as instruções dentro do default item é executado. O default instrução é opcional e pode haver apenas um default declaração em uma declaração de caso. As instruções case podem ser aninhadas.

A execução sairá do bloco case sem fazer nada se nenhum dos itens corresponder à expressão e um default declaração não é dada.

Exemplo


O módulo de design mostrado abaixo tem um sinal de seleção de 2 bits para rotear uma das outras três entradas de 3 bits para o sinal de saída chamado. Um case A instrução é usada para atribuir a entrada correta à saída com base no valor de sel. Como sel é um sinal de 2 bits, ele pode ter 2 2 combinações, de 0 a 3. A instrução padrão ajuda a definir a saída como 0 se sel for 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


O código rtl é elaborado para obter um esquema de hardware que representa um multiplexador de 4 para 1.

Veja que a saída é zero quando sel é 3 e corresponde às entradas atribuídas para outros valores.
Registro de simulação
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.


Em uma instrução case, a comparação só é bem-sucedida quando cada bit da expressão corresponde a uma das alternativas, incluindo 0, 1, x e z. No exemplo mostrado acima, se algum dos bits em sel for x ou z, o default A instrução será executada porque nenhuma das outras alternativas correspondeu. Nesse caso, a saída será toda zero.
Registro de simulação
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.


Se a instrução case no projeto tiver x e z nas alternativas de item de caso, os resultados seriam bem 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 simulação
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.

Como um caso é diferente de if-else ?


O case instrução é diferente de if-else-if de duas maneiras:

Verilog

  1. Instrução C# switch
  2. Instrução C# break
  3. C# continue declaração
  4. Instrução C++ Switch Case com EXEMPLO
  5. Tutorial Verilog
  6. Concatenação Verilog
  7. Atribuições Verilog
  8. Verilog Blocking &Non-Blocking
  9. Funções Verilog
  10. Tarefa Verilog