日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

硬件描述语言(HDL)

發(fā)布時(shí)間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 硬件描述语言(HDL) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

硬件描述語言(HDL)

  • 1 HDL基本介紹
  • 2 VHDL語言
    • 庫和實(shí)體
    • 數(shù)據(jù)對(duì)象和數(shù)據(jù)類型:
    • 操作符:
    • 結(jié)構(gòu)體之進(jìn)程:
    • VHDL語法 :
    • VHDL語法規(guī)則及注意事項(xiàng):
  • 3 Verilog語言
    • 基本:
    • 模塊和端口:
    • 數(shù)據(jù)流建模:
    • 行為級(jí)建模
    • 基于事件的時(shí)序控制
    • 主要語句
    • 注意事項(xiàng):
  • 4 綜合和仿真
    • 基本:
    • 有限狀態(tài)機(jī)
    • testbench
    • 與其他軟件的混合開發(fā)
    • 注意事項(xiàng):
  • 5 時(shí)序分析和時(shí)序控制
    • FPGA中的時(shí)序問題
    • 同步時(shí)序控制的基本策略
    • 跨時(shí)鐘域(CDC)邏輯設(shè)計(jì)
    • 跨時(shí)鐘域多路信號(hào)處理
    • 注意事項(xiàng):
  • 6 模塊化設(shè)計(jì)和片上總線
    • 層次化設(shè)計(jì)方法
    • 片上總線( On Chip Bus, OCB )

1 HDL基本介紹

Hardware Description Language (HDL)。

DSP:并行,一般最多三條語句同時(shí)執(zhí)行。——由硬件內(nèi)部結(jié)構(gòu)決定。考慮GPU的使用即為CPU難以完成多個(gè)ALU(運(yùn)算器)的處理,而GPU可以有非常多的ALU(相當(dāng)于CPU為工程師,而GPU為普通工人)。

CPLD與FPGA的最大區(qū)別(為什么一個(gè)是乘積項(xiàng)一個(gè)是查找表):CPLD的觸發(fā)器工藝做不上去,因此主要用于組合邏輯;而FPGA集成了大量的RAM(SRAM),因此適合做時(shí)序邏輯。

時(shí)鐘的最大頻率由邏輯的時(shí)延決定(可編程邏輯器件最后一個(gè)題考的就是D觸發(fā)器的最大時(shí)鐘頻率公式)。

FPGA重點(diǎn)在于實(shí)時(shí)處理能力:CPU進(jìn)行一個(gè)簡(jiǎn)單的處理操作可能就要花費(fèi)100多個(gè)時(shí)鐘周期。

硬件直接執(zhí)行的語言和硬件描述語言的區(qū)別:一個(gè)是執(zhí)行“軟件”,一個(gè)是“軟件”描述“硬件”。硬件描述語言可稱為:“面向接口編程”。(記得本科的JAVA老師提過除了熟悉的面向過程、面向?qū)ο?#xff0c;還有面向接口、面向方法,而很多學(xué)校已經(jīng)在本科講后面兩種了)

多時(shí)鐘適用于CPLD(如時(shí)鐘取反),不適用于FPGA(同步時(shí)鐘)。

語言:將外部事物映射到現(xiàn)有基本單元和處理規(guī)則體系下。

代碼要符合邏輯關(guān)聯(lián),表述硬件信號(hào)邏輯。(而非湊時(shí)序)

2 VHDL語言

  • VHDL :超高速集成電路硬件描述語言 Very-High-Speed Integrated Circuit Hardware Description Language。現(xiàn)有主要版本:VHDL-1993。
  • 基本代碼結(jié)構(gòu):(1)實(shí)體entity(二級(jí)單元:結(jié)構(gòu)體architecture)(2)程序包package(二級(jí)單元:包體package body)(3)配置聲明(4)上下文聲明。基本單元能夠獨(dú)立存在,二級(jí)單元必須先定義其基本單元才能定義。
  • 結(jié)構(gòu)體主體:1 進(jìn)程 2 信號(hào)賦值 3 元件例化 4 生成語句 5 塊語句(不常用)

