Guten Abend,
ich hoffe, jemand kann mir helfen, da ich gerade etwas verzweifele. Bin
recht noch am Anfang mit VHDL. Folgender Sachverhalt:
Verwende Basys3 mit 100 Mhz Clk.
Ich möchte gerne ein Eingang mit 1Mhz takt abtasten und diesen Wert per
Uart ausgeben. Ich möchte aber per Uart die binäre zahl des Counters
ausgeben.
Dazu 3 Prozesse:
1. Prozess 100Mhz auf 1 Mhz runtertakten
2. Prozess Wenn Eingang = 1, dann zähle Counter hoch
3. Prozess Wenn Eingang wieder auf 0 dann übertrage die Daten per Uart:
Um es relativ kurz zu halten, hier ein Auszug des Codes:
1 | entity UART_TX_CTRL is
|
2 | Port ( --SEND : in STD_LOGIC;
|
3 | --DATA : in STD_LOGIC_VECTOR (7 downto 0);
|
4 | SAMPLEINPUT: in std_logic:='0';
|
5 | CLK : in STD_LOGIC;
|
6 | READY : out STD_LOGIC;
|
7 | UART_TX : out STD_LOGIC);
|
8 | end UART_TX_CTRL;
|
9 |
|
10 |
|
11 |
|
12 | signal DATA_BYTE_20 : STD_LOGIC_VECTOR (7 downto 0):=(others => '0');
|
13 | signal DATA_BYTE_19 : STD_LOGIC_VECTOR (7 DOWNTO 0):= (others => '0');
|
14 | signal DATA_BYTE_18 : STD_LOGIC_VECTOR (7 downto 0):= (others => '0');
|
15 | signal DATA_BYTE_17 : STD_LOGIC_VECTOR (7 downto 0):= (others => '0');
|
16 | ...
|
17 |
|
18 | signal TRIGGER_SAMPLE: std_logic := '0';
|
19 | signal TRIGGER_DATAOUTPUT: std_logic :='0';
|
20 | signal cnt_100Mhz: integer range 0 to 100000000:=0;
|
21 | signal CNT_1Mhz: integer range 0 to 100000:=0;
|
22 | signal CLOCK_1Mhz: std_logic := '0';
|
23 | signal SEND : STD_LOGIC;
|
24 | begin
|
25 |
|
26 | Mhz_takt_process: process (CLK)
|
27 | begin
|
28 | if (rising_edge(CLK)) then
|
29 | if CNT_1Mhz = 5000 then
|
30 | CLOCK_1Mhz<= not CLOCK_1Mhz;
|
31 | CNT_1Mhz <= 0;
|
32 | else
|
33 | CNT_1Mhz <= CNT_1Mhz +1;
|
34 | end if;
|
35 | end if;
|
36 | end process;
|
37 |
|
38 |
|
39 | data_sample_process: process (CLOCK_1Mhz)
|
40 | begin
|
41 |
|
42 | if rising_edge (CLOCK_1Mhz) then
|
43 | if (TRIGGER_DATAOUTPUT = '0') AND (TRIGGER_SAMPLE ='0') then
|
44 | if SAMPLEINPUT = '1' then
|
45 | SAMPLE_DATA_cnt <= SAMPLE_DATA_cnt +1;
|
46 | TRIGGER_SAMPLE <='1';
|
47 | TRIGGER_DATAOUTPUT <='0';
|
48 | else
|
49 | SAMPLE_DATA_cnt <= SAMPLE_DATA_cnt;
|
50 | TRIGGER_DATAOUTPUT <='1';
|
51 | TRIGGER_SAMPLE <='0';
|
52 | end if;
|
53 | end if;
|
54 | end if;
|
55 | end process;
|
56 |
|
57 |
|
58 | data_outpout_process : process (CLK)
|
59 | begin
|
60 |
|
61 | if (TRIGGER_DATAOUTPUT = '1') AND (TRIGGER_SAMPLE ='0') then
|
62 | if cnt_100Mhz = 500 then
|
63 | DATA_BYTE_20 <= "0011000" & SAMPLE_DATA_cnt(20);
|
64 | DATA_BYTE_19 <= "0011000" & SAMPLE_DATA_cnt(19);
|
65 | DATA_BYTE_18 <= "0011000" & SAMPLE_DATA_cnt(18);
|
66 | DATA_BYTE_17 <= "0011000" & SAMPLE_DATA_cnt(17);
|
67 | ......
|
68 | elsif cnt_100Mhz = 104171 then
|
69 | DATA <= DATA_BYTE_20;
|
70 | SEND <= '1';
|
71 | cnt_100Mhz <= cnt_100Mhz+1;
|
Ich bekomme den Fehler dass, SAMPLE_DATA_cnt mehrmals gleichzeitig
verwendet wird. Mir ist auch klar, dass VHDL alles gelichzeitg ausführt
und mein Siganl in zwei Prozessen auftaucht und er deswegen streikt.
Aber ich komme auch nicht auf die Lösung wie ich es hintereinadner
ausführe?
Für Hilfe wäre ich dankbar.
Danke & Gruß
Mario