Forum: FPGA, VHDL & Co. FSL doppel lesen in zwei Takten


von olpo (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Welt,

ich möchte Daten aus einem Xilinx FSL_Bus lesen.
Allerdings scheint die Doku nicht ganz richtig zu sein. Oder liege ich 
falsch?
So wie in der Doku beschrieben, kann ich doch zweimal die Fifo poppen in 
zwei Takten. ( siehe Anhang).
Wenn ich das probiere, liegen im zweiten Takt aber immer noch die alten 
Werte an.
1
entity user_logic is
2
  port(
3
  FSL_Clk      : in  std_logic;
4
  FSL_Rst      : in  std_logic;
5
  FSL_S_Read   : out std_logic;
6
  FSL_S_Data   : in std_logic_vector(0 to 31);
7
  FSL_S_Exists : in  std_logic; );
8
end entity user_logic;
9
10
architecture Beispiel of user_logic is
11
  
12
  type STATE_TYPE is ( eins, zwei);
13
  signal state : STATE_TYPE;
14
15
  signal fsl_s_data_i : std_logic_vector(31 downto 0);
16
17
  signal var          : std_logic_vector( 31 downto 0);
18
19
begin  
20
     
21
  fsl_s_data_i    <= FSL_S_Data;
22
23
  PROCCOLI : process ( FSL_Clk) is 
24
  begin
25
    if ( FSL_Clk'event and FSL_Clk = '1') then
26
      if ( FSL_Rst = '1') then
27
  FSL_S_Read <= '0';
28
  var        <= ( others => '0');
29
        state      <= eins;
30
      else
31
  case state is
32
33
          when eins =>
34
      if FSL_S_Exists = '1' then
35
              var <= fsl_s_data_i;
36
              FSL_S_Read <= '1';
37
              state      <= zwei;
38
            else
39
              FSL_S_Read <= '0';
40
            end if;
41
    
42
          when zwei =>
43
      if FSL_S_Exists = '1' then
44
              var <= fsl_s_data_i;
45
-- hier liegt alter Wert an.
46
              FSL_S_Read <= '1';
47
              state      <= fertig;
48
            else
49
              FSL_S_Read <= '0';
50
            end if;
51
     
52
         end case;
53
      end if;
54
    end if;
55
  end process;
56
end architicture;

Oder muss ich zwischen jedem Pop einen Takt Pause machen?
Oder kann man das Problem anders lösen? Vielleicht den Takt etwas 
verzögern?

von Klaus F. (kfalser)


Lesenswert?

olpo schrieb:
> Hallo Welt,
>
> ich möchte Daten aus einem Xilinx FSL_Bus lesen.
> Allerdings scheint die Doku nicht ganz richtig zu sein. Oder liege ich
> falsch?
Die Doku wird schon stimmen.

> So wie in der Doku beschrieben, kann ich doch zweimal die Fifo poppen in
> zwei Takten. ( siehe Anhang).
> Wenn ich das probiere, liegen im zweiten Takt aber immer noch die alten
> Werte an.
Simuliere Dein Design, dann wirst Du sehen, dass FSL_S_Read falsch 
gesetzt wird.

> Oder muss ich zwischen jedem Pop einen Takt Pause machen?
> Oder kann man das Problem anders lösen?
FSL_READ muss kombinatorisch gesetzt werden.

> Vielleicht den Takt etwas
> verzögern?
Gott bewahre ...

von olpo (Gast)


Lesenswert?

Ahja danke.

Und wie ist das bei dem folgenden Beispiel?
Sieht ziemlich riskant aus, oder? Sollte ich da besser eine Pause 
machen?
1
cnt : unsigned ( 7 downto 0);
2
3
begin 
4
5
  FSL_S_Read <= FSL_S_Exists AND state = eins AND cnt /= 0
6
                else '0';
7
8
  PENG_PENG : process ( FSL_Clk)
9
  begin
10
    if FSL_Clk'event and FSL_Clk = '1' then
11
      ...
12
     
13
      when eins =>
14
        if cnt /= 0 then
15
          if FSL_S_Exists = '1' then
16
            cnt = cnt - 1; -- RISIKO?
17
         -- FSL_S_Read = '1';
18
         ...

von olpo (Gast)


Lesenswert?

Wahrscheinlich wird die FSL_Fifo das FSL_S_Read <= '1' übersehen, wenn 
cnt von 1 auf 0 dekrementiert wird, oder?
Wie könnte ich das lösen?

von olpo (Gast)


Lesenswert?

ok ok, bin ja schon selber drauf gekommen.
1
FSL_S_Read <= FSL_S_Exists AND state = eins AND cnt_BUF /= 0
2
                else '0';
3
4
  PENG_PENG : process ( FSL_Clk)
5
  begin
6
    if FSL_Clk'event and FSL_Clk = '1' then
7
      ...
8
     
9
      when eins =>
10
        if cnt /= 0 then
11
          if FSL_S_Exists = '1' then
12
            cnt_BUF <= cnt;
13
            cnt <= cnt - 1;
14
         -- FSL_S_Read <= '1';

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.