庫和實(shí)體

*程序包 package:聲明了可以被電路各部分使用的數(shù)據(jù)類型、子程序、運(yùn)算和元件等對(duì)象。包 體 package body:給出了程序包中聲明的子程序和運(yùn)算的具體實(shí)現(xiàn)。
*常用庫:(1)std 庫: VHDL 標(biāo)準(zhǔn)庫的一部分。默認(rèn)下列語句存在, 不要顯式重復(fù)聲明:Library std; Use std.standard.all;(2)ieee 庫,包含了一組可用于 RTL 綜合的標(biāo)準(zhǔn)邏輯類型和數(shù)據(jù)類型的程序包(3)work 庫,包含了當(dāng)前設(shè)計(jì)工程中的所有設(shè)計(jì)單元編譯結(jié)果。默認(rèn)存在, 引用時(shí)不需要顯式使庫可見。

  • 實(shí)體entity:定義了電路的接口和名稱;結(jié)構(gòu)體architecture:定義了電路的具體實(shí)現(xiàn)。

數(shù)據(jù)對(duì)象和數(shù)據(jù)類型:

*三種數(shù)據(jù)對(duì)象:常量、變量、信號(hào)。

  • 變量是中間關(guān)聯(lián)關(guān)系,
  • 變量(定義)賦值:分配給變量的值立刻成為當(dāng)前值,不能設(shè)置傳輸延遲variable 變量名 : 數(shù)據(jù)類型 [:= 初始值];
    信號(hào)賦值:如果 一 個(gè)進(jìn)程中多次為同一個(gè)信號(hào)賦值,只有最后一次的賦值會(huì)起作用。signal 信號(hào)名 : 數(shù)據(jù)類型 [:= 初始值];
  • 有效的硬件初始值必須通過統(tǒng)一的復(fù)位邏輯來實(shí)現(xiàn)!
  • 條件信號(hào)賦值:sum3<=a+b when sel ==‘1’ else a-b; 各賦值語句有優(yōu)先級(jí)的差別,賦值條件可以重疊。
    選擇信號(hào)賦值:with sel select
    dout<=d0 when “00”, d1 when “01”, d2 when “10”, d3 when “11”, “00000000” when others; 選擇值必須互斥,不能出現(xiàn)重復(fù)或重疊。
  • record記錄:元素組成的集合,類似C中的結(jié)構(gòu)體。在VHDL和Verilog混合編程中的project不建議使用record。
  • 字符類型可綜合。
  • 16#E#E1:16進(jìn)制的14e1=14*16=224。

操作符:

  • 標(biāo)準(zhǔn)邏輯位std_logic:只有“0”、“1”、“Z”(高阻態(tài))可綜合。
  • 移位操作符可綜合。(移位器)乘法器和除法器可綜合,乘方原則上不可綜合。移位器使用要優(yōu)于乘法器(*2/4/8)。求模取余也可綜合。
    *VHDL沒有按位與、按位或。



