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.
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
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;