hackwerk.de erlebnisse eines bastlers

August 22, 2013

UART TX

Filed under: code,fpga — max @ 10:38 pm

sendeteil eines „software“-uarts:
ACHTUNG: versuch aus der zeit, in der ich mir VHDL erst noch beigebracht habe. 😉

-- uart.vhd
--
--        UART-TX
--
-- erstellt durch maximilian pautsch -> maximilian[at]hackwerk[punkt]de
-- 40MHz clock, 9600 baud, even parity, 8 bit!

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY uart_tx IS
    PORT(
    clk: IN std_logic;
    data: IN std_logic_vector(7 downto 0);
    transmit: IN std_logic;

    tx_port: OUT std_logic;
    tx_ready: OUT BIT
    );
END uart_tx;

ARCHITECTURE arch OF uart_tx IS
BEGIN  

run_tx: PROCESS (clk, transmit)
        VARIABLE clk_count: INTEGER RANGE 0 TO 4167;
        VARIABLE bitcount: INTEGER RANGE 0 TO 11; --wir brauchen 12 bit. das letzte ist force-high
        VARIABLE parity  : BIT  :='0';
        VARIABLE tx_run: BIT :='0';
        VARIABLE tx_event: BIT :='1';
    BEGIN

    IF transmit='1' AND transmit'event THEN
        tx_event := '1';
    END IF;
    IF tx_run='1' THEN
    	tx_event := '0';
    END IF;

	IF (clk'event AND clk='1')  THEN
		IF  tx_run='1' OR tx_event='1' THEN
			tx_run:='1';
			tx_ready<='0';

	        IF clk_count = 0 THEN

	            IF bitcount = 0 THEN
	                tx_port <='0';
	            ELSIF bitcount > 0 AND bitcount <9 THEN
	                tx_port <= data(bitcount-1);
	                IF (parity='1' AND data(bitcount-1)='1') OR (parity='0' AND data(bitcount-1)='0') THEN
	                	parity := '0';
	                ELSE
	                	parity := '1';
	                END IF;
	             --   parity := parity XOR data(bitcount-1);
	            ELSIF bitcount = 9 THEN     --parity
	            	IF parity = '1' THEN
	            		tx_port <= '1';
	            	ELSE
	            		tx_port <= '0';
	            	END IF;
	               -- tx_port <= parity;
	            ELSE
	                tx_port <='1';
	            END IF;

	            ----- ist die transmission zu ende? wenn ja: status setzen & für nächstes bit vorbereiten:
	            IF bitcount = 11 THEN
	                tx_ready <= '1';
	                bitcount := 0;
	                tx_run := '0';
	            ELSE
	                bitcount := bitcount +1;
                    -------berechnung des wertes: 40.000.000 / baudrate 
	                clk_count:=4167;  ---so viele clks während einem bit
	            END IF;

	        ELSE
	            clk_count:=clk_count-1;
	        END IF;

	    END IF;
	END IF;
END PROCESS run_tx;

END arch;

Keine Kommentare »

No comments yet.

RSS feed for comments on this post. TrackBack URL

Leave a comment

Powered by WordPress