今天分享一個(gè)簡(jiǎn)單強(qiáng)大的時(shí)序圖繪制工具——WaveDrom。
WaveDrom[1]
Digital Timing Diagram everywhere
WaveDrom draws your Timing Diagram or Waveform from simple textual description.It comes with description language, rendering engine and the editor.WaveDrom editor works in the browser or can be installed on your system.Rendering engine can be embeded into any webpage.
Wavedrom 是一款功能強(qiáng)大且簡(jiǎn)單易用的文本轉(zhuǎn)圖表工具,被廣泛應(yīng)用于生成時(shí)序圖、波形圖等交互式波形。其特點(diǎn)在于使用簡(jiǎn)單的文本語(yǔ)法,使得開(kāi)發(fā)人員能夠以可視化的方式表示數(shù)字信號(hào)和時(shí)間序列數(shù)據(jù)。Wavedrom 的優(yōu)勢(shì)在于其高度靈活性和可擴(kuò)展性,使用戶能夠快速繪制復(fù)雜的波形和圖表,并輕松與其他文檔和代碼進(jìn)行整合。
Wavedrom 的基本語(yǔ)法相對(duì)簡(jiǎn)單,以 JSON 對(duì)象或簡(jiǎn)潔的文本描述波形和時(shí)序信息。開(kāi)發(fā)人員只需編寫簡(jiǎn)短的描述,即可生成直觀的波形圖。通過(guò)使用不同的標(biāo)記和元素,用戶可以定義時(shí)序圖中的信號(hào)波形、時(shí)鐘周期、狀態(tài)轉(zhuǎn)換等內(nèi)容。Wavedrom 支持自定義樣式和布局,用戶可以根據(jù)需求美化波形圖,增加標(biāo)簽和注釋以增強(qiáng)可讀性。
時(shí)序圖是 Wavedrom 最常見(jiàn)的用途之一,通過(guò) Wavedrom 繪制的時(shí)序圖可以清晰地展示數(shù)字信號(hào)和數(shù)據(jù)的傳輸過(guò)程。例如,在硬件設(shè)計(jì)中,時(shí)序圖可以用于描述寄存器讀寫、信號(hào)傳輸和時(shí)鐘脈沖的情況,從而幫助開(kāi)發(fā)人員更好地理解和分析系統(tǒng)的工作狀態(tài)。
值得一提的是,Wavedrom 不僅可以獨(dú)立使用,還可以與 Markdown 等文檔格式無(wú)縫整合。通過(guò)將 Wavedrom 圖表代碼嵌入文檔中,開(kāi)發(fā)人員可以直接在文檔中呈現(xiàn)交互式的波形圖,提升文檔的可讀性和交互性。
總體來(lái)說(shuō),Wavedrom 是一個(gè)強(qiáng)大而簡(jiǎn)便的文本轉(zhuǎn)圖表工具,適用于各種應(yīng)用場(chǎng)景,如硬件設(shè)計(jì)、軟件開(kāi)發(fā)、文檔編寫等。其簡(jiǎn)單的語(yǔ)法和可視化的輸出,為開(kāi)發(fā)人員提供了一個(gè)高效、直觀的工具,幫助他們更好地表達(dá)和展示數(shù)字信號(hào)和時(shí)間序列數(shù)據(jù)。
用法和示例
WaveDrom 是一個(gè)基于 JavaScript 的應(yīng)用程序。WaveJSON 是一種描述數(shù)字時(shí)序圖的格式。WaveDrom 可以直接在瀏覽器中渲染這些圖表。"signal"元素是 WaveLane 的數(shù)組。每個(gè) WaveLane 都有兩個(gè)必填字段:"name"和"wave"。
WaveDrom 是一個(gè)強(qiáng)大的工具,可用于可視化數(shù)字信號(hào)和時(shí)序數(shù)據(jù)。通過(guò)使用 WaveJSON 格式來(lái)描述信號(hào)波形,用戶可以輕松地定義時(shí)序圖的各個(gè)部分,包括信號(hào)波形的名稱、周期和狀態(tài)。WaveDrom 支持多個(gè) WaveLane,可以同時(shí)顯示多個(gè)信號(hào)波形,從而實(shí)現(xiàn)更復(fù)雜的時(shí)序圖表。
"wave"字段是 WaveLane 的關(guān)鍵部分,用于定義信號(hào)波形。它由一系列字符組成,包括數(shù)字 0 和 1,代表數(shù)字信號(hào)的高和低電平,以及".",代表未定義或無(wú)效狀態(tài)。此外,WaveDrom 還支持其他特殊字符,如"p"代表時(shí)鐘周期,"n"代表一個(gè)時(shí)鐘周期內(nèi)的半個(gè)周期,"|"用于分隔不同的時(shí)鐘周期。
通過(guò)將這些 WaveLane 組合成一個(gè)"signal"數(shù)組,并為每個(gè) WaveLane 指定名稱和波形描述,用戶可以創(chuàng)建詳細(xì)且直觀的數(shù)字時(shí)序圖。WaveDrom 渲染引擎會(huì)將這些描述解析并在瀏覽器中實(shí)時(shí)繪制出時(shí)序圖形。
總的來(lái)說(shuō),WaveDrom 提供了一種簡(jiǎn)單但強(qiáng)大的方式,通過(guò) WaveJSON 格式和 WaveLane 的組織,使用戶能夠在瀏覽器中生成各種數(shù)字時(shí)序圖。它在硬件設(shè)計(jì)、嵌入式系統(tǒng)開(kāi)發(fā)、通信協(xié)議分析等領(lǐng)域中有著廣泛的應(yīng)用,幫助開(kāi)發(fā)人員更好地理解和分析數(shù)字信號(hào)的行為和傳輸過(guò)程。
信號(hào)
從一個(gè)簡(jiǎn)單的例子開(kāi)始。下面的代碼將創(chuàng)建一個(gè)名為"Alfa"的 1 位信號(hào),并隨時(shí)間改變其狀態(tài)。
{"signal":[{"name":"Alfa","wave":"01.zx=ud.23.456789"}]}
在"wave"字符串中,每個(gè)字符代表一個(gè)時(shí)間周期。符號(hào)"."將前一個(gè)狀態(tài)延續(xù)一個(gè)周期?,F(xiàn)在,讓我們看一下它的圖示:
"Alfa" 1位信號(hào)
時(shí)鐘
數(shù)字時(shí)鐘是一種特殊類型的信號(hào)。它在每個(gè)時(shí)間周期內(nèi)變化兩次,可以具有正極性或負(fù)極性。此外,它還可以在工作邊沿上帶有可選的標(biāo)記。時(shí)鐘的各個(gè)塊可以與其他信號(hào)狀態(tài)混合,以創(chuàng)建時(shí)鐘門控效果。下面是代碼和生成的圖示:
{"signal":[ {"name":"pclk","wave":"p......."}, {"name":"Pclk","wave":"P......."}, {"name":"nclk","wave":"n......."}, {"name":"Nclk","wave":"N......."}, {}, {"name":"clk0","wave":"phnlPHNL"}, {"name":"clk1","wave":"xhlhLHl."}, {"name":"clk2","wave":"hpHplnLn"}, {"name":"clk3","wave":"nhNhplPl"}, {"name":"clk4","wave":"xlh.L.Hx"}, ]}
渲染后的時(shí)鐘圖示如下:
時(shí)鐘信號(hào)
合在一起
在典型的時(shí)序圖中,我們通常會(huì)包含時(shí)鐘信號(hào)和其他信號(hào)(線路)。對(duì)于多位信號(hào),我們可以從"data"數(shù)組中獲取相應(yīng)的標(biāo)簽。
下面是一個(gè)例子,展示了一個(gè)包含時(shí)鐘信號(hào)、多位信號(hào)和單位信號(hào)的典型時(shí)序圖:
{"signal":[ {"name":"clk","wave":"P......"}, {"name":"bus","wave":"x.==.=x","data":["head","body","tail","data"]}, {"name":"wire","wave":"0.1..0."} ]}
在這個(gè)例子中,我們有三個(gè)信號(hào):"clk"代表時(shí)鐘信號(hào),"bus"代表多位信號(hào),"wire"代表單位信號(hào)。
時(shí)鐘信號(hào)"clk"用"P"表示,代表正極性的時(shí)鐘邊沿。
多位信號(hào)"bus"用"x.==.=x"表示,其中"x"表示未定義的狀態(tài),"="表示穩(wěn)定的高電平或低電平,"."表示未穩(wěn)定狀態(tài)。"data"數(shù)組包含多位信號(hào)的標(biāo)簽,分別是:"head"、"body"、"tail"和"data"。
單位信號(hào)"wire"用"0.1..0."表示,表示在時(shí)間周期內(nèi)信號(hào)從低電平切換到高電平再切換回低電平。
渲染后的時(shí)序圖如下:
典型時(shí)序信號(hào)
空白和間隙
在時(shí)序圖中,我們有時(shí)需要添加間距和空白,以便更好地組織信號(hào)和使時(shí)序圖更易于閱讀。下面是一個(gè)帶有間距和空白的時(shí)序圖示例:
{"signal":[ {"name":"clk","wave":"p.....|..."}, {"name":"Data","wave":"x.345x|=.x","data":["head","body","tail","data"]}, {"name":"Request","wave":"0.1..0|1.0"}, {}, {"name":"Acknowledge","wave":"1.....|01."} ]}
在這個(gè)例子中,我們添加了一些間距和空白,以便更好地分隔不同的信號(hào)。
"clk"信號(hào)用"p"表示,代表正極性時(shí)鐘邊沿,后面有 3 個(gè)間距".",然后是"|...",代表 3 個(gè)空白周期。
"Data"信號(hào)由"x"、"="、"."組成,數(shù)據(jù)數(shù)組"data"提供了多位信號(hào)各個(gè)部分的標(biāo)簽:"head"、"body"、"tail"和"data"。后面有一個(gè)間距"|",然后是"=.",代表一個(gè)空白周期后緊跟著一個(gè)穩(wěn)定高電平。
"Request"信號(hào)由"0"、"1"、"."組成,代表低電平、高電平和未定義狀態(tài)。后面有一個(gè)間距"|",然后是"1.0",代表一個(gè)高電平后緊跟著一個(gè)空白周期。
接著有一個(gè)空白行,表示兩個(gè)信號(hào)之間的空白。
最后,"Acknowledge"信號(hào)由"1"、"."組成,后面有一個(gè)間距"|",然后是"01.",代表一個(gè)高電平后緊跟著一個(gè)低電平和一個(gè)空白周期。
渲染后的時(shí)序圖如下:
帶間隙的時(shí)序圖
在這個(gè)時(shí)序圖中,我們可以看到信號(hào)之間的間距和空白,使得時(shí)序圖更加整齊和易讀。通過(guò)添加適當(dāng)?shù)拈g距和空白,我們可以更好地組織信號(hào)和時(shí)鐘邊沿,使時(shí)序圖更具可視化效果。接下來(lái),我們將繼續(xù)探索 WaveDrom 的其他高級(jí)功能和實(shí)際應(yīng)用,幫助您更好地運(yùn)用這個(gè)強(qiáng)大的文本轉(zhuǎn)圖表工具。
分組
在時(shí)序圖中,我們可以將 WaveLane 組合成具有名稱的分組,分組表示為數(shù)組形式。['分組名稱', {...}, {...}, ...] 數(shù)組的第一個(gè)條目是分組的名稱。分組之間還可以嵌套。
下面是一個(gè)包含分組的時(shí)序圖示例:
{"signal":[ {"name":"clk","wave":"p..Pp..P"}, ["Master", ["ctrl", {"name":"write","wave":"01.0...."}, {"name":"read","wave":"0...1..0"} ], {"name":"addr","wave":"x3.x4..x","data":"A1A2"}, {"name":"wdata","wave":"x3.x....","data":"D1"}, ], {}, ["Slave", ["ctrl", {"name":"ack","wave":"x01x0.1x"}, ], {"name":"rdata","wave":"x.....4x","data":"Q2"}, ] ]}
在這個(gè)例子中,我們使用了分組來(lái)組織不同的信號(hào),將它們放在名為"Master"和"Slave"的兩個(gè)分組中。
"clk"信號(hào)用"p..Pp..P"表示,代表正極性時(shí)鐘邊沿和負(fù)極性時(shí)鐘邊沿。
"Master"分組包含了三個(gè)子信號(hào),它們分別在名稱為"ctrl"的子分組中,表示控制信號(hào)"write"和"read",以及名稱為"addr"的信號(hào),"data"數(shù)組提供了信號(hào)的標(biāo)簽。
接著有一個(gè)空白行,表示兩個(gè)分組之間的空白。
"Slave"分組包含了兩個(gè)子信號(hào),都在名稱為"ctrl"的子分組中,表示控制信號(hào)"ack",以及名稱為"rdata"的信號(hào),"data"數(shù)組提供了信號(hào)的標(biāo)簽。
渲染后的時(shí)序圖如下:
分組時(shí)序圖
在這個(gè)時(shí)序圖中,我們可以看到不同分組內(nèi)的信號(hào)在不同時(shí)間周期內(nèi)的狀態(tài)。使用分組可以更好地組織和顯示復(fù)雜的時(shí)序圖,幫助我們更好地理解和分析數(shù)字信號(hào)之間的時(shí)序關(guān)系。通過(guò) WaveDrom 的強(qiáng)大功能,我們可以輕松地在時(shí)序圖中添加分組,使其更具可視化效果和清晰度。
周期和相位
在時(shí)序圖中,我們可以使用"period"和"phase"參數(shù)來(lái)調(diào)整每個(gè) WaveLane 的周期和相位。
下面是一個(gè) DDR 讀取事務(wù)的時(shí)序圖示例:
{"signal":[ {"name":"CK","wave":"P.......","period":2}, {"name":"CMD","wave":"x.3x=x4x=x=x=x=x","data":"RASNOPCASNOPNOPNOPNOP","phase":0.5}, {"name":"ADDR","wave":"x.=x..=x........","data":"ROWCOL","phase":0.5}, {"name":"DQS","wave":"z.......0.1010z."}, {"name":"DQ","wave":"z.........5555z.","data":"D0D1D2D3"} ]}
在這個(gè)例子中,我們使用"period"參數(shù)來(lái)設(shè)置時(shí)鐘信號(hào)"CK"的周期為 2 個(gè)時(shí)間周期。這意味著時(shí)鐘信號(hào)每隔 2 個(gè)時(shí)間周期變化一次。
同時(shí),我們使用"phase"參數(shù)來(lái)調(diào)整信號(hào)"CMD"和"ADDR"的相位。相位的值為 0.5,表示信號(hào)的波形在時(shí)間軸上整體向右偏移了 0.5 個(gè)時(shí)間周期。這樣做可以讓信號(hào)在時(shí)鐘邊沿之前或之后發(fā)生狀態(tài)變化。
"CMD"信號(hào)表示了 DDR 讀取事務(wù)的命令序列,"ADDR"信號(hào)表示了地址序列。"data"數(shù)組提供了每個(gè)部分的標(biāo)簽。
"DQS"信號(hào)和"DQ"信號(hào)分別表示數(shù)據(jù)校驗(yàn)和數(shù)據(jù)信號(hào)。其中,"DQS"信號(hào)在時(shí)鐘邊沿之前有一個(gè)延遲,"DQ"信號(hào)在時(shí)鐘邊沿之后有一個(gè)延遲。
渲染后的時(shí)序圖如下:
DDR讀時(shí)序
在這個(gè)時(shí)序圖中,我們可以看到時(shí)鐘信號(hào)"CK"每隔 2 個(gè)時(shí)間周期發(fā)生一次變化。"CMD"和"ADDR"信號(hào)的波形整體向右偏移了 0.5 個(gè)時(shí)間周期,以達(dá)到與時(shí)鐘信號(hào)的相位差。"DQS"信號(hào)在時(shí)鐘邊沿之前有一個(gè)延遲,"DQ"信號(hào)在時(shí)鐘邊沿之后有一個(gè)延遲。
通過(guò)調(diào)整"period"和"phase"參數(shù),我們可以更靈活地控制時(shí)序圖中各個(gè)信號(hào)的周期和相位,從而更好地表達(dá)復(fù)雜的數(shù)字信號(hào)行為。WaveDrom 提供了豐富的功能,幫助我們創(chuàng)建詳細(xì)和直觀的數(shù)字時(shí)序圖,用于硬件設(shè)計(jì)、嵌入式系統(tǒng)開(kāi)發(fā)、通信協(xié)議分析等領(lǐng)域。
config{}屬性
在時(shí)序圖中,config{}屬性用于控制渲染的不同方面。
hscale
config:{hscale:#}屬性用于調(diào)整時(shí)序圖的水平縮放比例。用戶可以設(shè)置任何大于 0 的整數(shù)值。
下面是一個(gè)示例,展示了如何使用 config{hscale:#}屬性來(lái)調(diào)整時(shí)序圖的水平縮放比例:
{"signal":[ {"name":"clk","wave":"p...."}, {"name":"Data","wave":"x345x","data":["head","body","tail"]}, {"name":"Request","wave":"01..0"} ], "config":{"hscale":1} }
在這個(gè)例子中,我們使用 config{hscale:1}屬性將水平縮放比例設(shè)置為 1。這意味著時(shí)序圖將以原始比例進(jìn)行渲染,每個(gè)時(shí)間周期占據(jù)一個(gè)單位寬度。
渲染后的時(shí)序圖如下:
水平比例1 水平比例2
skin
在時(shí)序圖中,我們可以使用 config:{skin:'...'}屬性來(lái)選擇WaveDrom 的皮膚樣式[2]。該屬性僅在頁(yè)面上的第一個(gè)時(shí)序圖中起作用。WaveDrom 編輯器包含兩種標(biāo)準(zhǔn)皮膚:'default'和'narrow'。
head/foot
head:{...}和 foot:{...}屬性用于定義時(shí)序圖上方和下方的內(nèi)容區(qū)域??梢栽谶@些屬性中添加文本或其他元素。
tick/tock
tick 屬性可以添加與垂直標(biāo)記對(duì)齊的時(shí)間線標(biāo)簽,而 tock 屬性可以在垂直標(biāo)記之間添加時(shí)間線標(biāo)簽。
text
text 屬性用于添加標(biāo)題或說(shuō)明文本。
every
every 屬性用于指定僅在每 N 個(gè)周期渲染一次標(biāo)記和時(shí)間線標(biāo)簽。
下面是一個(gè)示例,展示了如何使用這些屬性來(lái)定義一個(gè)時(shí)序圖:
{"signal":[ {"name":"clk","wave":"p...."}, {"name":"Data","wave":"x345x","data":"abc"}, {"name":"Request","wave":"01..0"} ], "head":{ "text":"WaveDromexample", "tick":0, "every":2 }, "foot":{ "text":"Figure100", "tock":9 } }
在這個(gè)例子中,我們添加了頭部(head)和底部(foot)的文本內(nèi)容。頭部文本設(shè)置為"WaveDrom example",并使用 tick 屬性指定不添加時(shí)間線標(biāo)簽。每隔 2 個(gè)周期渲染一次標(biāo)記和時(shí)間線標(biāo)簽。底部文本設(shè)置為"Figure 100",并使用 tock 屬性在垂直標(biāo)記之間添加時(shí)間線標(biāo)簽。
渲染后的時(shí)序圖如下:
屬性示例
在 WaveDrom 中,head 和 foot 屬性用于定義時(shí)序圖上方和下方的文本內(nèi)容,這些文本內(nèi)容支持 SVG text 的所有屬性。可以使用 JsonML 標(biāo)記語(yǔ)言來(lái)表示 SVG 文本內(nèi)容,并且可以使用一些預(yù)定義的樣式來(lái)設(shè)置文本的字體大小和顏色。除此之外,還可以使用其他 SVG tspan 屬性來(lái)自由地定制文本的樣式。
下面是一個(gè)示例,展示了如何使用不同的樣式來(lái)設(shè)置時(shí)序圖頭部和底部的文本內(nèi)容:
{"signal":[ {"name":"clk","wave":"p.....PPPPp...."}, {"name":"dat","wave":"x....2345x.....","data":"abcd"}, {"name":"req","wave":"0....1...0....."} ], "head":{"text": ["tspan", ["tspan",{"class":"errorh1"},"error"], ["tspan",{"class":"warningh2"},"warning"], ["tspan",{"class":"infoh3"},"info"], ["tspan",{"class":"successh4"},"success"], ["tspan",{"class":"mutedh5"},"muted"], ["tspan",{"class":"h6"},"h6"], "default", ["tspan",{"fill":"pink","font-weight":"bold","font-style":"italic"},"pink-bold-italic"] ] }, "foot":{"text": ["tspan","E=mc", ["tspan",{"dy":"-5"},"2"], ["tspan",{"dy":"5"},"."], ["tspan",{"font-size":"25"},"B"], ["tspan",{"text-decoration":"overline"},"over"], ["tspan",{"text-decoration":"underline"},"under"], ["tspan",{"baseline-shift":"sub"},"sub"], ["tspan",{"baseline-shift":"super"},"super"] ],"tock":-5 } }
在這個(gè)例子中,我們使用 JsonML 標(biāo)記語(yǔ)言來(lái)表示頭部和底部的文本內(nèi)容,并為每個(gè)文本段落設(shè)置了不同的樣式。例如,我們使用了類名"h1"、"h2"、"h3"等來(lái)設(shè)置不同的字體大小。使用類名"error"、"warning"、"info"、"success"、"muted"等來(lái)設(shè)置不同的字體顏色樣式。我們還可以使用其他 SVG tspan 屬性來(lái)設(shè)置文本的斜體、粗體、填充顏色等。
渲染后的時(shí)序圖如下:
head/foot文本屬性示例
箭頭
曲線
在 WaveDrom 中,我們可以使用箭頭和曲線來(lái)連接不同的信號(hào),以表示它們之間的關(guān)聯(lián)和數(shù)據(jù)傳遞。
以下是一些常用的箭頭和曲線符號(hào):
~:普通曲線
-~:從左到右的曲線箭頭
<~>:雙向曲線箭頭
<~>:雙向曲線箭頭
~>:從左到右的直線箭頭
-~>:從左到右的實(shí)心箭頭
~->:從右到左的實(shí)心箭頭
下面是一個(gè)示例,展示了如何使用箭頭和曲線來(lái)連接不同的信號(hào):
{"signal":[ {"name":"A","wave":"01........0....","node":".a........j"}, {"name":"B","wave":"0.1.......0.1..","node":"..b.......i"}, {"name":"C","wave":"0..1....0...1..","node":"...c....h.."}, {"name":"D","wave":"0...1..0.....1.","node":"....d..g..."}, {"name":"E","wave":"0....10.......1","node":".....ef...."} ], "edge":[ "a~bt1","c-~at2","c-~>dtime3","d~-e", "e~>f","f->g","g-~>h","h~>isometext","h~->j" ] }
渲染后的時(shí)序圖如下:
箭頭和曲線
折線
在 WaveDrom 中,我們還可以使用尖銳的線條符號(hào)來(lái)表示不同信號(hào)之間的連接關(guān)系。這些尖銳的線條符號(hào)可以更直觀地展示信號(hào)之間的交互和數(shù)據(jù)傳遞。
以下是一些常用的尖銳線條符號(hào):
-:直線連接
-|:從左到右的尖銳連接
|->:從右到左的尖銳連接
<->:雙向尖銳連接
<-|>:從左到右的雙向尖銳連接
|-|:從左到右的尖銳連接(包含短橫線)
下面是一個(gè)示例,展示了如何使用尖銳線條來(lái)連接不同的信號(hào):
{"signal":[ {"name":"A","wave":"01..0..","node":".a..e.."}, {"name":"B","wave":"0.1..0.","node":"..b..d.","phase":0.5}, {"name":"C","wave":"0..1..0","node":"...c..f"}, {"node":"...g..h"}, {"node":"...I..J","phase":0.5}, {"name":"D","wave":"0..1..0","phase":0.5} ], "edge":[ "b-|at1","a-|ct2","b-|-ct3","c-|->et4","e-|>fmoretext", "e|->dt6","c-g","f-h","g<->h3ms","I+J5ms" ] }
在這個(gè)例子中,我們有 6 個(gè)信號(hào)(A、B、C、D)和 4 個(gè)連接節(jié)點(diǎn)(e、g、h、I、J),它們之間通過(guò)尖銳線條連接起來(lái)。每個(gè)信號(hào)都有相應(yīng)的波形圖,而尖銳線條則通過(guò)edge屬性來(lái)定義連接關(guān)系。
例如,b-|a t1表示從信號(hào) B 到信號(hào) A 的從左到右的尖銳連接,并在連接上方添加了文本標(biāo)簽"t1"。c-|->e t4表示從信號(hào) C 到節(jié)點(diǎn) e 的從左到右的尖銳連接,并在連接上方添加了文本標(biāo)簽"t4"。
渲染后的時(shí)序圖如下:
箭頭和折線
一些代碼
在 WaveDrom 中,我們可以使用 JavaScript 代碼來(lái)生成復(fù)雜的時(shí)序圖。這些代碼可以用來(lái)生成特定的信號(hào)和波形,以及自定義時(shí)序圖的展示效果。
以下是一個(gè)示例代碼,展示了如何使用 JavaScript 代碼生成一個(gè)特定的時(shí)序圖:
(function(bits,ticks){ vari,t,gray,state,data=[],arr=[]; for(i=0;i>1)^t)>>i)&1; arr[i].wave+=(gray===state)?'.':gray+''; state=gray; } } arr.unshift('gray'); return{signal:[ {name:'bin',wave:'='.repeat(ticks),data:data},arr ]}; })(5,16)
在這個(gè)例子中,我們使用了一個(gè)自執(zhí)行函數(shù)來(lái)生成一個(gè)包含 5 個(gè)信號(hào)的時(shí)序圖。每個(gè)信號(hào)的波形圖都是根據(jù)格雷碼(Gray code)生成的,其中 bits 參數(shù)表示信號(hào)的位數(shù),ticks 參數(shù)表示時(shí)間周期數(shù)。代碼使用循環(huán)來(lái)生成信號(hào)的波形圖,并將生成的數(shù)據(jù)存儲(chǔ)在 data 數(shù)組中。
最終的時(shí)序圖包含 6 個(gè)信號(hào),其中一個(gè)是用來(lái)表示二進(jìn)制計(jì)數(shù)的信號(hào)(bin),其波形圖是一個(gè)等號(hào)序列。其他 5 個(gè)信號(hào)的波形圖是根據(jù)格雷碼生成的,分別對(duì)應(yīng) 0 位、1 位、2 位、3 位和 4 位格雷碼的波形。
渲染后的時(shí)序圖如下:
js代碼生成時(shí)序圖
審核編輯:湯梓紅
-
信號(hào)
+關(guān)注
關(guān)注
11文章
2804瀏覽量
77072 -
時(shí)鐘
+關(guān)注
關(guān)注
11文章
1746瀏覽量
131775 -
時(shí)序圖
+關(guān)注
關(guān)注
2文章
58瀏覽量
22485 -
代碼
+關(guān)注
關(guān)注
30文章
4823瀏覽量
68995 -
數(shù)字時(shí)鐘
+關(guān)注
關(guān)注
2文章
151瀏覽量
20434
原文標(biāo)題:給大家分享一個(gè)簡(jiǎn)單強(qiáng)大的時(shí)序圖繪制工具
文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論