Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module uart(
- input clk,
- input rst,
- input [3:0] bcd0,
- input [3:0] bcd1,
- output tx_out
- );
- reg [32:0] tx_shr; // Shiftregiszter amibe betöltjük az egy ciklus során küldendő összes bitet
- reg [5:0] tx_cntr; // Ebben a számlálóban tároljuk, hogy a ciklus melyik fázisánál járunk
- reg tx_en; // CLK engedélyező jel a baud rate beállításához
- reg [8:0] rg_cntr; // számláló a baud rate beállításához
- reg [0:0] p0; // paritásbitek
- reg [0:0] p1;
- reg tx_outr;
- always @(posedge clk)
- if (rst) // Reset esetén alaphelyzetbe állítunk
- begin
- tx_shr<=0;
- tx_cntr<=0;
- tx_en<=0;
- rg_cntr<=0;
- tx_outr<=1;
- end
- else
- begin // Baud rate beállítása:
- if(rg_cntr==278) // 57600 bps-hez 278-el kell leosztani a 16 Mhz-es órajelet
- begin
- rg_cntr<=0;
- tx_en<=1;
- end
- else
- begin
- rg_cntr<=rg_cntr+1;
- tx_en<=0;
- end
- end
- always @(posedge tx_en)
- begin
- if(tx_cntr!=0)
- begin // ha nem a ciklus elején vagyunk minden
- tx_outr<=tx_shr[0]; //fázisnál tx_shr következő elemét küldjük a kimenetre
- tx_shr<=tx_shr>>1;
- tx_cntr<=tx_cntr-1;
- end
- else // A ciklus elején feltöltjük a ciklusho tartozó összes bittel tx_shr-t
- begin
- //bcd1-hez tartozó bitek: stop bit, paritásbit, ASCII kód, start bit
- tx_shr[10:0]<={1'b1, p1, 4'b0011, bcd1[3:0] ,1'b0};
- //bcd0-hoz tartozó bitek:
- tx_shr[21:11]<={1'b1, p0, 4'b0011, bcd0[3:0], 1'b0};
- //kocsi vissza karakterhez tartozó bitek:
- tx_shr[32:22]<={1'b1, 1'b0, 8'b00001101, 1'b0};
- tx_cntr<=32; //visszaállítjuk a számlálót
- tx_outr<=1; //1-be állítjuk a kimenetet
- end
- end
- always @(bcd0, bcd1) //bcd0 vagy bcd1 megváltozásakor újraszámoljuk a paritásbiteket
- begin
- p0<=~^bcd0;
- p1<=~^bcd1;
- end
- assign tx_out=tx_outr;
- endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement