Advertisement
Guest User

Untitled

a guest
Oct 25th, 2016
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.91 KB | None | 0 0
  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 19:54:14 10/25/2016
  7. // Design Name:
  8. // Module Name: uart
  9. // Project Name:
  10. // Target Devices:
  11. // Tool versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21. module uart(
  22. input clk,
  23. input rst,
  24. input [3:0] bcd0,
  25. input [3:0] bcd1,
  26. output tx_out
  27. );
  28.  
  29. reg [32:0] tx_shr; //1 startbit+7 adatbit+paritás bit+2 stopbit=11 bit. 3-szor kell átvinni 3*11=33 bit.
  30. reg [5:0] tx_cntr; //Számlálónak 33-ig kell számolni így 6 bites számlálónk kell.
  31. wire tx_en;
  32. reg out;
  33. 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.
  34.  
  35. assign tx_out=out; //Kimenetnek értékadás.
  36.  
  37. always@(posedge clk)
  38. begin
  39. if(rst) rate<=0; //resetjelre jelosztó 0-zása.
  40. else if(rate==139) rate<=0; //ha eléri a 139-et akkor töltöttsük be a 0-át.
  41. else rate<=rate+1; //ha nincs resetjel, és nem értünk a 139-hez akkor számoljunk tovább.
  42. end
  43.  
  44.  
  45. always@(posedge clk)
  46. begin
  47. if(rst) //resetjel esetén
  48. begin
  49. tx_shr<=0; //0-zuk a shift regiszter.
  50. tx_cntr<=0; //0-zuk a számlálót.
  51. out<=1; //Idle állapot 1 értékről indul.
  52. end
  53. else
  54. begin
  55. if(tx_en==1) //van engedélyező jelünk
  56. begin
  57. if(tx_cntr==0) // 0-ás fázisban vagyunk
  58. begin
  59. tx_shr[32]<=0; //startbit
  60. 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)
  61. tx_shr[24]<=bcd1[0]^bcd1[1]^bcd1[2]^bcd1[3]; //paritáás bit számítása páros paritáshoz
  62. tx_shr[23:22]<=2'b11; //2 stopbit
  63. //ugyanez a másik számjegyre
  64. tx_shr[21]<=0; //startbit
  65. 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)
  66. tx_shr[13]<=bcd0[0]^bcd0[1]^bcd0[2]^bcd0[3]; //paritáás bit számítása páros paritáshoz
  67. tx_shr[12:11]<=2'b11; //2 stopbit
  68. //ugyanez a kocsi-vissza karakterre
  69. tx_shr[10]<=0; //startbit
  70. tx_shr[9:3]<=7'b1011000; //adatbitek, lsb->msb sorrendben, kocsi vissza karakter értéke: 0dh
  71. tx_shr[2]<=1; //3db 1-es bit így páros paritás esetén 1-es érték szükséges
  72. tx_shr[1:0]<=2'b11; //2 stopbit
  73. //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.
  74. tx_cntr<=32;
  75. out<=1; //Idle állapot visszaállítása 1
  76. end
  77. else
  78. begin
  79. out<=tx_shr[32];
  80. tx_shr<={tx_shr[31:0],1'b0};
  81. tx_cntr<=tx_cntr-1;
  82. end
  83. end
  84. end
  85. end
  86. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement