色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

實現穩健的微控制器到FPGA SPI接口: 雙緩沖區!

得捷電子DigiKey ? 來源:得捷電子DigiKey ? 2024-05-16 09:36 ? 次閱讀

問:實現穩健的微控制器FPGA SPI 接口: 雙緩沖區

在介紹雙緩沖器之前,我們將簡要探討Verilog 脈寬調制器 (PWM) 的工作原理。這一點很重要,因為雙緩沖區最好被看作是硬件模塊 (如 PWM) 的可尋址接口。

PWM 的回顧

PWM 模塊的頂層接口在這個 Verilog 代碼片段中描述。觀察該模塊使用了位寬參數,并建立了最小和最大占空比限制。最后,觀察PWM模塊有一個[B - 1:0]輸入矢量來設置占空比。沒有顯示的是在每個 PWM 占空比開始時讀取輸入的事實。

module PWM #(parameter

B = 12,

D_MIN_PERCENT = 0,

D_MAX_PERCENT = 95

)

(

input wire clk,

input wire enable,

input wire [B -1:0] d_in,

output reg PWM,

output reg [B -1:0] cnt

);

同步數據呈現

PWM 設計用于在更大的 uC 到 FPGA SPI 系統中工作?;叵胍幌?,SPI自然地使用字節寬度的數據元素進行操作。這與使用B定義的數據寬度操作的PWM形成鮮明對比。為了方便,我們假設 PWM 以16位的位寬度(B)實例化。

當系統更新與 PWM 輸入相關的寄存器時,會出現一個問題。如果沒有適當的注意,PWM 可能會在更新過程中執行讀取操作。其結果是驅動器字節被分割成一個舊字節和一個新字節。這可能導致占空比的顯著躍升,持續一個 PWM 周期。如果 PWM 用于LED 指示燈,則可能不會注意到這一點。在更復雜的系統中,故障相當于一個強脈沖,并可能導致系統響鈴或變得不穩定,具體取決于錯誤發生的時間和頻率。

解決方案是實現以下三篇文章中提到的雙緩沖方案,后面將進行深入討論。

第1 部分介紹了指導大型系統開發的 Verilog 設計理念。這是介紹寄存器傳輸電平 (RTL) 設計準則的關鍵部分,如時鐘邊界、頻閃器的使用和雙緩沖區的必要性。

第2部分介紹了 SPI 協議?;叵胍幌?,所選協議改編自802.3以太網幀,具有可變有效載荷長度和循環冗余校驗 (CRC) 等概念,以提供數據完整性的度量。

第3部分介紹了 uC 到 FPGA 接口的高級視圖。那篇文章中最重要的部分是這里重復的框圖。

使用一組寄存器來捕獲單個字節。當收集到完整的n字節數據時,更新第二個更寬的寄存器。第二個寄存器-雙緩沖區-然后用于驅動其他模塊,如代表性的 PWM。

雙緩沖模塊

雙緩沖模塊的框圖如圖1所示。在內部,它由四個主要部分組成。最重要的是輸出寄存器。在這個例子中,它是16位寬,使其適合驅動16位 PWM。輸出寄存器由單個8位寄存器驅動,在本例中它們被標記為 LSB 和 MSB。注意,所有的寄存器更新都是由雙緩沖區的控制部分發起的。這是一個同步操作,其中所有元素響應主 100mhz時鐘的滴答聲。

04f2c404-12c9-11ef-a297-92fbcf53809c.png

1:雙緩沖區的框圖,顯示了單個8位緩沖區與輸出緩沖區之間的關系。

重要的是要理解,每個雙緩沖區模塊都是用特定的地址和特定的字節寬度實例化的,如下面的代碼清單所示。注意,16位地址、8位數據和寫頻閃都涉及到加載緩沖區。當16位地址輸入與實例化地址匹配時,數據傳輸就開始了。

module

double_buffer #(

parameterBYTE_WIDTH = 2,

parameterBASE_ADDRESS = 16'h0200

) (

input wire clk,

input wire [7:0]data,

input wire [15:0]address,

input wirewrite_strobe,

output reg [((8 *BYTE_WIDTH) - 1): 0] double_buffer_out,

output regnew_data_strobe

);

如圖1所示,這個 uC 到 FPGA 接口有一個底層的8位傳輸過程。在這文章中首先介紹的命令幀中也隱含了一個連續寫入操作。為了方便起見,這里將命令幀重復為圖2。作為一個例子,讓我們假設 PWM 和相關的雙緩沖區以地址0x0200實例化。命令幀的寫地址將被設置為0x0200,負載的前兩個字節將保持所需的16位 PWM 值。

05166148-12c9-11ef-a297-92fbcf53809c.png

2:構成uC到FPGA SPI協議基礎的命令和響應幀。

當接收并驗證命令幀時,MSG 寫塊將斷言地址0x0200,該地址指向 PWM 的雙緩沖區。它將把第一個有效載荷字節放到數據總線上。最后,它將為一個時鐘周期斷言寫頻閃。這將加載如圖1所示的 MSB (大端)。

