Skip to content

Instantly share code, notes, and snippets.

@tothandras
Last active December 24, 2015 18:29
Show Gist options
  • Save tothandras/6842978 to your computer and use it in GitHub Desktop.
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 é…
`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