国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

JTAG標準的狀態機實現

FPGA設計論壇 ? 來源:CSDN技術社區 ? 2025-08-21 15:12 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

JTAG標準的狀態機實現

JTAG作為一項國際標準測試協議(IEEE1149.1兼容),主要用于芯片內部測試和調試。目前的主流芯片均支持JTAG協議,如DSPFPGAARM、部分單片機等。標準的JTAG接口是20Pin,但JTAG實際使用的只有4根信號線,再配合電源、地。目前常見的各種接口形式(20pin、14pin、10pin):

c5ac1c30-7e58-11f0-a18e-92fbcf53809c.png

JTAG標準介紹

JTAG的基本原理是在器件內部定義一個TAP(Test Access Port)(測試訪問口)通過專用的JTAG測試工具對內部節點進行測試。JTAG測試允許多個器件通過JTAG接口串聯在一起,形成一個JTAG鏈,能實現對各個器件分別測試。JTAG引腳的定義如下列表所示:

TCK:TCK在IEEE1149.1標準里是強制要求的。TCK為TAP的操作提供了一個獨立的、基本的時鐘信號,TAP的所有操作都是通過這個時鐘信號來驅動的;

TMS:TMS在IEEE1149.1標準里是強制要求的。TMS信號在TCK的上升沿有效,用來控制TAP狀態機的轉換。通過TMS信號,可以控制TAP在不同的狀態間相互轉換;

TDI:TDI在IEEE1149.1標準里是強制要求的。TDI是數據輸入的接口,所有要輸入到特定寄存器的數據都是通過TDI接口一位一位串行輸入的(由TCK驅動);

TDO:TDO在IEEE1149.1標準里是強制要求的。TDO是數據輸出的接口,所有要從特定的寄存器中輸出的數據都是通過TDO接口一位一位串行輸出的(由TCK驅動);

TRST:可選項,TRST可以用來對TAP控制器進行復位(初始化)。因為通過TMS也可以對TAP控制器進行復位(初始化),所以有四線JTAG與五線JTAG之分;

RTCK:可選項,由目標端反饋給仿真器的時鐘信號,用來同步TCK信號的產生,不使用時直接接地;

nSRST:可選性與目標板上的系統復位信號相連,可以直接對目標系統復位。同時可以檢測目標系統的復位情況,為了防止誤觸發,應在目標端是哪個加上適當的上拉電阻

JTAG標準的信號時序如下圖所示:

c5c6b996-7e58-11f0-a18e-92fbcf53809c.png

通過JTAG連接,可以完成如下的功能:

對所有串接在一起的IC進行引腳連接性測試,確認PCB是否焊接正常;

CPU、DSP、FPGA等進行調試;

通過JTAG對FPGA進行編程

進行引腳連接測試的JTAG用法如下圖所示,各個芯片引腳的連通狀態可以一次串接通信到PC的TDO引腳中。

c5deb244-7e58-11f0-a18e-92fbcf53809c.png

按照菊花鏈方式串接調試的JTAG用法如下圖所示,多個串接在一起的CPU和FPGA都能夠一起進行調試和測試。

c5e88b7a-7e58-11f0-a18e-92fbcf53809c.png

上圖可以看出JTAG的調試原理:

所有調試芯片的IR寄存器串接在一起,然后進行串行移位,最后,所有數據都進入到JTAG口的TDO中;PC通過對TDO數據的串并轉換,獲得每個CPU、DPS或FPGA的內部寄存器狀態。

PC將需要寫入CPU、DSP或FAPG的數據通過并串轉換放置到TDI總線上,最后通過狀態移位到規定的CPU寄存器上,最后通過TMS制定生效時刻。

TCK就是TDI和TDO的移位時鐘,而TMS則是控制指令。

因此,JTAG通過一個標準狀態機就能夠將CPU/DSP/FPGA的內部狀態查明,也能改變內部寄存器內容,這也是一種狀態控制原理。在1990年之前,JTAG的狀態機基本是由各個廠商自行定義的,但后來出現的IEEE1149.1標準對狀態轉移過程進行了標準化。在某種意義上講,JTAG的狀態機實現過程是最佳的FSM學習對象。