繼續進行連續寫入,MSG 寫入器向前推進地址,斷言下一個數據字節,然后脈沖寫入頻閃,從而將 LSB 加載到雙緩沖區中。這個過程對命令幀中的每個字節繼續進行,由幀的字節長度字段控制。

從本質上講,消息編寫器并不了解相關的雙緩沖區的長度。它只關心斷言地址、數據和寫頻閃的三步過程。這取決于雙緩沖區模塊來理解它們何時被尋址,以及何時接收到 BYTE_WIDTH 參數指定的必要字節數。

由于雙級緩沖區的基址和字節寬度在實例化時是已知的,因此很容易確定何時接收到所有字節。在這個 PWM 示例中,雙緩沖器計數到2,然后發送一個頻閃來加載輸出寄存器。

技術貼士: 數據可能首先訪問最高有效字節 (MSB) 或最低有效字節 (LSB)。描述順序的術語是“端序” (endian)。如果 MSB 先出現,則系統為大端序。如果 LSB 是第一個,則系統是小端序的。本文描述的雙緩沖區和關聯幀是大端序。

雙緩沖區代碼

雙緩沖區的 Verilog 代碼附在本注釋的末尾。代碼緊跟圖2的框圖,理解它可以擴展到n字節的寬度。這可以通過更改 BYTE_WIDTH 參數來實現。

這段代碼的關鍵是 Verilog 生成操作符的使用。回想一下,generate特性允許迭代地生成硬件。它的運作方式就像一個制造小部件的工廠。

除了,在這種情況下,我們正在制作8位寄存器,其程序集的總數等于 BYTE_WIDTH 參數。我們可以在 Vivado 分層設計窗口中看到這一點,如圖3所示。這些“制造”的塊與它們在生成循環中定義的連續命名方案一起出現。

0536e7b0-12c9-11ef-a297-92fbcf53809c.png

3:在雙緩沖區實例化中可以看到生成的字節寬度寄存器。

觀察每個生成的9位寄存器都包含一個對應的 local_write_strobe。這是一個重要的設計方面,因為 “control”部分使用它來加載相關的8位寄存器。

除了寄存器之外,生成循環還制造一個8位矢量,每個8位寄存器的輸出都連接到這個矢量上。然后將這些N × 8位的包連接起來并傳遞到n字節輸出寄存器。

代碼的最后一部分確定n字節何時被收集。然后它更新輸出寄存器并發送一個new_data_strobe。

控制部分有三個基本功能:

當基址與實例化地址匹配時激活模塊。

維護一個計數器指向“制造的”8位寄存器。這個計數器對于連續寫入是必不可少的。

對相關的8位寄存器進行頻閃。

當N個8位寄存器被填滿時,對輸出緩沖區進行頻閃。

技術貼士:矢量是導線的一維數組。一個例子是“input wire [15:0] address”,它定義了一個16位的名為 address 的矢量。

結語

最后,雖然這段代碼確實很復雜,但 Verilog 生成操作符提供了很大的靈活性。它消除了為每個期望的字節寬度構建獨立模塊的需要。


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

    關注

    31

    文章

    5336

    瀏覽量

    120230
  • 緩沖器
    +關注

    關注

    6

    文章

    1921

    瀏覽量

    45473
  • LED指示燈
    +關注

    關注

    2

    文章

    94

    瀏覽量

    12654
  • SPI接口
    +關注

    關注

    0

    文章

    258

    瀏覽量

    34373
  • 脈寬調制器
    +關注

    關注

    1

    文章

    57

    瀏覽量

    17003

原文標題:實現MCU到FPGA SPI接口有一個好選項:用雙緩沖器!

