Вы находитесь на странице: 1из 5

La velocidad de transmisin se mide en baudios.

Como estamos usando una transmisin


binaria, en la que slo hay dos valores (0 y 1), un baudio equivale a un bit por segundo (bps)

Para que diferentes circuitos se puedan comunicar entre ellos, las velocidades estn
normalizadas. Pueden tener los siguientes valores: 115200, 56700, 38400, 19200, 9600,
4800, 2400, 1200, 600 y 300 baudios. Nosotros la fijaremos a la mxima: 115200 baudios

Para transmitir a una velocidad de X baudios, necesitamos generar una seal cuadrada cuya
frecuencia sea igual a X. Cada flanco de subida de esta seal indica cundo enviar el
siguiente bit:

Generador de seal de reloj para la transmisin

Lo primero que necesitamos para transmitir datos es generar la seal de reloj con la
frecuencia adecuada. Esto ya lo sabemos hacer: usaremos un divisor de frecuencias.

Cuando trabajamos con la placa iCEstick, el divisor para conseguir una velocidad de B
baudiosviene dado por la ecuacin: M = 12000000 / B

Por tanto, para transmitir a 115200 baudios necesitamos un divisor de: M = 12000000 /
115200 = 104.16 -> M = 104

Los valores de los divisores para transmitir a las velocidades estndares estn calculados
con la frmula anterior y se encuentran en el fichero baudgen.vh:

//-- Fichero baudgen.vh


`define B115200 104
`define B57600 208
`define B38400 313

`define B19200 625


`define B9600 1250
`define B4800 2500
`define B2400 5000
`define B1200 10000
`define B600 20000
`define B300 40000

Para generar la seal de reloj para transmitir a una velocidad (por ejemplo 115200 baudios)
es tan sencillo como instanciar el divisor que ya conocemos usando las constantes
anteriores:

divider #(`B115200)
BAUD0 (
.clk_in(clk),
.clk_out(clk_baud)
);

Ejemplo 1: Transmitiendo el caracter "K"

Este primer ejemplo enva el carcter "K" desde la FPGA al ordenador cada vez que la seal
dtr pasa de 0 a 1, a la velocidad de 115200 baudios

Funcionamiento

Para realizar una transmisin del dato usaremos un registro de desplazamiento, con carga
paralela. La salida serie se conecta directamente a la linea de transmisin tx, a travs de un
multiplexor. Cuando la seal de load est a 0, el registro se carga con un valor de 10 bits: el
dato "K", seguido de los bits 01 (bit de start y bit de reposo).

Cuando la carga est a 1 se realiza el desplazamiento hacia la derecha y por la izquierda se


inserta un 1. De esta forma, al transmitirse la trama completa, el bit menos significativo ser un
1, para que la lnea tx permanezca a 1 (en reposo)

El multiplexor de salida pone en reposo (a 1) la linea de transmisin cuando se est cargando


el registro. Se usa para que no se enven caracteres "basura" por la lnea tx en el momento
del arranque. El registro de desplazamiento inicialmente tiene el valor 0 en todos sus bits, por
lo tx se pondra a 0 y receptor lo interpretara como que es un bit de start, recibiendo un
carcter "basura" que no quera ser enviado.

Para hacer las pruebas, load est conectada a la seal dtr, por lo que la podremos controlar
manualmente desde el pc. Al ponerla a 1 se empieza la transmisin. Cuando se haya enviado
el carcter K, el registro de desplazamiento tendr todos sus bits a 1 y lo que sale por tx ser
siempre un 1. Es decir, que no habr transmisin. Al poner load a 0, se carga con el nuevo
valor, y cuando pase a 1 se enviar el nuevo dato.

baudtx.v: Descripcin del hardware

La descripcin en lenguaje Verilog del circuito anterior es la siguiente:

//-- Fichero: baudtx.v


`default_nettype none

`include "baudgen.vh"

//--- Modulo que envia un caracter cunado load esta a 1


module baudtx(input wire clk, //-- Reloj del sistema (12MHz en ICEstick)
input wire load, //-- Seal de cargar / desplazamiento
output wire tx //-- Salida de datos serie (hacia el PC)
);

//-- Parametro: velocidad de transmision


parameter BAUD = `B115200;

//-- Registro de 10 bits para almacenar la trama a enviar:


//-- 1 bit start + 8 bits datos + 1 bit stop
reg [9:0] shifter;

//-- Reloj para la transmision


wire clk_baud;

//-- Registro de desplazamiento, con carga paralela


//-- Cuando DTR es 0, se carga la trama
//-- Cuando DTR es 1 se desplaza hacia la derecha, y se
//-- introducen '1's por la izquierda
always @(posedge clk_baud)
if (load == 0)
shifter <= {"K",2'b01};
else
shifter <= {1'b1, shifter[9:1]};

//-- Sacar por tx el bit menos significativo del registros de desplazamiento


//-- Cuando estamos en modo carga (dtr == 0), se saca siempre un 1 para
//-- que la linea este siempre a un estado de reposo. De esta forma en el
//-- inicio tx esta en reposo, aunque el valor del registro de desplazamiento
//-- sea desconocido
assign tx = (load) ? shifter[0] : 1;

//-- Divisor para obtener el reloj de transmision


divider #(BAUD)
BAUD0 (
.clk_in(clk),
.clk_out(clk_baud)
);

endmodule

La primera lnea de cdigo es nueva:

`default_nettype none

Por defecto en Verilog, si aparecen etiquetas no declaras se asumen que son cables (tipo
wire). Esto podra parecer muy til pero es una fuente de problemas en la depuracin. Cuando
el diseo es complejo y se tienen muchos cables, puede ocurrir que uno de ellos se escriba
mal. El compilador, en vez de dar un error, supondr que se trata de un cable nuevo. Este
comportamiento se puede cambiar con la instruccin anterior. Al definir el tipo de cable a none,
cada vez que se detecte un identificador no declarado, saltar un mensaje de error

En el componente se instancia el divisor para generar la seal de reloj para transmitir a 115200
baudios. Esta seal se usa como reloj para el registro de desplazamiento

Simulacin

El banco de pruebas instancia el componente baudtx, se establece un proceso para generar el


relog y otro que genera 3 pulsos en dtr para que se enven 3 characteres

Para simular

El resultado es:

La primera seal es el reloj para la transmisin de los bits a 115200 baudios. Cuando dtr se
pone a cero se carga el registro. Al ponerse a 1 se empieza a enviar el dato en serie. En el
pantallazo se observan 2 pulsos en dtr y cmo despues de ellos se comienza a enviar el dato
en serie

Sntesis y pruebas

Para sintetizar ejecutamos el comando:

$ make sint
Los recursos ocupados son:

Recurso ocupacin

PIOs 6 / 96

8 / 160

BRAMs 0 / 16

Lo cargamos en la FPGA con:

$ sudo iceprog baudtx.bin


Para probarlo arrancamos el gtkterm y con configuramos para que el puerto sea
el /dev/ttyUSB1 a la velocidad de 115200 baudios. Con la tecla F7 cambiamos el estado de
la seal DTR. La primera vez que pulsamos aparecer una "K" en la pantalla. La siguiente vez
DTR cambia de estado, pero no ocurre nada. Si volvemos a pulsar aparecer otra "K". Cada
dos pulsaciones de F7 obtendremos una "K". Si dejamos apretada F7, aparecern multiples
"K"s

Вам также может понравиться