-
Notifications
You must be signed in to change notification settings - Fork 195
Capítulo 11: Multiplexor de 2 a 1
Ejemplos de este capítulo en github
Los multiplexores son circuitos combinacionales que nos permiten seleccionar entre varias fuentes de datos. En este capítulo utilizaremos un multiplexor de 2 a 1 para mostrar por los leds una secuencia de dos valores, que se mostrarán alternativamente.
Un multiplexor 2 a 1 selecciona entre 2 fuentes de datos según el valor de su entrada de selección sel. Si sel es 0, se saca por la salida la fuente 0, si es 1 se saca la fuente 1.
Los describimos en Verilog usando la intrucción if ... else:
always @(fuente0 or fuente1 or sel)
if (sel == 0)
dout <= fuente0;
else
dout <= fuente1;
Es muy importante que exista el else. Al tratarse de un circuito combinacional, todos los casos deben estar cubiertos. Si no es así, se pueden inferir registros. También es muy importante colocar en la lista de sensibilidad TODAS las señales de entrada: fuente0, fuente1 y sel.
La lista de sensibilidad se puede escribir de forma abreviada con el argumento @*
always @*
Esta lista incluye automáticamente todas las señales de entrada.
Como ejemplo de uso, haremos un secuenciador de 2 estados: Un circuito que envía alternativamente dos datos de 4 bits a los leds. El esquema del circuito es el siguiente:
Se utilizan 2 fuentes de datos fijas (están cableadas a valores fijos) que determinan el estado de los leds en cada momento. El multiplexor selecciona alternativamemente entre una y otra a través de una señal de reloj que pasa por un prescaler (para reducir la frecuencia y que podamos apreciar el movimiento de los leds).
El código verilog es el siguiente:
//-- mux2.v
module mux2(input wire clk, output reg [3:0] data);
//-- Parametros del secuenciador:
parameter NP = 22; //-- Bits del prescaler
parameter VAL0 = 4'b1010; //-- Valor secuencia 0
parameter VAL1 = 4'b0101; //-- Valor secuencia 1
//-- Cables de las 3 entradas del multiplexor
wire [3:0] val0;
wire [3:0] val1;
wire sel;
//-- Por las entradas del mux cableamos los datos de entrada
assign val0 = VAL0;
assign val1 = VAL1;
//-- Implementación del multiplexor
always @(sel or val0 or val1)
if (sel==0)
data <= val0;
else
data <= val1;
//-- Presaler que controla la señal de selección del multiplexor
prescaler #(.N(NP))
PRES (
.clk_in(clk),
.clk_out(sel)
);
endmodule
La implementación del multiplexor es sencilla por lo que se incluye directamente en un proceso, en vez de definirla en un fichero separado y luego instanciarlo (diseño jerárquico).
Para sintetizarlo en la fpga conectaremos las salidas data a los leds, y la entrada de reloj a la de la placa iCEstick.
Sintetizamos con el comando:
$ make sint
Los recursos empleados son:
Recurso | ocupación |
---|---|
PIOs | 3 / 96 |
PLBs | 7 / 160 |
BRAMs | 0 / 16 |
Para cargar en la FPGA ejecutamos:
$ sudo iceprog mux2.bin
En este vídeo de Youtube se puede ver la salida de los leds:
El banco de pruebas es uno básico, que instancia el componente mux2, con 1 bit para el prescaler (para que la simulación tarde menos). Tiene un proceso para la señal de reloj y uno para la inicialización de la simulación.
La simulación se realiza con:
$ make sim
El resultado en gtkwave es:
Vemos cómo se van alternando las dos salidas: 1010 y 0101 alternativamente, cada una asociada a un nivel de la señal de sel (que proviene del reloj pasada por un prescaler de 1 bit en simulación).
- Ejercicio 1: Cambiar los valores de entrada del multiplexor para sacar otra secuencia diferente por los leds.
TODO
0 You are leaving the privative sector (EN)
1 ¡Hola mundo! (EN) (RU)
2 De un bit a datos (EN)
3 Puerta NOT (EN)
4 Contador de 26 bits (EN)
5 Prescaler de N bits (EN)
6 Múltiples prescalers (EN)
7 Contador de 4 bits con prescaler (EN)
8 Registro de 4 bits (EN)
9 Inicializador (EN)
10 Registro de desplazamiento (EN)
11 Multiplexor de 2 a 1 (EN)
12 Multiplexor de M a 1 (EN)
13 Inicializando registros (EN)
14 Registro de N bits con reset síncrono
15 Divisor de frecuencias
16 Contador de segundos
17 Generando tonos audibles
18 Tocando notas
19 Secuenciando notas
20 Comunicaciones serie asíncronas
21 Baudios y transmisión
22 Reglas de diseño síncrono
23 Controladores y autómatas finitos
24 Unidad de transmisión serie asíncrona
25 Unidad de recepción serie asíncrona
26 Memoria ROM
27 Memoria ROM genérica
28 Memoria RAM
29 Puertas triestado
30 Hacia el microprocesador y más allá