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

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

3天內不再提示

在SpinalHDL電路中進行信號的賦值

冬至配餃子 ? 來源:Spinal FPGA ? 作者:玉騏 ? 2022-07-28 18:16 ? 次閱讀

對于SpinalHDL電路描述,信號的賦值不免有些小伙伴帶有些許迷茫,本篇抽絲剝繭,一塊兒來梳理。

是val還是var?

先來看兩個語法:

poYBAGLiYUaAerlMAAAxyFuFyMg400.png

對于變量a,聲明為val,在對其進行第二次賦值時發(fā)現會報錯,而聲明為var的變量則正常。在Scala里,對于val和var的定義:

**val:不可變變量類型。

var:可變變量類型

這似乎與我們在其他語言中所接觸的有些沖突,變量是不可變的為什么還叫變量呢?Scala是一門函數式編程語言,而在函數式編程里,其所倡導的往往是變量的賦值僅有一次,對于其他地方不會對該變量進行重新賦值,這也是引入val類型的原因,頗有些C語言中const類型的意味。

而下面的語句:

pYYBAGLiYVyAePMYAABN4KsGDp4153.png

這里變量c聲明為val,其意味著c所指向的地址不可變更,但我們仍可以修改其指向的內容,這也正式為什么我們能對c(0)賦值,而無法再將c指向一個新聲明的Array。

聲明師=,賦值靠:=

有了上面的了解,再回到SpinalHDL電路描述里,我們在描述電路時,無論是寄存器還是Mem、這些都是電路對象,其聲明有且僅應當只有一次,因而我們在定義變量時,往往這么來定義:

pYYBAGLiYW6AFeTiAAAS6hNzlwM758.png

在Scala里一切皆為class,這里我們聲明a為一個UInt對象、b為一個RegNext(a)對象,即這里聲明a、b均為8比特的寄存器,而寄存器本身一旦定義了是不可變的,為val類型。想一想倘若一會兒將a聲明為8bit寄存器,一會兒聲明為9比特寄存器,像Verilog中這么寫:

pYYBAGLiYYKAE1_nAAARNt06Qp4376.png

想必沒人會在Verilog中這么來寫吧。同理,在SpinalHDL里,我們聲明一個電路對象時,自然是=。

雖然電路對象不可改,就像聲明了a是8bit,其一定是8bit,但這8bit所代表的值是可以改變的?。。∵@也正是我們描述電路里的賦值。

SpinalHDL里為電路對象的賦值提供了三種形式:

pYYBAGLiYZeABewYAACSCwiQpKs514.png

我們是為電路對象所代表的值進行賦值,而不是改變電路對象本身(把電路對象指向另一個對象,想一想是否和上面Array的賦值有點兒類似),因而這里我們是不能用=(=在Scala中本身也是一個方法,是改變變量指向的位置,玩不可行),因而所要采用的是SpinalHDL中提供的:=或者\=來給電路對象所代表的含義進行賦值:

pYYBAGLiYauAKkVMAAAeLVny_28278.png

由于只有聲明為Reg類型的變量才會被當成寄存器類型,這里即可放心使用“:=”。

小結

勸君莫懼Scala,我們在電路描述里用到的語法特性并不多,若有systemverilog的基礎那么對于這類軟件語言入門沒那么可怕,畢竟又不是去轉大數據不是么?


審核編輯:劉清

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

    關注

    31

    文章

    5357

    瀏覽量

    120582
  • C語言
    +關注

    關注

    180

    文章

    7606

    瀏覽量

    137054
  • 編程語言
    +關注

    關注

    10

    文章

    1946

    瀏覽量

    34794