文章出處:【微信號:得捷電子DigiKey,微信公眾號:得捷電子DigiKey】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    基于宏高效實現環形緩沖區教程

    來源 | 小麥大叔 循環緩沖區是嵌入式軟件工程師在日常開發過程中的關鍵組件。 多年來,互聯網上出現了許多不同的循環緩沖區實現和示例。我非常喜歡這個模塊,可以GitHub上找到這個開源的 CBUF.h
    的頭像 發表于 09-02 09:24 ?6730次閱讀
    基于宏高效<b class='flag-5'>實現</b>環形<b class='flag-5'>緩沖區</b>教程

    SPI接口如何實現微控制器之間的通信

    微控制器接口側配有一個通用同步和異步收發 (USART)、一個 I2C 兼容型雙線接口 (TWI) 和 SPI。USART 可配置為第
    發表于 08-02 11:24 ?2713次閱讀
    <b class='flag-5'>SPI</b><b class='flag-5'>接口</b>如何<b class='flag-5'>實現</b><b class='flag-5'>微控制器</b>之間的通信

    采用FT245BM和FPGA實現USB接口設計

    USB數據與并行I/O口數據的交換緩沖區。FIFO實現與外界(微控制器、FPGA或其它器件)的接口,主要通過8根數據線D0~D7、讀寫
    發表于 04-22 07:00

    采用FT245BM和FPGA實現USB接口設計

    USB數據與并行I/O口數據的交換緩沖區。FIFO實現與外界(微控制器、FPGA或其它器件)的接口,主要通過8根數據線D0~D7、讀寫
    發表于 04-26 07:00

    基于ARM和FPGA的環形緩沖區接口設計方案

    CPU用戶手冊,在FPGA端編寫相應的接口代碼來配合ARM CPU2端的讀寫時序實現。 下面重點介紹環形緩沖區接口的軟件
    發表于 05-30 05:00

    UART緩沖技術:友好中斷

    UART對于業余和專業項目都是很好的傳輸協議,但是在時間緊迫的系統中,UART可能很棘手。UART(通用異步接收傳輸)是微控制器在其他微控制器和計算機之間進行接口的一種流行協議。使用高速微控制
    發表于 09-19 08:32

    請問如何實現微控制器FPGA接口設計?

    基于FPGA的MCU設計有兩種基本實現方式如何實現微控制器FPGA接口設計
    發表于 05-06 10:05

    什么是緩沖區模式?

    什么是緩沖區模式?
    發表于 12-08 07:05

    什么是緩沖區模式?

    什么是緩沖區模式?
    發表于 02-28 10:09

    環形緩沖區實現原理

    在通信程序中,經常使用環形緩沖區作為數據結構來存放通信中發送和接收的數據。環形緩沖區是一個先進先出的循環緩沖區,可以向通信程序提供對緩沖區的互斥訪問。
    的頭像 發表于 03-22 10:03 ?7530次閱讀
    環形<b class='flag-5'>緩沖區</b>的<b class='flag-5'>實現</b>原理

    緩沖區是啥意思 STM32串口數據接收之環形緩沖區

    緩沖區顧名思義是緩沖數據用的。實現緩沖區最簡單的辦法時,定義多個數組,接收一包數據數組A,就把接收數據的地址換成數組B,每個數據有個標記字
    的頭像 發表于 07-22 15:33 ?1.1w次閱讀

    STM32微控制器上的Octo-SPI接口

    STM32微控制器上的Octo-SPI接口
    發表于 11-21 08:11 ?4次下載
    STM32<b class='flag-5'>微控制器</b>上的Octo-<b class='flag-5'>SPI</b><b class='flag-5'>接口</b>

    環形緩沖區實現思路

    單片機程序開發一般都會用到UART串口通信,通過通信來實現上位機和單片機程序的數據交互。通信中為了實現正常的收發,一般都會有對應的發送和接收緩存來暫存通信數據。這里使用環形緩沖區的方式來設計數據收發的緩存,即
    的頭像 發表于 01-17 15:07 ?1632次閱讀

    SPI控制器驅動層功能介紹

    SPI 控制器驅動層 SPI 控制器驅動層負責最底層的數據收發,主要有以下功能: 申請必要的硬件資源,比如中斷、DMA 通道、DMA 內存緩沖區
    的頭像 發表于 07-25 10:58 ?1210次閱讀
    <b class='flag-5'>SPI</b><b class='flag-5'>控制器</b>驅動層功能介紹

    C++環形緩沖區設計與實現

    的存儲空間。環形緩沖區的特點是其終點和起點是相連的,形成一個環狀結構。這種數據結構在處理流數據和實現數據緩存等場景中具有廣泛的應用。 環形緩沖區的主要作用是存儲和管理數據
    的頭像 發表于 11-09 11:21 ?2027次閱讀
    C++環形<b class='flag-5'>緩沖區</b>設計與<b class='flag-5'>實現</b>
    主站蜘蛛池模板: 欧美 亚洲 中文字幕 高清| 久久国产高清字幕中文| 国产精品国产三级国AV在线观看| 欧美亚洲高清国产| 让男人玩尿道的女人| 少妇一夜未归暴露妓女身份| 午夜伦理网| 亚洲国产综合人成综合网站00| 野花高清在线观看免费3中文| 最近中文字幕在线中文高清版 | 亚洲乱色视频在线观看| 一级毛片西西人体44rt高清| 99久久精品免费看国产一区二区三区| 扒开女生尿口| 国产原创剧情麻豆在线| 久久婷五月综合色啪网| 人妻无码AV中文系统久久免费| 午夜想想爱| 最好看中文字幕国语| 成年性生交大片免费看| 国内精品偷拍在线观看| 美女丝袜夹b| 偷拍亚洲色自拍| 中文字幕按摩| 厨房玩朋友娇妻中文字幕| 久久re热线视频精品99| 国产精品日韩欧美一区二区三区 | 少妇第一次交换| 亚洲免费观看| www黄色com| 国内精品蜜汁乔依琳视频| 男人J桶女人P视频无遮挡网站| 日本久久精品免视看国产成人 | 丰满人妻妇伦又伦精品APP国产| 国产亚洲精品线观看不卡| 蜜桃视频无码区在线观看| 无码137片内射在线影院| 最近中文字幕无吗免费高清| 国产精华av午夜在线观看| 美国z0069| 亚洲国产在线2020最新|