Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- `timescale 1ns / 1ps
- //////////////////////////////////////////////////////////////////////////////////
- // Company:
- // Engineer:
- //
- // Create Date: 19:54:14 10/25/2016
- // Design Name:
- // Module Name: uart
- // Project Name:
- // Target Devices:
- // Tool versions:
- // Description:
- //
- // Dependencies:
- //
- // Revision:
- // Revision 0.01 - File Created
- // Additional Comments:
- //
- //////////////////////////////////////////////////////////////////////////////////
- module uart(
- input clk,
- input rst,
- input [3:0] bcd0,
- input [3:0] bcd1,
- output tx_out
- );
- reg [32:0] tx_shr; //1 startbit+7 adatbit+paritás bit+2 stopbit=11 bit. 3-szor kell átvinni 3*11=33 bit.
- reg [5:0] tx_cntr; //Számlálónak 33-ig kell számolni így 6 bites számlálónk kell.
- wire tx_en;
- reg out;
- reg [7:0] rate; //115200bps sebesség kell! Ehhez a 16Mhz-es órajelet 115200-al kell leosztani. Ez a hányados eredménye közelítőleg 139. Ehhez 8 bitre van szükségünk.
- assign tx_out=out; //Kimenetnek értékadás.
- always@(posedge clk)
- begin
- if(rst) rate<=0; //resetjelre jelosztó 0-zása.
- else if(rate==139) rate<=0; //ha eléri a 139-et akkor töltöttsük be a 0-át.
- else rate<=rate+1; //ha nincs resetjel, és nem értünk a 139-hez akkor számoljunk tovább.
- end
- always@(posedge clk)
- begin
- if(rst) //resetjel esetén
- begin
- tx_shr<=0; //0-zuk a shift regiszter.
- tx_cntr<=0; //0-zuk a számlálót.
- out<=1; //Idle állapot 1 értékről indul.
- end
- else
- begin
- if(tx_en==1) //van engedélyező jelünk
- begin
- if(tx_cntr==0) // 0-ás fázisban vagyunk
- begin
- tx_shr[32]<=0; //startbit
- tx_shr[31:25]<={bcd1[0],bcd1[1],bcd1[2],bcd1[3],3'b110}; //adatbitek, lsb->msb sorrendben, hexa számok a 3X kezdetüek(source: wikipedia)
- tx_shr[24]<=bcd1[0]^bcd1[1]^bcd1[2]^bcd1[3]; //paritáás bit számítása páros paritáshoz
- tx_shr[23:22]<=2'b11; //2 stopbit
- //ugyanez a másik számjegyre
- tx_shr[21]<=0; //startbit
- tx_shr[20:14]<={bcd0[0],bcd0[1],bcd0[2],bcd0[3],3'b110}; //adatbitek, lsb->msb sorrendben, hexa számok a 3X kezdetüek(source: wikipedia)
- tx_shr[13]<=bcd0[0]^bcd0[1]^bcd0[2]^bcd0[3]; //paritáás bit számítása páros paritáshoz
- tx_shr[12:11]<=2'b11; //2 stopbit
- //ugyanez a kocsi-vissza karakterre
- tx_shr[10]<=0; //startbit
- tx_shr[9:3]<=7'b1011000; //adatbitek, lsb->msb sorrendben, kocsi vissza karakter értéke: 0dh
- tx_shr[2]<=1; //3db 1-es bit így páros paritás esetén 1-es érték szükséges
- tx_shr[1:0]<=2'b11; //2 stopbit
- //ekkor 32 darab kiküldendő bit van az összesen 33 állapotunk, a 32 kiküldendő bit és a kezdőfázis amikor beolvassuk az adatokat.
- tx_cntr<=32;
- out<=1; //Idle állapot visszaállítása 1
- end
- else
- begin
- out<=tx_shr[32];
- tx_shr<={tx_shr[31:0],1'b0};
- tx_cntr<=tx_cntr-1;
- end
- end
- end
- end
- endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement