Skip to content

Instantly share code, notes, and snippets.

@tothandras
Last active December 24, 2015 20:29
Show Gist options
  • Save tothandras/6858180 to your computer and use it in GitHub Desktop.
Save tothandras/6858180 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é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 data; // 0, 1 felvaltva
reg rts_out; // ha kuldes van 1-es
reg txd_out; // kimeno adat
reg [1:0] charactersRemaining; // hatralevo karakterek (0, 1, 2)
reg [3:0] bitCounter; // 4-bites szamlalo
reg [15:0] baudRateCounter; // 16-bites szamlalo
wire [15:0] baudRate; // megfelelo baudrate-hez tartozo orajel szam
wire baudRatePulse; // baud rate jel
// Baud Rate Counter
always @ (posedge clk)
begin
if (rst || baudRatePulse)
baudRateCounter <= 16'b0;
else
baudRateCounter <= baudRateCounter + 1;
end
// 4-Bit Counter
always @ (posedge clk)
begin
if (rst) bitCounter <= 4'b0001;
else if (baudRatePulse && charactersRemaining != 0)
begin
if (sw4 == 1'b0 && sw5 == 1'b0 && bitCounter == 4'b1001) bitCounter <= 4'b0001;
else if (sw4 == 1'b0 && sw5 == 1'b1 && bitCounter == 4'b1010) bitCounter <= 4'b0001;
else if (sw4 == 1'b1 && sw5 == 1'b0 && bitCounter == 4'b1010) bitCounter <= 4'b0001;
else if (sw4 == 1'b1 && sw5 == 1'b1 && bitCounter == 4'b1011) bitCounter <= 4'b0001;
else bitCounter <= bitCounter + 1;
end
end
// Output Logic
always @ (posedge clk)
begin
if (rst)
begin
charactersRemaining <= 2'b0;
rts_out <= 1'b0;
txd_out <= 1'b1;
data <= 1'b0;
end
else if (btn1)
charactersRemaining <= 2'b10;
else if (baudRatePulse && charactersRemaining !=0)
begin
rts_out <= 1'b1;
if (sw4 == 1'b0)
begin
if (bitCounter == 4'b0001) txd_out <= 1'b0;
else if (bitCounter <= 4'b1000) txd_out <= data;
else
begin
if (sw5 == 1'b0) txd_out <= 1'b1;
else
if (bitCounter <= 4'b1001) txd_out <= 1'b1;
else
begin
txd_out <= 1'b1;
data <= ~data;
charactersRemaining <= charactersRemaining - 1;
end
end
end
else
begin
if (bitCounter == 4'b0001) txd_out <= 1'b0;
else if (bitCounter <= 4'b1001) txd_out <= data;
else
begin
if (sw5 == 1'b0) txd_out <= 1'b1;
else
if (bitCounter <= 4'b1010) txd_out <= 1'b1;
else
begin
txd_out <= 1'b1;
data <= ~data;
charactersRemaining <= charactersRemaining - 1;
end
end
end
end
else if (baudRatePulse && charactersRemaining == 0) rts_out <= 1'b0;
end
// baudRate, 2-1 MPX
assign baudRate = (sw8 == 1'b0) ? 5208 : 1302; // counter = clock / (baudrate * samplerate)
// clock = 50Mhz = 50 000 000 Hz
// baudrate1 = 2400, baudrate2 = 9600
// samplerate = 4
// 0: 2400
// 1: 9600
// baudRatePulse Comparator
assign baudRatePulse = ( baudRateCounter == baudRate ) ? 1 : 0;
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