JTAG狀態機設計

JTAG內部的狀態轉換圖如下圖所示,其中的狀態值可以由讀者自行定義,但推薦采用獨熱編碼或者格雷碼進行編碼。其中連續的5個TMS為1時,就會回到Test-Logic-Reset狀態。

c5f6c384-7e58-11f0-a18e-92fbcf53809c.png

下面的代碼是實現JTAG功能的FSM部分,該代碼已經應用到多款ASIC芯片中,具有較高的研究價值。

//TAP FSM implementation

module tap_FSM #(parameter sync_mode = 1)(

input tck,

input trst_n,

input tms,

input tdi,

output byp_out,

output updateIR,reset_n,

output reg clockDR, updateDR, clockIR, tdo_en, shiftDR,shiftIR,

output selectIR, sync_capture_en, sync_update_dr, flag,

output [15:0] tap_state

);

//Inter signal declaration

reg [15:0] state;

reg [15:0] next_s;

reg scan_out_a, scan_out_s, updateIR_a;

localparam TEST_LOGIC_RESET = 16'h0001, RUN_TEST_IDLE = 16'h0002, SELECT_DR_SCAN = 16'H0004,

CAPTURE_DR= 16'h0008, SHIFT_DR = 16'h0010, EXIT1_DR = 16'h0020,PAUSE_DR = 16'h0040,

EXIT2_DR = 16'h0080, UPDATE_DR= 16'h0100, SELECT_IR_SCAN = 16'h0200,

CAPTURE_IR= 16'h0400, SHIFT_IR = 16'h0800, EXIT1_IR = 16'h1000,

PAUSE_IR = 16'h2000, EXIT2_IR = 16'h4000, UPDATE_IR= 16'h8000;

assign flag = state[10] || state[11];

wire updateIR_s = state == UPDATE_IR;

assign updateIR = sync_mode ? updateIR_s : updateIR_a;

assign tap_state= state;

always @(posedge tck or negedge trst_n)

if ( !trst_n )

state<=TEST_LOGIC_RESET;

else

state<=next_s;

always @(*)

case(state)

TEST_LOGIC_RESET: if(tms)

next_s=TEST_LOGIC_RESET;

else

next_s=RUN_TEST_IDLE;

RUN_TEST_IDLE: if( tms )

next_s=SELECT_DR_SCAN;

else

next_s=RUN_TEST_IDLE;

SELECT_DR_SCAN: if(tms)

next_s=SELECT_IR_SCAN;

else

next_s=CAPTURE_DR;

CAPTURE_DR: if(tms)

next_s=EXIT1_DR;

else

next_s=SHIFT_DR;

SHIFT_DR: if(tms)

next_s=EXIT1_DR;

else

next_s=SHIFT_DR;

EXIT1_DR: if(tms)

next_s=UPDATE_DR;

else

next_s=PAUSE_DR;

PAUSE_DR: if(tms)

next_s=EXIT2_DR;

else

next_s=PAUSE_DR;

EXIT2_DR: if(tms)

next_s=UPDATE_DR;

else

next_s=SHIFT_DR;

UPDATE_DR: if(tms)

next_s=SELECT_DR_SCAN;

else

next_s=RUN_TEST_IDLE;

SELECT_IR_SCAN:if(tms)

next_s=TEST_LOGIC_RESET;

else

next_s=CAPTURE_IR;

CAPTURE_IR: if(tms)

next_s=EXIT1_IR;

else

next_s=SHIFT_IR;

SHIFT_IR: if(tms)

next_s=EXIT1_IR;

else

next_s=SHIFT_IR;

EXIT1_IR: if(tms)

next_s=UPDATE_IR;

else

next_s=PAUSE_IR;

PAUSE_IR: if(tms)

next_s=EXIT2_IR;

else

next_s=PAUSE_IR;

EXIT2_IR: if(tms)

next_s=UPDATE_IR;

else

next_s=SHIFT_IR;

UPDATE_IR: if(tms)

next_s=SELECT_DR_SCAN;

