2012-09-09 45 views
5

Estoy tratando de traducir un programa verilog en vhdl y me he topado con una afirmación donde se utiliza un operador de signo de interrogación (?) En el programa verilog.Operador de interrogación Verilog (?)

El siguiente es el código verilog;

1 module music(clk, speaker); 
2 input clk; 
3 output speaker; 
4 parameter clkdivider = 25000000/440/2; 

5 reg [23:0] tone; 
6 always @(posedge clk) tone <= tone+1; 

7 reg [14:0] counter; 
8 always @(posedge clk) if(counter==0) counter <= (tone[23] ? clkdivider-1 : clkdivider/2-1); else counter <= counter-1; 

9 reg speaker; 
10 always @(posedge clk) if(counter==0) speaker <= ~speaker; 
11 endmodule 

No entiendo la octava línea, ¿alguien podría por favor arrojar algo de luz sobre esto? He leído en el sitio web de asic-world que el signo de interrogación es el alterno de Verilog para el personaje Z. Pero no entiendo por qué se usa en este contexto.

Saludos cordiales

Respuesta

12

Esa es una ternary operator. Es la abreviatura de una sentencia if

Formato:

condition ? if true : if false 

Ejemplo:

tone[23] ? clkdivider-1 : clkdivider/2-1 

se traduce en algo así como (sintaxis no es correcta pero creo que lo conseguirá):

if tone[23] is 1, counter = clkdivider-1 
else counter = clkdivider/2-1 

Aquí hay dos ejemplos de un 2 to 1 MUX using if statement and ternary operator.

En el sitio web ASIC-mundo, que está cubierto por Conditional Operators

4

Otra forma de escribir, por ejemplo, Verilog la siguiente:

q <= tone[23] ? clkdivider-1 : clkdivider/2-1; 

en VHDL sería:

q <= clkdivider-1 when tone[23] else clkdivider/2-1; 
+0

Esta es la razón por declaraciones son tan esenciales en las preguntas. Una condición debe evaluar a un valor booleano. La única forma en que el tono [23] cumplirá ese criterio es si el tono es un BOOLEAN_VECTOR. – user1155120

Cuestiones relacionadas