0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在C代碼中插入寄存器?

FPGA技術(shù)驛站 ? 來(lái)源:Lauren的FPGA ? 作者:Lauren的FPGA ? 2021-02-02 17:07 ? 次閱讀

對(duì)于邏輯級(jí)數(shù)較高的路徑,常用的方法之一是在其中插入流水寄存器,將路徑打斷,從而降低邏輯延遲,這在HDL代碼中實(shí)現(xiàn)起來(lái)比較容易。此外,從RTL代碼風(fēng)格角度講,對(duì)于關(guān)鍵模塊,設(shè)計(jì)時(shí)常將其輸入/輸出端口寄存。這起到了隔離關(guān)鍵路徑的作用。

但是,如果使用的RTL代碼是HLS轉(zhuǎn)換生成的,例如使用Vitis HLS綜合的,其可讀性較差,想要在其生成的HDL代碼中插入寄存器就變得比較困難。為此,我們想到了能否在C代碼中插入寄存器,并保證Vitis HLS綜合后的結(jié)果是寄存器。

這要解決四個(gè)問(wèn)題:一是這樣的C代碼要具備一定的可復(fù)用性,比如,以模板函數(shù)的形式呈現(xiàn)。二是這樣的C代碼是參數(shù)化的,尤其是數(shù)據(jù)類(lèi)型,因?yàn)樾枰拇娴臄?shù)據(jù)其數(shù)據(jù)類(lèi)型不盡相同。這仍然可以借助模板函數(shù)實(shí)現(xiàn)。三是保證這個(gè)函數(shù)不被優(yōu)化合并掉。因?yàn)檫@個(gè)函數(shù)功能比較單一,輸出等于輸入,這就要用到INLINE的功能。四是C語(yǔ)言是不具備時(shí)序特征的,要實(shí)現(xiàn)輸出與輸入的延遲,就要借助相應(yīng)的pragma,我們想到了Latency。

在此基礎(chǔ)上,我們構(gòu)造了下面的C++代碼。不難看出,這是一個(gè)模板函數(shù),數(shù)據(jù)類(lèi)型是參數(shù)化的,使用了三個(gè)pragma。其中PIPELINE用于限定II為1,LATENCY用于限定延遲為1,INLINE用于防止該函數(shù)被合并。

66d4998e-5fc8-11eb-8b86-12bb97331649.png

看一個(gè)具體的使用案例,如下圖所示代碼。功能很簡(jiǎn)單,就是實(shí)現(xiàn)兩個(gè)數(shù)的相加。這里對(duì)兩個(gè)輸入數(shù)據(jù)a和b分別做了寄存,同時(shí)對(duì)結(jié)果c也做了寄存。最終的綜合報(bào)告顯示Latency為2,和我們預(yù)期的一致。對(duì)于生成的HDL代碼,將其添加到Vivado中進(jìn)行綜合,綜合后的結(jié)果也是符合預(yù)期的。

6a37c740-5fc8-11eb-8b86-12bb97331649.png

6dcf1afc-5fc8-11eb-8b86-12bb97331649.png

這里,我們對(duì)比一下三種情形。情形1:不添加流水寄存器;情形2:僅對(duì)輸出添加流水寄存器;情形3:輸入輸出均添加流水寄存器。Vitis HLS綜合結(jié)果以及其生成的HDL代碼在Vivado下的綜合結(jié)果對(duì)比如下圖所示。首先,可以看到Latency符合預(yù)期,同時(shí)II始終為1;其次,Vivado下綜合后的資源利用率與Vitis HLS的結(jié)果是不一致的。這一點(diǎn)也很容易理解,因?yàn)閂ivado綜合時(shí)會(huì)有很多優(yōu)化。

6e165a70-5fc8-11eb-8b86-12bb97331649.png