else

next_s=RUN_TEST_IDLE;

endcase

//FSM outputs

reg rst_n;

//reg clockDR, updateDR, clockIR, tdo_en, rst_n, shiftDR, shiftIR;

//ClockDR/ClockIR - posedge occurs at the posedge of tck

//updateDR/updateIR - posedge occurs at the negedge of tck

always @( tck or state )begin

if ( !tck && ( state == CAPTURE_DR || state == SHIFT_DR ))

clockDR = 0;

else

clockDR = 1;

if ( !tck && ( state == UPDATE_DR ))

updateDR = 1;

else

updateDR = 0;

if ( !tck && ( state == CAPTURE_IR || state == SHIFT_IR ))

clockIR = 0;

else

clockIR = 1;

if ( !tck && ( state == UPDATE_IR ))

updateIR_a = 1;

else

updateIR_a = 0;

end

always @( negedge tck )

if ( state == SHIFT_IR || state == SHIFT_DR )

tdo_en <= 1;

else

tdo_en <= 0;

always @( negedge tck )

if ( state == TEST_LOGIC_RESET )

rst_n <= 0;

else

rst_n <= 1;

always @(negedge tck or negedge trst_n)

if ( !trst_n )

shiftDR <= 0;

else if ( state == SHIFT_DR )

shiftDR <= 1;

else

shiftDR <= 0;

always @(negedge tck or negedge trst_n)

if ( !trst_n )

shiftIR <= 0;

else if ( state == SHIFT_IR )

shiftIR <= 1;

else

shiftIR <= 0;

assign reset_n = rst_n & trst_n;

assign selectIR = state == SHIFT_IR;

assign sync_capture_en = ~(shiftDR | (state == CAPTURE_DR) | (state == SHIFT_DR));

assign sync_update_dr = state == UPDATE_DR;

always @( posedge clockDR )

scan_out_a <= shiftDR & tdi & ~(state == CAPTURE_DR);

wire nxt_st_3 = (state == SELECT_DR_SCAN) & ~tms;

wire nxt_st_4 = ((state == CAPTURE_DR) & ~tms) || ( state == SHIFT_DR & ~tms);

reg sel;

always @(posedge tck or negedge trst_n)

if(!trst_n )

sel <= 0;

else

sel <= ~(nxt_st_3 | nxt_st_4);

wire scan_out = sel ? scan_out_s : shiftDR & tdi;

always @(posedge tck )

scan_out_s <= scan_out & ~(state == CAPTURE_DR);

assign byp_out = sync_mode ? scan_out_s : scan_out_a;

endmodule

對于上述代碼,還有一種非常簡潔的描述,同樣是三段式描述風格,但最重要的組合電路部分可通過手工推導,直接將always描述的組合電路化簡為最小邏輯實現代碼。

module vjtag (

input clk, // Internal clock

input tdo_mux,// TDO before the negative edge flop

input bypass, // JTAG instruction=BYPASS

input tck, // clock input

input trst_n, // optional async reset active low

input tms, // Test Mode Select

input tdi, // Test Data In

output reg tdo, // Test Data Out

output reg tdo_enb,//Test Data Out tristate enable

output tdi_r1, // TDI flopped on TCK.

output tck_rise, // tck rate clock enable

output captureDR,// JTAG state=CAPTURE_DR

output shiftDR, // JTAG state=SHIFT_DR

output updateDR, // JTAG state=UPDATE_DR

output captureIR,// JTAG state=CAPTURE_IR

output shiftIR, // JTAG state=SHIFT_IR

output updateIR

);

reg tck_r1,tck_r2,tck_r3;

reg tdi_f_local; // local version

wire tdo_enb_nxt; // D input to TDO_ENB flop

wire tdo_nxt; // D input to TDO flop

wire itck_rise;

wire tck_fall;

reg [3:0] state; // current state

wire a,b,c,d,a_nxt,b_nxt,c_nxt,d_nxt;

assign a = state[0];

assign b = state[1];

assign c = state[2];

assign d = state[3];

assign a_nxt=(~tms & ~c & a) |(tms & ~b)|(tms & ~a)|(tms & d & c);

