Last active
December 24, 2015 18:29
-
-
Save tothandras/6842978 to your computer and use it in GitHub Desktop.
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Engineers: Toth Andras / Szell Andras
// // Create Date: 11:42:27 10/06/2013 // Module Name: uart // Project Name: MeresLabor1 HF
// Description: // Soros adó egység (UART)
//
// Realizálás: FPGA mérőpanelen
//
// A soros adó egység start é…
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
`timescale 1ns / 1ps | |
////////////////////////////////////////////////////////////////////////////////// | |
// Engineers: Toth Andras / Szell Andras | |
// | |
// Create Date: 11:42:27 10/06/2013 | |
// Module Name: uart | |
// Project Name: MeresLabor1 HF | |
// Description: | |
// Soros adó egység (UART) | |
// | |
// Realizálás: FPGA méropanelen | |
// | |
// A soros adó egység start és stop bittel keretezett, speciális karakterpárosokat ad a panel aszinkron soros portjának TXD vonalán az RS232/V24 szabvány eloírásainak megfeleloen (lásd 3. mérés dokumentáció). (A Start bit 0 értéku, a Stop bit 1 értéku, a megfelelo jelszinteket az FPGA panelbe épített szintkonverter áramkör biztosítja.). | |
// Az egység adást a BTN1 gomb minden megnyomására kiad egy karakterpárost. Az adás megkezdésekor a soros port RTS vonalát ON állapotba kapcsolja, majd az utolsó karakter kiadása után a vonalat visszakapcsolja OFF állapotba (az RTS vonal a panelen nincs kivezetve, de funkcionálisan helyesen kell megvalósítani). | |
// | |
// Az adatátvitel paraméterei: | |
// Az egység egymás után felváltva 000...0 és 111...1 karaktert ad. | |
// A karakterek az SW4 kapcsoló OFF állásában 7 bitesek, ON állásában 8 bitesek. | |
// A stop bitek száma az SW5 kapcsoló állásától függoen 1 vagy 2. | |
// A Baud-rate 2400 vagy 9600, értéke az SW8 kapcsolóval választható. | |
// | |
// Kötelezo szinkron rendszer tervezése, azaz az összes FF órajel bemenetére az 50 MHz-es rendszerórajelet kell kötni! | |
////////////////////////////////////////////////////////////////////////////////// | |
module uart( | |
input rst, | |
input clk, | |
input btn1, | |
input sw4, | |
input sw5, | |
input sw8, | |
output rts, | |
output txd | |
); | |
reg rts_out; | |
reg txd_out; | |
reg counterRst; | |
reg [15:0] baudRate; | |
reg [15:0] baudRateCounter; | |
reg [3:0] bitCounter; | |
wire baudRatePulse; | |
// Baud Rate Counter | |
always @ (posedge clk) | |
begin | |
if(rst == 1'b1 || baudRatePulse == 1'b1) | |
baudRateCounter <= 16'h00; | |
else | |
baudRateCounter <= baudRateCounter + 1; | |
end | |
// baudRate, 2-1 MPX | |
always @ (sw8) | |
baudRate <= (sw8 == 1'b0) ? 5208 : 1302; // keplet: counter = clock / (baudrate * samplerate) | |
// clock = 50Mhz = 50 000 000 Hz | |
// baudrate1 = 2400, baudrate2 = 9600 | |
// samplerate = 4 | |
// 0-ra 2400 | |
// 1-ra 9600 | |
// 4 bit counter | |
always @ (posedge clk) | |
begin | |
if (sw4 == 0) | |
if (sw5 == 0) | |
if (bitCounter == 4'b1001) | |
counterRst <= 1; | |
else | |
counterRst <= 0; | |
else | |
if (bitCounter == 4'b1010) | |
counterRst <= 1; | |
else | |
counterRst <= 0; | |
else | |
if (sw5 == 0) | |
if (bitCounter == 4'b1010) | |
counterRst <= 1; | |
else | |
counterRst <= 0; | |
else | |
if (bitCounter == 4'b1011) | |
counterRst <= 1; | |
else | |
counterRst <= 0; | |
if (rst || counterRst) | |
bitCounter <= 4'b0; | |
else if (baudRatePulse) | |
bitCounter <= bitCounter + 1; | |
else | |
bitCounter <= bitCounter; | |
end | |
// output logic | |
always @ (posedge clk) | |
begin | |
if (bitCounter == 4'b0001) | |
begin | |
txd_out <= 1'b0; | |
rts_out <= 1'b0; | |
end | |
else if (bitCounter > 4'b0001) | |
begin | |
if (sw4 == 0) // 7 adatbit | |
begin | |
if (bitCounter <= 4'b1000) | |
txd_out <= 1'b0; // adatbitek | |
else if (bitCounter > 4'b1000) | |
begin | |
if (sw5 == 0 && bitCounter == 4'b1001) | |
txd_out <= 1'b1; | |
else if (sw5 == 1 && bitCounter == 4'b1001) | |
txd_out <= 1'b1; | |
else if (sw5 == 1 && bitCounter == 4'b1010) | |
begin | |
txd_out <= 1'b1; | |
rts_out <= 1'b1; | |
end | |
end | |
end | |
else if (sw4 ==1) // 8 adatbit | |
begin | |
if (bitCounter <= 4'b1001) | |
txd_out <= 1'b0; // adatbitek | |
else if (bitCounter > 4'b1001) | |
begin | |
if (sw5 == 0 && bitCounter == 4'b1010) | |
txd_out <= 1'b1; | |
else if (sw5 == 1 && bitCounter == 4'b1010) | |
txd_out <= 1'b1; | |
else if (sw5 == 1 && bitCounter == 4'b1011) | |
begin | |
txd_out <= 1'b1; | |
rts_out <= 1'b1; | |
end | |
end | |
end | |
end | |
end | |
assign baudRatePulse = ( baudRateCounter == baudRate )? 1'b1 : 1'b0; | |
assign txd = txd_out; | |
assign rts = rts_out; | |
endmodule |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment