-
Notifications
You must be signed in to change notification settings - Fork 201
Capítulo 8: registro de 4 bits

Ejemplos de este capítulo en github
Los registros son elementos esenciales en los circuitos digitales. Nos pemiten almacenar información, desde 1 hasta N bits. Se utilizan para implementar procesadores, realizar segmentación, almacenamiento de resultados intermedios, etc.
El registro básico captura los datos de la entrada, en flanco de subida o bajada del reloj, los almacena y los saca por la salida. Su esquema es:
En este capitulo utilizaremos un registro de 4 bits para hacer que parpadeen los 4 leds de la placa iCEstick
El esquema que utilizaremos es el siguiente:
El registro de 4 bits inicialmente está inicializado a 0. Por la salida dout salen 4 bits a 0, que se convierten en 4 bits a 1 al pasar por el inversor. En el siguiente flanco de subida del reloj, se captura este nuevo valor 4'b1111 en el registro. Al salir por dout, se vuelve a invertir obteniéndose 4 bits a 0, como al principio. El resultado es que se obtiene la siguiente secuencia 0000, 1111, 0000, 1111 ... que cambia con cada flanco de subida del reloj. Si ahora la salida dout la conectamos a los leds, estos empezarán a encenderse y apagarse con la frecuencia del reloj.
El diseño completo a implementar en la FPGA se muestra en esta figura:
Para poder apreciar el parpadeo, se incluye un prescaler. La descripción del hardware en Verilog es:
//-- blink4.v
module blink4(input wire clk, //--Reloj
output wire [3:0] data //-- Salida del registro);
//-- Bits para el prescaler
parameter N = 22;
//-- Reloj principal (prescalado)
wire clk_base;
//-- Datos del registro
reg [3:0] dout = 0;
//-- Cable de entrada al registro
wire [3:0] din;
//-- Instanciar el prescaler
prescaler #(.N(N))
PRES (
.clk_in(clk),
.clk_out(clk_base)
);
//-- Registro
always @(posedge(clk_base))
dout <= din;
//-- Puerta NOT entra la salida y la entrada
assign din = ~dout;
//-- Sacar datos del registro por la salida
assign data = dout;
endmodule
Obsevamos que la implementación de un registro es extremadamente sencilla. Basta con este código:
always @(posedge(clk_base))
dout <= din;
Esta es la razón por la que normalmente no usaremos un diseño jerárquico: no es necesario incluir el código en un fichero a parte por lo sencillo que es.
Hemos usado una definición compacta de los parámetros del módulo blink4: todo está definido en la propia declaración del módulo:
module blink4(input wire clk, output wire [3:0] data);
Esto se podría haber hecho también así:
module blink4(input clk, output [3:0] data);
wire clk;
wire data;
o así:
module blink4(clk, data);
input clk;
output data;
wire clk;
wire [3:0] data;
Esta última forma se utiilza para definir componentes paramétricos (lo veremos más adelante)
- Ej1
- Ej2
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á