結(jié)構(gòu)體之進(jìn)程:

  • 注意敏感信號(hào)參數(shù)表的填寫!!!若無,則必須包含wait語句(互斥)。

  • 一個(gè)實(shí)體可以有多個(gè)結(jié)構(gòu)體,每個(gè)結(jié)構(gòu)體描述了同一個(gè)電路硬件部件的不同實(shí)現(xiàn)。

  • 1進(jìn)程PROCESS是一系列必須按時(shí)序執(zhí)行的時(shí)序語句。2與軟件程序的區(qū)別:重復(fù)運(yùn)行,連續(xù)循環(huán)。3同一個(gè)結(jié)構(gòu)體內(nèi)的多個(gè)進(jìn)程之間是并行執(zhí)行的關(guān)系。

  • 如果沒有敏感列表,進(jìn)程中必須包含 wait 語句來暫停進(jìn)程;如果有敏感列表, wait 語句 不能出現(xiàn)在進(jìn)程中。

  • 聲明對(duì)進(jìn)程是局部的,只能用于進(jìn)程內(nèi)。

  • 仿真器對(duì)于進(jìn)程的執(zhí)行:進(jìn)程執(zhí)行過程中所有信號(hào)值不變–如果進(jìn)程過程中有對(duì)信號(hào)的賦值,將改變信號(hào)值的事件排入等待執(zhí)行的隊(duì)列–進(jìn)程結(jié)束執(zhí)行時(shí),執(zhí)行排在隊(duì)列中的賦值事件。

  • 進(jìn)程中的信號(hào)賦值:同一個(gè)進(jìn)程中對(duì)同一個(gè)信號(hào)多次賦值,只有最后一次生效。在不同進(jìn)程中,不能對(duì)同一個(gè)信號(hào)進(jìn)行賦值。在進(jìn)程中只能使用簡(jiǎn)單賦值。

  • 流程控制語句:if 和 case 語句替代條件賦值和選擇賦值;loop 語句:循環(huán)控制。

  • 1初始值沒有硬件解釋,綜合器會(huì)忽略初值2進(jìn)程執(zhí)行期間,信號(hào)不能用于存儲(chǔ)計(jì)算的中間值,必須使用變量3賦值語句立即更新變量

  • 需要避免的鎖存latch,兩種情況:1如果目標(biāo)信號(hào)在某些條件下沒有接收數(shù)值,則保留先前值:(1)缺少了對(duì)應(yīng)于 if 語句的 else 部分(2)if 語句的某些分支沒有對(duì)信號(hào)進(jìn)行賦值。2先前值來自反饋:組合邏輯會(huì)引入latch。時(shí)序邏輯是允許的。

  • 時(shí)序進(jìn)程:進(jìn)程僅在每個(gè)時(shí)鐘的上升沿(下降沿)啟動(dòng)。

  • 時(shí)鐘門控:時(shí)鐘信號(hào)由其他控制信號(hào)開啟或關(guān)閉。如果沒有特殊需求,不要使用時(shí)鐘門控,容易出現(xiàn)毛刺。防毛刺可以通過一個(gè)寄存器的鎖存輸出。數(shù)據(jù)門控:門控控制寄存器的數(shù)據(jù)輸入。

VHDL語法 :

  • 結(jié)構(gòu)體之元件例化:將預(yù)先設(shè)計(jì)好的實(shí)體定義為元件,并將其與當(dāng)前設(shè)計(jì)實(shí)體中的端口連接。
  • 結(jié)構(gòu)體之生成語句(重復(fù)語句):用于創(chuàng)建重復(fù)硬件結(jié)構(gòu)或者條件硬件結(jié)構(gòu)–for generate :用于重復(fù)硬件結(jié)構(gòu)–if generate :用于條件硬件結(jié)構(gòu)。并發(fā)語句,能用于任何結(jié)構(gòu)體。
  • 函數(shù)和過程:函數(shù)(function)和過程(procedure)統(tǒng)稱為子程序(subprogram)。子程序中不允許使用wait 語句。函數(shù)中禁止信號(hào)聲明和元件例化。procedure一般可用process代替,盡量不推薦使用。測(cè)試testbench時(shí)建議用。

VHDL語法規(guī)則及注意事項(xiàng):


