Ik ben voor mijn eerste keer een projectje aan het maken met een Fpga en gebruik voor het eerst VHDL. Ik gebruik de SPARTAN 3e starters kit.
De bedoeling is om een UART verbinding met de pc te maken (met labview) en dan zo via de FPGA iets te gaan aansturen.
Ik heb het programma opgesplitst en ben begonnen met het 'zendgedeelte'.
Dit bevat 3 blokken ; Buffer, Writecontrol en Multiplexer
(clockdivider gebruik ik niet, en ook geen pariteitscontrole omdat dit voor mijn toepassing niet nodig is)
De snelheid om te communiceren heb ik ingesteld d.m.v een teller die elke keer afloopt en dus tussen elke bit een bepaalde tijd wacht om te versturen. (19200Hz)
In Modelsim krijg ik alle signalen en werkt de code perfect, echter in de praktijk niet. Ik heb al verschillende tests gedaan door de data in te stellen met de 4 schakelaars en weer te geven op de leds.
Zo wil ik achter de buffer de data op de leds brengen, maar dit lukt niet. Als ik de buffer apart test werkt deze wel, dus VERMOED ik dat er ergens iets mis is met de writecontrol.
Ook heb ik al vreemde dingen meegemaakt met leds...
1. Ik gebruik een drukknop om iets op de leds te tonen. Maar als ik nog maar mijn vinger boven de drukknop hou(dus niet induw), springt de led al aan ... heeft dit te maken met pull-up of pull down weerstanden???
2. Als ik op de Fpga chip duw met mijn vinger gaat de led van mijn internet poort branden ..... uhn ???
Kort samengevat:
-Data geraakt niet verzonden
-Vreemde dingen die gebeuren met de leds
KAN ER MIJ IEMAND HELPEN AUB ?
Als er iemand is die denkt dat hij weet wat ik fout doe of waar het probleem zich bevind wil ik zeker en vast mijn .vhdl files eens ergens uploaden.
Hier alvast de writecontrol code :
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
-- Create Date: 09:21:53 04/22/2008
-- Design Name:
-- Module Name: writecontrol Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
-- Dependencies:
-- Revision:
-- Revision 06-05-08 - File Created
-- Additional Comments: klote
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity writecontrolthuis is
Port ( wcclkin : in STD_LOGIC;--clock
wcsd : in STD_LOGIC;-- write control send data pin
wcsend : out STD_LOGIC;--write control zend pin gaat naar buffer een 1 sturen
wcbusy : out STD_LOGIC;-- write control pin voor de busy led te doen branden
wcmuxsel : out STD_LOGIC_VECTOR (3 downto 0);--pin voor de selectie wat er naar TX moet doorgestuurd worden
wcreset : in STD_LOGIC );--knopje om te resetten moest er iets fout gaan. Je komt dan in de Idle toestand
end writecontrolthuis;
architecture Behavioral of writecontrolthuis is
type state is (idle,load,start,d0,d1,d2,d3,stop);
signal toestand : state;
signal vorige_wcsd : STD_LOGIC :='0';
signal delay : STD_LOGIC_VECTOR(11 downto 0) :="101000101100"; --19bits/sec
begin
process(wcclkin,wcreset)
begin
if (wcreset = '1') then
toestand <= idle;
elsif(wcclkin'EVENT and wcclkin='1') then
vorige_wcsd<=wcsd; -- hiermee kijken we alleen naar de positieve flank
case toestand is
when idle=>
if (wcsd='1'and vorige_wcsd='0') then --reageert een keer op de positieve flank(geen dender etc)
toestand<=load;
wcbusy<='1'; --lampje aan
else
wcbusy<='0'; --lampje uit
end if;
wcsend<='0' ; --niets doorsturen
wcmuxsel<="0110"; --stop toestand(TX='1')
when load=> --data op de buffer wordt klaargezet aan de multiplexer
wcbusy<='1'; --lampje aan
wcsend<='1'; --data gaat door buffer naar multiplexer
wcmuxsel<="0110"; --stop toestand(TX='1')
toestand<=start;
delay<="000000000011"; --3 klokpulsen gewacht om zeker te zijn dat data in buffer zeker wordt gelezen
when start=> --de multiplexer gaat de waarden start,d0,d1,d2,d3,stop af
if delay= 0 then
wcsend<='0'; --zend signaal wordt terug op 0 gezet ,data is doorgestuurd naar multiplexer
wcmuxsel<="0001"; --start toestand
wcbusy<='1'; --lampje aan
toestand<=d0; --volgende toestand laden
delay<="101000101100"; --zonder clockdivider willen we op 19200bits /sec
--50M/19200= 2604
end if;
when d0=>
if delay= 0 then
wcmuxsel<="0010"; --d0
wcbusy<='1'; --lampje aan
wcsend<='0';
toestand<=d1;
delay<="101000101100";
end if;
when d1=>
if delay= 0 then
wcmuxsel<="0011"; --d1
wcbusy<='1'; --lampje aan
wcsend<='0';
toestand<=d2;
delay<="101000101100";
end if;
when d2=>
if delay= 0 then
wcmuxsel<="0100"; --d2
wcbusy<='1'; --lampje aan
wcsend<='0';
toestand<=d3;
delay<="101000101100";
end if;
when d3=>
if delay= 0 then
wcmuxsel<="0101"; --d3
wcbusy<='1'; --lampje aan
wcsend<='0';
toestand<=stop;
delay<="101000101100";
end if;
when stop=>
if delay= 0 then
wcmuxsel<="0110"; --stop toestand tx =1
wcsend<='0';
wcbusy<='0'; --lampje weer uit
toestand<=idle;
end if;
when others=>
toestand<=idle;
end case;
delay <= delay-1; --elke 2604 klokpulsen komt er 1 bit aan (19.2khz)
--wordt continu gedaan
end if;
end process;
end Behavioral;
Goeievraag
Mijn posts dienen u in perfecte staat te bereiken. Mocht u op wat voor wijze dan ook ontevreden zijn, stuur dan de site, met post en leesdatum, naar: ongeldig@dres.nl
Op 7 mei 2008 10:49:00 schreef independent_62: ... heeft dit te maken met pull-up of pull down weerstanden???
Mogelijk, die moet je wel definieren. De code hiervoor staat letterlijk in de handleiding voor je bordje, ug230.pdf .
Ok, alvast bedankt.
Ondertussen werkt het programma, ik denk dat er iets fout was met een reset knopje dat ik had aangesloten