modulemux_tx(input[7:0]d_i,// Datos a transmitirinputpbit_i,// Bit de paridadinput[3:0]sel_i,// Selector de bitoutputregtx_o// Transmision);always@(d_i,pbit_i,sel_i)begincase(sel_i)4'b0000:tx_o=1'b1;// Stop bit4'b0001:tx_o=1'b0;// Start bit4'b0010:tx_o=d_i[0];// LSB de d_i 4'b0011:tx_o=d_i[1];4'b0100:tx_o=d_i[2];4'b0101:tx_o=d_i[3];4'b0110:tx_o=d_i[4];4'b0111:tx_o=d_i[5];4'b1000:tx_o=d_i[6];4'b1001:tx_o=d_i[7];4'b1010:tx_o=pbit_i;// Bit de paridaddefault:tx_o=1'b1;// Stop bitendcaseendendmodule
modulefsm_tx(inputrst_i,// Reset del sistemainputclk_i,// Reloj del sistemainputsttx_i,// Startinputz_i,// Base de tiempoinputpsel_i,// Selector de paridadoutputreg[3:0]sel_o,// Habilitador de muxoutputregeot_o// Fin de transmision);localparam[3:0]s0=4'b0000,// Wait y stop bits1=4'b0001,// Sincronizacions2=4'b0010,// Start bits3=4'b0011,// D0s4=4'b0100,// D1s5=4'b0101,// D2s6=4'b0110,// D3s7=4'b0111,// D4s8=4'b1000,// D5s9=4'b1001,// D6s10=4'b1010,// D7s11=4'b1011;// Parityreg[3:0]present_state,next_state;// Logica proximo estado y decodificacion de salidaalways@(sttx_i,z_i,psel_i,present_state)beginnext_state=present_state;sel_o=4'b0000;eot_o=1'b0;case(present_state)s0:begin// Wait y stop bitsel_o=4'b0000;eot_o=1'b1;if(sttx_i)next_state=s1;ends1:begin// Sincronizacionsel_o=4'b0000;eot_o=1'b0;if(z_i)next_state=s2;ends2:begin// Start bitsel_o=4'b0001;eot_o=1'b0;if(z_i)next_state=s3;ends3:begin// D0sel_o=4'b0010;eot_o=1'b0;if(z_i)next_state=s4;ends4:begin// D1sel_o=4'b0011;eot_o=1'b0;if(z_i)next_state=s5;ends5:begin// D2sel_o=4'b0100;eot_o=1'b0;if(z_i)next_state=s6;ends6:begin// D3sel_o=4'b0101;eot_o=1'b0;if(z_i)next_state=s7;ends7:begin// D4sel_o=4'b0110;eot_o=1'b0;if(z_i)next_state=s8;ends8:begin// D5sel_o=4'b0111;eot_o=1'b0;if(z_i)next_state=s9;ends9:begin// D6sel_o=4'b1000;eot_o=1'b0;if(z_i)next_state=s10;ends10:begin// D7sel_o=4'b1001;eot_o=1'b0;if(z_i)beginif(psel_i)next_state=s11;elsenext_state=s0;endends11:begin// Paridadsel_o=4'b1010;eot_o=1'b0;if(z_i)next_state=s0;enddefault:begin// Regresar a S0 por defaultnext_state=s0;endendcaseend// Registro de estadoalways@(posedgeclk_i,posedgerst_i)beginif(rst_i)present_state<=s0;elsepresent_state<=next_state;endendmodule
modulers232_tx(inputrst_i,inputclk_i,inputsttx_i,// Startinput[7:0]d_i,// Datos de entradainput[14:0]baud_i,// Constante de baudiosinputpsel_i,// Selector de paridadoutputtx_o,// Transmisionoutputeot_o// Fin de transmision);wirez;wirep;wire[3:0]sel;mux_txmod_mux_tx(.d_i(d_i),.pbit_i(p),.sel_i(sel),.tx_o(tx_o));parity_txmod_parity_tx(.d_i(d_i),.pbit_o(p));clk_div_tx#(.Width(15))mod_clk_div_tx(.rst_i(rst_i),.clk_i(clk_i),.en_i(1'b1),.baud_i(baud_i),.z_o(z));fsm_txmod_fsm_tx(.rst_i(rst_i),.clk_i(clk_i),.sttx_i(sttx_i),.z_i(z),.psel_i(psel_i),.sel_o(sel),.eot_o(eot_o));endmodule
`timescale1ns/100ps`include"mux_tx.v"`include"parity_tx.v"`include"clk_div_tx.v"`include"fsm_tx.v"`include"rs232_tx.v"modulers232_tx_tb();// Definición de señales de entrada y salidaregrst;regclk;regsttx;reg[7:0]d;reg[14:0]baud;regpsel;wiretx;wireeot;// Instanciacion del modulors232_txdut(.rst_i(rst),.clk_i(clk),.sttx_i(sttx),.d_i(d),.baud_i(baud),.psel_i(psel),.tx_o(tx),.eot_o(eot));// Generador de reloj de 100 MHz con duty-cycle de 50 %always#5clk=~clk;// Secuencia de reset y condiciones inicialesinitialbeginclk=0;rst=1;sttx=0;d=8'b01110011;baud=15'd10415;psel=0;#10;rst=0;#10;endinitialbegin// Configuracion de archivos de salida$dumpfile("rs232_tx_tb.vcd");$dumpvars(0,rs232_tx_tb);// Sincronizacion#30;//Estimulos de pruebasttx=1;#10;sttx=0;#10;// Esperar que acabe la transmision#(10*10415*11);//Estimulos de pruebapsel=1;#10;sttx=1;#10;sttx=0;#10;// Esperar que acabe la transmision#(10*10415*12);$display("Test completed");$finish;endendmodule;