1.命名規(guī)則:不區(qū)分大小寫;不允許出現(xiàn)兩個(gè)連續(xù)的下劃線,***注釋由兩個(gè)連續(xù)虛線(‘–’)開始直至行尾;注意in、out是關(guān)鍵字。
2.port的最后一句不加分號(hào)!!!(編譯出現(xiàn)多條錯(cuò)誤時(shí)首先檢查該項(xiàng))
3.entity名要與 VHDL 程序的文件名一致。
4.“:=”表示預(yù)編譯時(shí)賦值,“<=”表示真實(shí)賦值。(注意賦值區(qū)分,結(jié)果會(huì)不同)
5.“when···else”等選擇語句一定要窮舉所有可能性!(否則出現(xiàn)鎖存latch)
6.等于“=”,不等于“/=”。
7.VHDL是一種強(qiáng)類型語言,不支持類型復(fù)用。
8.向量測(cè)試:常用AAAA(A 1010),5555(5 0101)測(cè)試焊接數(shù)據(jù)線短路問題。
9.信號(hào)類型:盡量只用std_logic、std_logic_vector。
10.不要在設(shè)計(jì)中同時(shí)使用異步(RST在時(shí)序clock外)復(fù)位和異步置位。
11.elsif而非elseif!!!要有end if!!!
12.極力避免組合邏輯!!!latch!!!(以及選擇涵蓋所有分支)

3 Verilog語言

