Forum: FPGA, VHDL & Co. spartan6 bscan jtag


von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

in dem Thread
Beitrag "Suche Softcore Alternative mit Compiler und Debugger"
wurde das Tunneln von Daten über den Jtag Port angesprochen.

Ich habe mich gerade versucht für den Spartan6 es auszuprobieren.
Zum Testen habe ich das Programm urjtag genutzt, das auch den Xilinx 
Adapter erkennt. Ich kann die Daten auf meinen LEDs richtig ausgeben 
aber die Daten nicht korrekt zurücklesen.
Es sieht so aus als fehlt einmal Schieben beim Lesen. Kann aber nicht 
sein update kommt nach dem letzten Schieben und das Schreiben stimmt.
Leider fehlt mir ein ordentliches Beispiel von Xilinx.
Da ich einen Fehler im Urjtag als auch in meinem Code nicht ausschließen 
kann Frage ans Forum. Sieht jemand einen Fehler im Code?

1
--code für Spartan6 
2
--Autor René Doß
3
4
Library ieee;
5
use IEEE.STD_LOGIC_1164.ALL;
6
use IEEE.NUMERIC_STD.ALL;
7
8
Library UNISIM;
9
use UNISIM.vcomponents.all;
10
11
12
13
entity jtag_tap is
14
15
   port(
16
        taste0 : in std_logic;
17
      taste1 : in std_logic;
18
      taste2 : in std_logic;
19
      taste3 : in std_logic;
20
        LED1 :out std_logic;
21
      LED2 :out std_logic;
22
      LED3 :out std_logic;
23
      LED0 :out std_logic
24
      );
25
26
end entity jtag_tap;
27
28
29
architecture syn of jtag_tap is
30
31
32
  signal  capture   :  std_logic := '0';  -- Test Clock
33
  signal  tdi       :  std_logic := '0';  -- Test Data In
34
  signal  tdo       :  std_logic;         -- Test Data Out
35
  signal  update    : std_logic;
36
  signal  drck      : std_logic;
37
  signal userreg    :  std_logic_vector(3 downto 0);
38
39
40
41
begin
42
43
44
   BSCAN_SPARTAN6_inst : BSCAN_SPARTAN6
45
   generic map (
46
      JTAG_CHAIN => 1  -- Value for USER command. Possible values: (1,2,3 or 4).
47
   )
48
   port map (
49
      CAPTURE => capture, -- 1-bit output: CAPTURE output from TAP controller.
50
      DRCK => drck,       -- 1-bit output: Data register output for USER functions.
51
      RESET => open,     -- 1-bit output: Reset output for TAP controller.
52
      RUNTEST => open, -- 1-bit output: Output signal that gets asserted when TAP controller is in Run Test
53
                          -- Idle state.
54
55
      SEL => open,         -- 1-bit output: USER active output.
56
      SHIFT => open,     -- 1-bit output: SHIFT output from TAP controller.
57
      TCK => open,         -- 1-bit output: Scan Clock output. Fabric connection to TAP Clock pin.
58
      TDI => TDI,         -- 1-bit output: TDI output from TAP controller.
59
      TMS => open,         -- 1-bit output: Test Mode Select output. Fabric connection to TAP.
60
      UPDATE => update,   -- 1-bit output: UPDATE output from TAP controller
61
      TDO => TDO          -- 1-bit input: Data input for USER function.
62
   );
63
64
65
  process(drck)
66
  begin  
67
   if update='1' then
68
        LED3<=userreg(3);
69
        LED2<=userreg(2);
70
      LED1<=userreg(1);
71
        LED0<=userreg(0);
72
    end if;      
73
   if rising_edge(drck) then
74
75
      userreg<= userreg(2 downto 0)& TDI;
76
      if capture='1' then
77
       userreg<=taste3 & taste2 &taste1 & taste0;
78
      end if;  
79
    end if;
80
  end process;
81
82
  tdo<=userreg(3);
83
end syn;

von Lattice User (Gast)


Lesenswert?

ich kann die zwar jetzt nicht direkt mit BSCAN helfen, aber vielleicht 
ist folgendes trotzdem nützlich.

Eine Falle beo JTAG ist, dass beim Übergang vom Capture-State zum 
DR-Shift-State das erste Bit bereits an TDO anliegen muss, da der Host 
es mit genau diesem Takt übernimmt.

So wie es aussieht, lädst du aber mit diesem Takt erst das 
Shiftregister, hängt aber davon ab welche Relation das Capture Signal 
zum DRCK hat.

Im anderen Thread von Michael zu dem Thema ist eine Anpassung des LM32 
an den Spartan6 verlinkt.

https://github.com/m-labs/lm32/tree/master/rtl

Da wird das Shiftregister immer geladen, wenn der TAP nicht im DR-Shift 
State ist. Nachteil: viel zu oft, Vorteil: rechtzeitig.

von Michael F. (mifi)


Lesenswert?

Hallo Rene,

jetzt bin ich etwas verwirrt von Deinem Beispiel. Kann es
sein das Du auch in die falsche Richtung schiebst?

Müßte man nicht userreg(0) nach tdo ausgeben, und beim input:


userreg <= TDI & userreg(3 downto 1);


Gruß,
Michael

von Martin S. (strubi)


Angehängte Dateien:

Lesenswert?

Moin,

ich habe mal ne Implementation für den sp6 angehängt.
Ist allerdings etwas älter, aber sollte funktionieren. DRCK habe ich 
nicht benutzt.

Grüsse,
- Strubi

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.