assign b_nxt=(~tms & b & ~a) |(~tms & ~c)|(~tms & ~d & b)|(~tms & ~d & ~a)|(tms & c & ~b)|(tms & d & c & a);

assign c_nxt=(c & ~b)|(c & a)|(tms & ~b);

assign d_nxt=(d & ~c)|(d & b)|(~tms & c & ~b)|(~d & c & ~b & ~a);

assign tdo_enb_nxt = state == 4'b0010 | state == 4'b1010 ? 1'b1 : 1'b0;

assign captureIR = state == 4'b1110 ? 1'b1 : 1'b0;

assign shiftIR = state == 4'b1010 ? 1'b1 : 1'b0;

assign updateIR = state == 4'b1101 ? 1'b1 : 1'b0;

assign captureDR = state == 4'b0110 ? 1'b1 : 1'b0;

assign shiftDR = state == 4'b0010 ? 1'b1 : 1'b0;

assign updateDR = state == 4'b0101 ? 1'b1 :1'b0;

assign tdo_nxt = bypass == 1'b1 & state == 4'b0010 ? tdi_f_local : tdo_mux;

assign tdi_r1 = tdi_f_local;

always @(posedge clk) begin : rtck_proc

tck_r3 <= tck_r2;

tck_r2 <= tck_r1;//synchronizers for edge detection

tck_r1 <= tck;

end

assign tck_rise = itck_rise;

assign itck_rise = tck_r2 & ~tck_r3;

assign tck_fall = ~tck_r2 & tck_r3;

always @(posedge clk)