基本:

  • 區(qū)分大小寫
  • 單行注釋以“//”開始,多行注釋以“/*”開始,以 “*/”結(jié)束。
  • Verilog 中關(guān)鍵字全部為小寫。
  • 四種基本電平邏輯:0,1,未知x或X,高阻z或Z。
  • 數(shù)據(jù)類型:1.線網(wǎng)net:表示硬件單元之間的物理連線,由其連接的器件輸出端連續(xù)驅(qū)動(dòng)。一般使用wire聲明,還有wand,wor,tri等。如果沒有驅(qū)動(dòng)元件,缺省值一般為 z。 2.寄存器:用來表示存儲(chǔ)單元。會(huì)保持?jǐn)?shù)據(jù)原有的值,直到被改寫,不需要驅(qū)動(dòng)源。默認(rèn)值為 x。僅僅意味著一個(gè)保持?jǐn)?shù)值的變量,不代表硬件寄存器。 3.wire 或 reg 可聲明為向量(位寬大于 1。格式:[high#: low#]或 [low#: high#],左邊的數(shù)總是代表向量的最高有效位。起始位可以是變量,位寬必須是常量。
  • 整數(shù)、實(shí)數(shù)和時(shí)間等數(shù)據(jù)類型實(shí)際也屬于寄存器類型。
  • reg 型變量為無符號(hào)數(shù), integer 型變量為有符號(hào)數(shù)。
  • 時(shí)間寄存器:時(shí)間變量通過使用關(guān)鍵字 time 來聲明。通過調(diào)用系統(tǒng)函數(shù) $time 可以得到當(dāng)前的仿真時(shí)間。單位受`timescale 定義的參考時(shí)間單位控制。`timescale 1ns/1ps:時(shí)延單位1 ns,時(shí)延精度1 ps。(電腦左上角撇號(hào))。用于仿真,不可綜合。慣性延遲,小于一個(gè)周期保持原來參數(shù)。
  • 字符串保存在 reg 類型的變量中,每個(gè)字符占用一個(gè)字節(jié)(8bit)。

模塊和端口:

  • 模塊是設(shè)計(jì)中的基本功能塊,端口是模塊與外部交互的通道。
  • 所有端口隱含地聲明為wire類型。不能將 input 和 inout 類型的端口聲明為 reg 類型,output 類型的端口可以聲明為 reg 類型,端口數(shù)據(jù)類型為 reg 時(shí), reg 聲明不能省略。

數(shù)據(jù)流建模:

  • 連續(xù)賦值語句:以關(guān)鍵字 assign 開始,用于對(duì)線網(wǎng)進(jìn)行賦值。不可綜合!
  • 指定延遲寫法示例:wire #10 out; 注意:在延遲期間(左側(cè)獲得新值之前),如果右側(cè)信號(hào)再次發(fā)生變化,在計(jì)算表達(dá)式新值時(shí)會(huì)取右側(cè)信號(hào)的當(dāng)前值(慣性延遲)

行為級(jí)建模

  • 結(jié)構(gòu)化過程語句:行為級(jí)建模的兩種基本語句:initial 、 always。initial 語句從0時(shí)刻開始執(zhí)行,只執(zhí)行一次,多個(gè)initial塊之間是相互獨(dú)立的。理論上不可綜合,類似于VHDL的process。 always 語句結(jié)構(gòu)是重復(fù)執(zhí)行的。
  • 過程賦值語句,存在兩種:–阻塞賦值語句(=),順序執(zhí)行。–非阻塞賦值語句(<=),并行執(zhí)行。仿真時(shí)的時(shí)序控制結(jié)果不同。

基于事件的時(shí)序控制

  • –常規(guī)事件控制;命名事件控制;OR (或)事件控制;電平敏感時(shí)序控制。可以用來觸發(fā)聲明語句或塊語句的執(zhí)行。
  • 使用符號(hào)@來說明。語句執(zhí)行條件:信號(hào)值發(fā)生變化、發(fā)生正向跳變posedge、發(fā)生負(fù)向跳變negedge。
  • 由關(guān)鍵字 or 連接多個(gè)事件名或者信號(hào)名構(gòu)成敏感列表。多個(gè)信號(hào)或事件中發(fā)生的任意一個(gè)變化都能夠觸發(fā)語句或語句塊的執(zhí)行。關(guān)鍵字 or 也可以使用“,”來代替。組合邏輯塊語句的輸入變量很多時(shí),可以用@*或@(*),表示對(duì)其后語句塊中的所有輸入變量的變化是敏感的。
  • 在同一個(gè)always 塊中 不要既用非阻塞賦值又用阻塞賦值。時(shí)序電路建模時(shí),使用非阻塞賦值。鎖存器電路建模時(shí),使用非阻塞賦值。用 always 塊建立組合邏輯模型時(shí),使用阻塞賦值。

主要語句

  • 條件語句:if-else;case(結(jié)尾加end或endcase)

  • 循環(huán)語句四種類型:while for repeat forever。只能在 always 或 initial 塊中使用。

  • 塊語句:1順序塊:用關(guān)鍵字 begin 和 end 來表示。順序塊中的語句是一條接一條按順序執(zhí)行。2并行塊:由關(guān)鍵字 fork 和 join 聲明。并行塊內(nèi)的語句并發(fā)執(zhí)行。語句執(zhí)行的順序由各自語句中的延遲或事件控制決定。

  • 子程序:任務(wù)(task)和函數(shù) (function)。可以在任務(wù)和函數(shù)中聲明局部變量,如寄存器、時(shí)間、整數(shù)、實(shí)數(shù)和事件,但不能聲明線網(wǎng)類型的變量;只能使用行為級(jí)語句,但不能包含 always 和initial 塊;可以在 always 塊、 initial 塊中調(diào)用任務(wù)和函數(shù)。

  • 函數(shù)不含有非阻塞賦值語句,綜合成純組合邏輯。

  • 編譯指令:`define,`undef(鍵盤左上角)。條件編譯:`ifdef `ifndef `elsif `else `endif。

  • 系統(tǒng)任務(wù):display打印;strobe語句結(jié)束后才打印。

注意事項(xiàng):


1.時(shí)間寄存器`timescale電腦左上角撇號(hào)!!!
2.在同一個(gè)always 塊中 不要既用非阻塞賦值又用阻塞賦值。時(shí)序電路建模時(shí),使用非阻塞賦值<=。
3.if-else關(guān)注配對(duì)問題。
4.FPGA跳到不可能狀態(tài):(1)邏輯寫法的latch:信號(hào)不完備,輸出端引入到輸入端的反饋!(2)時(shí)序邏輯電路建模不小心寫成阻塞賦值=。
5.狀態(tài)機(jī)建議選用case(綜合時(shí)無先后順序),不要用if(有先后順序)。
6.for進(jìn)行判斷中判斷語句不能用=或~=。(Verilog里要求)

4 綜合和仿真

基本:

  • 綜合(Synthesis):將較高級(jí)抽象層次的設(shè)計(jì)描述自動(dòng)轉(zhuǎn)化為較低層次描述的過程。
  • 編程(Program)配置 (Configuration):將適配后生成的編程文件裝入 PLD 器件中的過程。
  • 大小寫敏感性:1當(dāng)僅僅用大小寫區(qū)分兩個(gè)不同的實(shí)例或信號(hào)時(shí),綜合器可以正常識(shí)別。2當(dāng)僅僅用大小寫區(qū)分兩個(gè)不同的模塊( module )時(shí)綜合器可能會(huì)報(bào)錯(cuò)!


有限狀態(tài)機(jī)

  • 分類:Mealy狀態(tài)機(jī)、Moore狀態(tài)機(jī)、帶有流水線的Mealy 狀態(tài)機(jī)。
  • 使用 parameter verilog 或枚舉 enum VHDL 類型定義狀態(tài)。避免直接使用數(shù)值定義狀態(tài)。避免使用數(shù)值計(jì)算定義狀態(tài)跳轉(zhuǎn)。


testbench

  • 在綜合后和布局布線后仿真中,全局復(fù)位 置位信號(hào)( Global Set/Reset, GSR )默認(rèn)持續(xù) 100ns。
  • 自動(dòng)驗(yàn)證技術(shù)和自檢查測(cè)試文件:常見的自動(dòng)驗(yàn)證方法,1數(shù)據(jù)文件比較:將仿真結(jié)果的期望值寫入一個(gè)文件,將仿真結(jié)果寫入另一個(gè)文件,在仿真結(jié)束后比較兩個(gè)文件進(jìn)行驗(yàn)證。2波形比較:某些仿真軟件支持輸出波形和期望波形的自動(dòng)比較。 自檢查測(cè)試文件:將期望結(jié)果作為測(cè)試文件的一部分,在仿真過程中實(shí)時(shí)完成結(jié)果的比較。

與其他軟件的混合開發(fā)

  • MyHDL python http://www.myhdl.org
  • cocotb python https:// github.com/cocotb/cocotb
  • Chisel scala https:// github.com/chipsalliance/chisel3
  • SpinalHDL scala https:// github.com/spinalhdl/spinalhdl

注意事項(xiàng):


1.建議不要使用未指定寬度的整數(shù),有可能產(chǎn)生不確定的問題(和綜合器有關(guān))。
2.不要使用異步方式置位或復(fù)位寄存器。
3.對(duì)于時(shí)鐘使能,set/reset,盡量使用高電平有效。低電平有效會(huì)綜合成額外的非門。
4.人為增加信號(hào)延遲:(1)時(shí)鐘鎖-動(dòng)態(tài)移位寄存器:對(duì)高頻延遲控制多個(gè)時(shí)鐘周期,可采用移位寄存器。(大延遲)(2)調(diào)用FPGA原語(小延遲)
5.RAM使用初始化條件:請(qǐng)使用$readmemb,不要用$readmemh。
6.ROM只有讀接口,initial語句可綜合成ROM。
7.注意:timing error如果出現(xiàn),請(qǐng)不要下載到FPGA中。

5 時(shí)序分析和時(shí)序控制

FPGA中的時(shí)序問題

1同步時(shí)序問題:過于復(fù)雜的組合邏輯,或邏輯的不適當(dāng)設(shè)計(jì),導(dǎo)致建立時(shí)間、保持時(shí)間的條件不能滿足。對(duì)同步接口鎖存造成的接口效率下降。
2跨時(shí)鐘域問題:由于跨時(shí)鐘域造成的亞穩(wěn)態(tài),使得同一個(gè)輸出在不同的接收寄存器上被解釋成不同的值造成的邏輯錯(cuò)誤。同一組信號(hào)輸出由于亞穩(wěn)態(tài)造成的時(shí)間延遲不同,在接收端引起的數(shù)據(jù)接收錯(cuò)誤。

同步時(shí)序控制的基本策略

1 建立時(shí)間、保持時(shí)間的條件不滿足(無握手)
(1)同源時(shí)鐘問題
如果不加特殊約束設(shè)置,分頻時(shí)鐘不能利用FPGA全局時(shí)鐘樹,到達(dá)各個(gè)寄存器的延遲相差太大,影響時(shí)序性能。解決方法:為分頻時(shí)鐘增加額外的時(shí)序約束;使用PLL+全局時(shí)鐘buffer產(chǎn)生分頻時(shí)鐘,使分頻時(shí)鐘成為全局時(shí)鐘;不要直接使用分頻后時(shí)鐘(最好方法)
(2)流水線技術(shù)
將原本一個(gè)時(shí)鐘周期完成的較大的組合邏輯通過合理的切割后分由多個(gè)時(shí)鐘周期完成。使用條件:處理流程可以分為若干步驟;整個(gè)數(shù)據(jù)處理是單向的,沒有反饋或迭代運(yùn)算。
(3)組合邏輯優(yōu)化:

  • 查找表技術(shù):在FPGA中,對(duì)于某些特定問題,直接建立輸入信號(hào)和輸出結(jié)果之間的查找表,避免使用復(fù)雜組合邏輯通過運(yùn)算產(chǎn)生結(jié)果,是有效的時(shí)序優(yōu)化技術(shù)。運(yùn)算中含有復(fù)雜計(jì)算時(shí);算法比較復(fù)雜,但輸入和輸出信號(hào)簡(jiǎn)單時(shí)。
  • 8b/10編碼器
  • CRC編碼

2 對(duì)同步接口鎖存造成的接口效率下降(接口的讀和寫)

  • 產(chǎn)生一個(gè)額外的時(shí)鐘周期,延遲可能產(chǎn)生數(shù)據(jù)問題。(使用提前控制信號(hào)以及變種!)
    (1)適當(dāng)?shù)慕M合邏輯
    (2)同步接口流水線
  • 使用提前控制信號(hào)。
  • 預(yù)讀技術(shù)的變種:FWFT FIFO,First-Word Fall-Through FIFO,預(yù)讀一個(gè)數(shù),保證后續(xù)的讀信號(hào)可以實(shí)時(shí)輸出數(shù)據(jù)。

(3)同步接口寄存器隔離

  • 在同步接口設(shè)計(jì)中,通過額外的緩存寄存器實(shí)現(xiàn)所有接口信號(hào)的寄存器化(FIFO讀接口,讓rd_en信號(hào)寄存器化)

跨時(shí)鐘域(CDC)邏輯設(shè)計(jì)

  • 1 由于跨時(shí)鐘域造成的亞穩(wěn)態(tài),使得同一個(gè)輸出在不同的接收寄存器上被解釋成不同的值造成的邏輯錯(cuò)誤。
  • 2 同一組信號(hào)輸出由于亞穩(wěn)態(tài)造成的時(shí)間延遲不同,在接收端引起的數(shù)據(jù)接收錯(cuò)誤。
    兩種場(chǎng)景

場(chǎng)景1:允許在不同時(shí)鐘域之間缺失采樣邊沿,每個(gè)采樣值必須是準(zhǔn)確的。異步FIFO的讀寫地址。
場(chǎng)景2:跨時(shí)鐘域的每個(gè)信號(hào)必須被采樣,信號(hào)必須確認(rèn)被正確接收后才能改變

  • 解決方式:同步寄存器鏈。(“鎖兩級(jí)”)
    對(duì)某些高速應(yīng)用,兩級(jí)觸發(fā)器鎖存并不足以保證足夠好的MTBF性能,需要三級(jí)或更多級(jí)的同步寄存器鏈。
  • 跨時(shí)鐘域時(shí)的可靠傳輸條件:由慢時(shí)鐘域向快時(shí)鐘域傳輸時(shí)的安全條件,“三邊沿”條件。當(dāng)通過兩級(jí)觸發(fā)器來進(jìn)行跨時(shí)鐘域信號(hào)傳輸時(shí),當(dāng)CDC信號(hào)寬度為接收時(shí)鐘域時(shí)鐘周期的1.5倍以上時(shí),可以保證信號(hào)被接收端至少正確接收一次。以上條件等效為:CDC信號(hào)應(yīng)至少持續(xù)3個(gè)接收時(shí)鐘邊沿來保證被正確接收。
  • 同步寄存器鏈?zhǔn)褂脳l件:1必須是從慢時(shí)鐘域到快時(shí)鐘域的傳輸 2必須滿足三邊沿條件