進(jìn)一步,我們看到這里的延遲為1,如果需要兩級(jí)延遲,就要兩次調(diào)用模板函數(shù)。能否將延遲的時(shí)鐘周期也設(shè)置成參數(shù)呢?答案是肯定的,如下圖代碼所示。這里定義了L,用來(lái)管理延遲的時(shí)鐘周期個(gè)數(shù),對(duì)應(yīng)pragma Latency的min和max值。

6e600c38-5fc8-11eb-8b86-12bb97331649.png

6f7ac52c-5fc8-11eb-8b86-12bb97331649.png

原文標(biāo)題:在C代碼中插入寄存器

文章出處:【微信公眾號(hào):Lauren的FPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5250

    瀏覽量

    119194
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134026
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4670

    瀏覽量

    67764

原文標(biāo)題:在C代碼中插入寄存器

文章出處:【微信號(hào):Lauren_FPGA,微信公眾號(hào):FPGA技術(shù)驛站】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    寄存器的輸入輸出方式

    寄存器的輸入輸出方式是數(shù)字電路設(shè)計(jì)至關(guān)重要的部分,它決定了數(shù)據(jù)如何在寄存器中進(jìn)出以及處理的效率。下面將詳細(xì)探討寄存器的幾種主要輸入輸出方式
    的頭像 發(fā)表于 09-05 14:09 ?178次閱讀

    寄存器故障分析

    寄存器故障分析是計(jì)算機(jī)硬件維護(hù)與系統(tǒng)穩(wěn)定性保障的重要環(huán)節(jié)。寄存器作為計(jì)算機(jī)的關(guān)鍵組成部分,負(fù)責(zé)存儲(chǔ)和傳輸數(shù)據(jù),其穩(wěn)定性和可靠性直接影響到整個(gè)計(jì)算機(jī)系統(tǒng)的性能。以下是對(duì)
    的頭像 發(fā)表于 08-29 11:26 ?280次閱讀

    寄存器是什么意思?寄存器是如何構(gòu)成的?

    在計(jì)算機(jī)科學(xué),寄存器(Register)是一個(gè)高速存儲(chǔ)單元,它位于中央處理(CPU)內(nèi)部,用于存儲(chǔ)計(jì)算機(jī)程序執(zhí)行過(guò)程中所需要的數(shù)據(jù)、指令地址或狀態(tài)信息。寄存器是計(jì)算機(jī)體系結(jié)構(gòu)
    的頭像 發(fā)表于 08-02 18:23 ?1473次閱讀
    <b class='flag-5'>寄存器</b>是什么意思?<b class='flag-5'>寄存器</b>是如何構(gòu)成的?

    寄存器尋址和直接尋址的區(qū)別

    寄存器尋址和直接尋址是計(jì)算機(jī)指令系統(tǒng)的兩種基本尋址方式。它們?cè)谥噶畹膱?zhí)行過(guò)程起著至關(guān)重要的作用,決定了指令操作數(shù)的來(lái)源和目標(biāo)。下面我們將介紹這兩種尋址方式的特點(diǎn)、區(qū)別以及在實(shí)際應(yīng)用
    的頭像 發(fā)表于 07-12 10:42 ?451次閱讀

    寄存器尋址的實(shí)現(xiàn)方式

    在計(jì)算機(jī)體系結(jié)構(gòu),寄存器尋址是一種常見(jiàn)的尋址方式,它允許程序直接訪問(wèn)CPU內(nèi)部的寄存器。寄存器尋址可以提高程序的執(zhí)行效率,因?yàn)樗苊饬藢?duì)內(nèi)存的訪問(wèn)。
    的頭像 發(fā)表于 07-12 10:36 ?359次閱讀

    寄存器分為基本寄存器和什么兩種

    寄存器是計(jì)算機(jī)中用于存儲(chǔ)數(shù)據(jù)的高速存儲(chǔ)單元,它們是CPU內(nèi)部的重要組成部分。寄存器可以分為基本寄存器和擴(kuò)展寄存器兩種類(lèi)型。 一、基本寄存器
    的頭像 發(fā)表于 07-12 10:31 ?631次閱讀

    如何根據(jù)自己設(shè)計(jì)寄存器配置總線定義來(lái)生成一套寄存器配置模版

    無(wú)論是FPGA還是ASIC,系統(tǒng)設(shè)計(jì)總會(huì)存在配置寄存器總線的使用,我們會(huì)將各種功能、調(diào)試寄存器掛載在寄存器總線上使用。
    的頭像 發(fā)表于 03-04 13:56 ?769次閱讀
    如何根據(jù)自己設(shè)計(jì)<b class='flag-5'>中</b>的<b class='flag-5'>寄存器</b>配置總線定義來(lái)生成一套<b class='flag-5'>寄存器</b>配置模版

    CPU的6個(gè)主要寄存器

    CPU寄存器是中央處理內(nèi)的組成部分,是有限存貯容量的高速存貯部件。寄存器是CPU內(nèi)部的元件,包括通用寄存器、專(zhuān)用寄存器和控制
    的頭像 發(fā)表于 02-03 15:15 ?2937次閱讀

    何在MCS下操作寄存器?

    何在MCS下操作寄存器
    發(fā)表于 01-19 06:24

    labview讀取三菱plc寄存器內(nèi)容

    如何使用LabVIEW讀取三菱PLC的寄存器內(nèi)容,并提供一些實(shí)例代碼和注意事項(xiàng)。 首先,我們需要了解PLC寄存器的基本概念。PLC寄存器是一種用于存儲(chǔ)數(shù)據(jù)的內(nèi)部變量,被用于傳輸和保存信
    的頭像 發(fā)表于 12-27 16:31 ?1663次閱讀

    寄存器開(kāi)發(fā),HAL開(kāi)發(fā)和LL開(kāi)發(fā)的區(qū)別和參考代碼

    1,寄存器開(kāi)發(fā)【難度值:難】寄存器開(kāi)發(fā)是一種直接訪問(wèn)微控制寄存器的編程方法,它提供了對(duì)硬件的極大靈活性和直接控制。在寄存器級(jí)開(kāi)發(fā)
    的頭像 發(fā)表于 11-17 08:00 ?1012次閱讀
    <b class='flag-5'>寄存器</b>開(kāi)發(fā),HAL開(kāi)發(fā)和LL開(kāi)發(fā)的區(qū)別和參考<b class='flag-5'>代碼</b>

    gic的寄存器 gicv3的LPI中斷

    寄存器 ? ?GICV_:虛擬interface的控制寄存器 ? ?GICC_: 虛擬cpu interface的寄存器 1-Distributor register 在這里插入圖片描
    的頭像 發(fā)表于 11-08 16:09 ?561次閱讀

    8位MCU 32.768kHz晶振相關(guān)控制寄存器代碼選項(xiàng)說(shuō)明

    穎8位MCU 32.768kHz晶振相關(guān)控制寄存器代碼選項(xiàng)說(shuō)明
    的頭像 發(fā)表于 10-27 15:07 ?453次閱讀

    CPSR寄存器和APSR寄存器的組成

    程序狀態(tài)寄存器的作用就是反映處理的狀態(tài)信息。在程序運(yùn)行期間我們可以通過(guò)查看程序狀態(tài)寄存器的狀態(tài)位來(lái)進(jìn)行程序的分支跳轉(zhuǎn)處理,或者我們可以設(shè)置程序狀態(tài)寄存器的模式位來(lái)改變處理
    的頭像 發(fā)表于 10-20 11:38 ?3727次閱讀
    CPSR<b class='flag-5'>寄存器</b>和APSR<b class='flag-5'>寄存器</b>的組成

    何在shell操作寄存器

    shell 操作寄存器可以使用 devmem 命令. devmem 命令其實(shí)就是上述應(yīng)用層操作寄存器生成的可執(zhí)行文件,只不過(guò)busybox已經(jīng)幫我們實(shí)現(xiàn)了。 devmem 命令格式: Usage
    的頭像 發(fā)表于 09-26 16:39 ?838次閱讀