if (trst_n == 1'b0)

state <= 4'b1111;

else if (itck_rise == 1'b1)begin

state <= {d_nxt, c_nxt, b_nxt, a_nxt};

end

always @(posedge clk)

if (trst_n == 1'b0)

tdi_f_local <= 1'b0;

else if (itck_rise == 1'b1 ) begin

tdi_f_local <= tdi;

end

always @(posedge clk)

if (trst_n == 1'b0)begin

tdo <= 1'b0;

tdo_enb <= 1'b0;

end

else if (tck_fall == 1'b1 ) begin

tdo <= tdo_nxt;

tdo_enb <= tdo_enb_nxt;

end

endmodule // module vjtag

JTAG接口除了標準的4信號引腳外,TI還定義了一種叫做SBW-JTAG的接口,僅用兩根引腳(SBWTCK、SBWTDIO)即可實現JTAG功能,通常用于引腳受限的芯片上。ARM的Cortex-M系列CPU均包含SW-JTAG定義標準。

原文鏈接:

https://blog.csdn.net/sinat_31206523/article/details/115495041

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    9519

    瀏覽量

    157014
  • JTAG
    +關注

    關注

    6

    文章

    415

    瀏覽量

    74960
  • 引腳
    +關注

    關注

    16

    文章

    2111

    瀏覽量

    55680
  • 狀態機
    +關注

    關注

    2

    文章

    499

    瀏覽量

    29139

原文標題:JTAG標準的狀態機實現

文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設計論壇】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Spring狀態機實現原理和使用方法

    說起 Spring 狀態機,大家很容易聯想到這個狀態機和設計模式中狀態模式的區別是啥呢?沒錯,Spring 狀態機就是狀態模式的一種
    的頭像 發表于 12-26 09:39 ?3202次閱讀
    Spring<b class='flag-5'>狀態機</b>的<b class='flag-5'>實現</b>原理和使用方法

    玩轉Spring狀態機

    說起Spring狀態機,大家很容易聯想到這個狀態機和設計模式中狀態模式的區別是啥呢?沒錯,Spring狀態機就是狀態模式的一種
    的頭像 發表于 06-25 14:21 ?1705次閱讀
    玩轉Spring<b class='flag-5'>狀態機</b>

    狀態機舉例

    狀態機舉例 你可以指定狀態寄存器和狀態機狀態。以下是一個有四種狀態的普通狀態機。 // Th
    發表于 03-28 15:18 ?1198次閱讀

    狀態機原理及用法

    狀態機原理及用法狀態機原理及用法狀態機原理及用法
    發表于 03-15 15:25 ?0次下載

    利用狀態機狀態機實現層次結構化設計

    練習九.利用狀態機的嵌套實現層次結構化設計目的:1.運用主狀態機與子狀態機產生層次化的邏輯設計;
    發表于 02-11 05:52 ?3708次閱讀
    利用<b class='flag-5'>狀態機</b>的<b class='flag-5'>狀態機</b><b class='flag-5'>實現</b>層次結構化設計

    利用74LS161實現復雜狀態機

    本文主要介紹了是如何利用74LS161實現復雜狀態機的。時序邏輯電路的數學模型是有限狀態機。有限狀態機它把復雜的控制邏輯分解成有限個穩定狀態
    發表于 01-18 09:00 ?1.1w次閱讀
    利用74LS161<b class='flag-5'>實現</b>復雜<b class='flag-5'>狀態機</b>

    狀態機概述 如何理解狀態機

    本篇文章包括狀態機的基本概述以及通過簡單的實例理解狀態機
    的頭像 發表于 01-02 18:03 ?1.1w次閱讀
    <b class='flag-5'>狀態機</b>概述  如何理解<b class='flag-5'>狀態機</b>

    基于FPGA實現狀態機的設計

    狀態機有三種描述方式:一段式狀態機、兩段式狀態機、三段式狀態機。下面就用一個小例子來看看三種方式是如何實現的。
    的頭像 發表于 08-29 06:09 ?3486次閱讀
    基于FPGA<b class='flag-5'>實現狀態機</b>的設計

    使用函數指針的方法實現狀態機

    之前寫過一篇狀態機的實用文章,很多朋友說有幾個地方有點難度不易理解,今天給大家換種簡單寫法,使用函數指針的方法實現狀態機狀態機簡介 有限狀態機FSM是有限個
    的頭像 發表于 10-19 09:36 ?3055次閱讀
    使用函數指針的方法<b class='flag-5'>實現狀態機</b>

    FPGA:狀態機簡述

    本文目錄 前言 狀態機簡介 狀態機分類 Mealy 型狀態機 Moore 型狀態機 狀態機描述 一段式
    的頭像 發表于 11-05 17:58 ?8843次閱讀
    FPGA:<b class='flag-5'>狀態機</b>簡述

    狀態模式(狀態機)

    share,作者:亞索老哥)),原來狀態機還可以這么簡單地玩~~亞索老哥提出的狀態機六步法(1)、定義狀態接口(2)、定義系統當前狀態指針(3)、定義具體
    發表于 12-16 16:53 ?9次下載
    <b class='flag-5'>狀態</b>模式(<b class='flag-5'>狀態機</b>)

    LABVIEW的狀態機實現資料合集

    LABVIEW的狀態機實現資料合集
    發表于 01-04 11:18 ?51次下載

    狀態機實現哪些內容

    狀態機模式是一種行為模式,通過多態實現不同狀態的調轉行為的確是一種很好的方法,只可惜在嵌入式環境下,有時只能寫純C代碼,并且還需要考慮代碼的重入和多任務請求跳轉等情形,因此實現起來著實
    的頭像 發表于 06-22 14:26 ?1366次閱讀
    <b class='flag-5'>狀態機</b>要<b class='flag-5'>實現</b>哪些內容

    如何在FPGA中實現狀態機

    狀態機往往是FPGA 開發的主力。選擇合適的架構和實現方法將確保您獲得一款最佳解決方案。 FPGA 常常用于執行基于序列和控制的行動, 比如實現一個簡單的通信協議。對于設計人員來說,滿足這些行動
    的頭像 發表于 07-18 16:05 ?2104次閱讀
    如何在FPGA中<b class='flag-5'>實現狀態機</b>

    什么是狀態機狀態機的種類與實現

    狀態機,又稱有限狀態機(Finite State Machine,FSM)或米利狀態機(Mealy Machine),是一種描述系統狀態變化的模型。在芯片設計中,
    的頭像 發表于 10-19 10:27 ?1.3w次閱讀