跨時(shí)鐘域多路信號(hào)處理

  • 簡(jiǎn)單的二級(jí)寄存器鏈不能保證信號(hào)的正確傳輸:不同信號(hào)之間有著傳輸延遲,并不能保證所有信號(hào)同時(shí)被同一個(gè)時(shí)鐘采樣!
  • 可能采取的策略:1多位信號(hào)合并:如果可能,將多個(gè)CDC位合并成1個(gè)CDC信號(hào) 2多周期路徑(MCP)方式:使用同步的load位安全傳遞多位信號(hào) 3異步FIFO方式(格雷碼計(jì)數(shù)器等,僅有一位發(fā)生變化)

注意事項(xiàng):


1.命名常見規(guī)則:_p/_n(高/低電平有效)
2.晶振jitter一般10 ps,高精度可做到ps以下。ps以下可直接做高速串行收發(fā)器。在外部鎖相環(huán)鎖過的信號(hào)不能直接驅(qū)動(dòng)高速信號(hào)收發(fā)器(相噪大)。
3.同步接口鎖存:使用提前控制信號(hào)以及變種!
4.跨時(shí)鐘域(CDC):同步寄存器鏈。(“鎖兩級(jí)”)

6 模塊化設(shè)計(jì)和片上總線

層次化設(shè)計(jì)方法

  • 真實(shí)設(shè)計(jì)時(shí)以 Top down 方法為主,以 Bottom up 方法為輔。
  • IP:IC 設(shè)計(jì)和 FPGA 設(shè)計(jì)中指完成某種功能的設(shè)計(jì)模塊。硬核:以版圖形式實(shí)現(xiàn)的設(shè)計(jì)模塊,通常用GDS II文件格式。軟核:在寄存器級(jí)或門級(jí)對(duì)電路功能用 HDL 進(jìn)行描述,表現(xiàn)為 Verilog 或 VHDL 代碼的形式。固核:完成了綜合的功能塊,通常以網(wǎng)表的形式提交給客戶使用。