收藏 人收藏

    評論

    相關推薦

    數組名之間可以直接賦值

    ; ????return 0;} 想把數組 a 里面的數據全部賦值給 b,寫成 b = a 行不行? 和這個問題類似的還有,數組名為什么不能進行 ++ 操作? char?array[5]?=?{0};array++; 比如
    的頭像 發(fā)表于 11-26 11:23 ?162次閱讀

    ADS131M03的寄存器讀寫是要在轉換觸發(fā)的中斷中進行配置,還是可以standby狀態(tài)下進行?

    我使用32位M4單片機,通過SPI總線與AD進行通信。 基本情況: ADC外接晶振8.192MHz,晶振信號板子上電后一直連著ADC的時鐘引腳,片選信號通過單片機CS程序控制,SP
    發(fā)表于 11-13 07:08

    進行高速信號放大設計時,往往需要用到反饋電路,是否反饋電路越短越好?

    進行高速信號放大設計時,往往需要用到反饋電路,是否反饋電路越短越好,不同封裝是否在這方面有不同優(yōu)勢?
    發(fā)表于 09-26 07:55

    使用霍爾效應傳感器電子智能鎖中進行位置感應應用說明

    電子發(fā)燒友網站提供《使用霍爾效應傳感器電子智能鎖中進行位置感應應用說明.pdf》資料免費下載
    發(fā)表于 09-12 14:03 ?0次下載
    使用霍爾效應傳感器<b class='flag-5'>在</b>電子智能鎖<b class='flag-5'>中進行</b>位置感應應用說明

    數字電路是對什么信號進行傳輸的

    數字電路是一種電子系統(tǒng),它使用數字信號進行信息傳輸和處理。數字信號是由離散的電壓水平或電流水平表示的信號,通常用二進制代碼表示。與模擬
    的頭像 發(fā)表于 08-11 11:00 ?815次閱讀

    為什么指針之間不要隨意賦值呢?

    指針之間也不能隨意賦值
    的頭像 發(fā)表于 03-28 17:13 ?708次閱讀
    為什么指針之間不要隨意<b class='flag-5'>賦值</b>呢?

    淺析SpinalHDL中Pipeline中的復位定制

    之前有系列文章介紹了SpinalHDL中Pipeline的使用,最近在一個功能模塊中真實的使用了這個lib。
    的頭像 發(fā)表于 03-17 17:31 ?1058次閱讀
    淺析<b class='flag-5'>SpinalHDL</b>中Pipeline中的復位定制

    mapgis如何給區(qū)屬性賦值

    進行數據分析和可視化。 MapGIS中給區(qū)屬性賦值有多種方法,下面將詳細介紹其中的幾種常用方法。 1.手動賦值 手動賦值是最直接和簡單的
    的頭像 發(fā)表于 02-23 17:49 ?2323次閱讀

    proteus屬性賦值工具怎么用

    Proteus是一種電路設計和仿真軟件,進行電路設計和仿真時,屬性賦值是非常重要的步驟。屬性賦值
    的頭像 發(fā)表于 02-23 17:19 ?4725次閱讀

    verilog同步和異步的區(qū)別 verilog阻塞賦值和非阻塞賦值的區(qū)別

    Verilog是一種硬件描述語言,用于設計和模擬數字電路。Verilog中,同步和異步是用來描述數據傳輸和信號處理的兩種不同方式,而阻塞賦值和非阻塞
    的頭像 發(fā)表于 02-22 15:33 ?1760次閱讀

    G10指令可以對參數進行賦值,位型參數可以嗎?

    G10指令可以對參數進行賦值,位型參數可以嗎? G10指令是用于加工程序中進行參數賦值的指令。它可以用于指定數值型參數或位型參數。 首先,
    的頭像 發(fā)表于 02-18 10:49 ?890次閱讀

    用TC399Aurix development studio中進行裸機驅動調試,有些全局變量不能被正確賦值的原因?

    最近用TC399Aurix development studio中進行裸機驅動調試,編譯器選擇HeghTec,驅動庫用的是TC399 iLLD,Aurix development studio
    發(fā)表于 02-05 06:04

    貼片電感和貼片磁珠的特性?如何在貼片電感和貼片磁珠中進行選擇?

    貼片電感和貼片磁珠的特性有哪些?如何在貼片電感和貼片磁珠中進行選擇 ? 貼片電感和貼片磁珠是電子元器件中常見的兩種被動元件,它們電路中起到了穩(wěn)壓、濾波、隔離等關鍵作用。下面將詳細介紹它們的特性
    的頭像 發(fā)表于 02-03 14:49 ?784次閱讀

    TC234boot中進行Deinit CANFD失敗了的原因?

    大家好: 問題描述:項目已從啟動切換到應用程序。 如果在應用程序中使用不同的 MO 并以相同的 ID 啟動,則無法接收應用程序中的消息。 我本來希望 boot 中進行 Deinit CANFD,但我失敗了。 預期的解決方案
    發(fā)表于 01-31 06:31

    #2024,立Flag了嘛? #win平臺搭建SpinalHDL開發(fā)環(huán)境

    %\\\\lib; 系統(tǒng)變量path的 值里面添加%JAVA_HOME%\\\\bin和%JRE_HOME%\\\\jre\\\\bin 至此,對應的開發(fā)所用的軟件安裝結束,對應的仿真和波形顯示不再贅述; 還有就是要在SBT文件中進行改寫: 到此就所有工作完成了。
    發(fā)表于 01-21 10:52