Beste,

Ik ben bezig met een projectje met de Xilinx spartan 3. Het gaat over volgende chip: xc3s50an

Ik heb een programma geschreven dat vooral bestaat uit een "state-machine". Ik heb toestand 1 tot 17 dat ik gebruik. Nu heb ik op mij circuit vooraf een seriele verbinding voorzien maar deze gebruikte ik tot vandaag niet. Nu had ik gewoon het cijfer van de toestand waarin mijn FPGA zich bevind willen doorsturen zodat ik dit kon bekijken via de PC.

Wanneer we op google gaan kijken om de seriele verbinding te configureren van de FPGA vinden we vele resultaten maar deze lijken me allemaal vrij lang en ingewikkeld. Ik ben meer gewend om met een PIC te werken in C en daar is serieel een bericht verzenden vrij simpel, 1 regel code :-)

Is er iets dergelijks bij de FPGA?

Alvast bedankt

Nee. Je zult een uart transmitter moeten schrijven in VHDL.

Je maakt een statemachine met 3 of 4 states. Een idle state waarin de lijn hoog is. Een state waarin je je vector uitleest en als een soort shiftregister op de lijn zet, en een state waarin je je stopbit e.d zet.
De statemachine laat je lopen op de frequentie bijbehorend bj je gewenste baudrate.

Waarom zet je de state niet gewoon op een paar extra pinnen van je fpga? Paar LEDs eraan is nog mooier, dan zie het gelijk wat ie doet.

Nog mooier: maak een testbench en simuleer de zaak eerst een keer voordat je de het de fpga in schiet.

Na wat zoeken en veel lezen heb ik dan toch iets gevonden. De bedoeling was eigenlijk om een simpele module ergens te kopieren en deze in mijn programma in te voegen maar helaas vond ik niets dat meteen werkte. De rs232 diende niet om mijn programma te bouwen maar eerder om te gebruiken als "debugger". daarom Hierna mijn code. Baudrate 115200, 8bits, 1 stopbit, geen parity.

Het is misschien niet volledig perfect geschreven maar het werkt voor mij goed genoeg en het kan andere helpen die hetzelfde denken als mij.


library ieee;
    use ieee.std_logic_1164.all;
	 USE IEEE.numeric_std.all;
--------------------------------------------------------------
                          --entity--
--------------------------------------------------------------

entity RS232 is
    port (sys_clk: in std_logic;
		  start_TX : in  STD_LOGIC:='0'; -- write enable
          tx_end : out std_logic; --end trasmission              
          txd : out  STD_LOGIC:='0');
end entity RS232;

--------------------------------------------------------------
                        --architecture--
--------------------------------------------------------------

architecture RS232 of RS232 is
	
	constant n  : integer range 0 to 512 := 434;--434;  50 000 000/115200 = 434 ==> BAUDRATE = 115200
	signal clko : std_logic :='1';
	signal shift : std_logic_vector(10 downto 0);
	signal bit_tx : integer range 0 to 15  :=0;
	signal send_bit : integer range 0 to 15  :=0;
	
   begin
   
   shift <= "10000000001";   -- Hier wordt waarde 00H ingevoegd. De waarde telt vanaf de 2e bit tot de 9e bit.
   shift <= "10110000101";   -- Hier is de waarde 61H.

   process(sys_clk,start_TX)
   variable counter : integer range 0 to 2047 := 0;

begin
        
    if(sys_clk='1' and sys_clk'event) then

        if(start_TX = '1') then            
            counter :=0;
        else

            if(counter = n) then
                counter :=0;
                clko <= '1';
            else
                clko <= '0';
                counter := counter +1;
            end if;
        end if;
    end if;
    
end process;

process(clko,start_TX)
begin
	 if(clko='1' and clko'event) then
		
			if (send_bit=9) then
				send_bit <= 0;
			else send_bit <= send_bit + 1;
			end if;
    end if;    
end process;


process(clko,start_TX)
begin

        if(start_TX = '1') then            
            bit_tx <= 0;
            tx_end <='0'; -- busy to send byte
        elsif(clko='1' and clko'event) then
            if(start_TX = '0') then                    
                if bit_tx = 11 then
                    tx_end <='1'; -- ready for a new trasmission
                else
                    bit_tx <= bit_tx +1;						  
                end if;
            end if;        
        end if;    
end process;

txd <= shift(send_bit);

	
end architecture RS232;