片上總線( On Chip Bus, OCB )

  • 以總線方式實(shí)現(xiàn) IP 核之間的數(shù)據(jù)通信。需要定義各個(gè)模塊之間初始化、仲裁、請(qǐng)求傳輸、響應(yīng)、發(fā)送接收過程中的驅(qū)動(dòng)、時(shí)序、策略等關(guān)系。
    標(biāo)準(zhǔn)片上總線: AMBA ( ARM )、 Wishbone ( Silicore )、 Avalon ( Altera )等
  • I2C 是一種串行總線的外設(shè)接口,它采用同步方式串行接收或發(fā)送信息,兩個(gè)設(shè)備在同一個(gè)時(shí)鐘下工作。I2C 總線只用兩根線:串行數(shù)據(jù) SDA Serial Data、串行時(shí)鐘SCL Serial Clock。I2C 總線器件沒有片選控制線,所以 I2C 總線數(shù)據(jù)傳輸?shù)拈_始必須由主器件產(chǎn)生通信的開始條件( SCL 高電平時(shí),SDA 產(chǎn)生負(fù)跳變);通信結(jié)束時(shí),由主器件產(chǎn)生通信的結(jié)束條件( SCL 高電平時(shí), SDA 產(chǎn)生正跳變)。

總結(jié)

以上是生活随笔為你收集整理的硬件描述语言(HDL)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。