做磁力網(wǎng)站qq群怎么優(yōu)化排名靠前
Chisel入門——在windows系統(tǒng)下部署Chisel環(huán)境并點(diǎn)亮FPGA小燈等實(shí)驗(yàn)
- 一、chisel簡(jiǎn)介
- 二、vscode搭建scala開發(fā)環(huán)境
- 2.1 安裝Scala官方插件
- 2.2 java版本(本人用的是jdk18)
- 2.3 下載Scala Windows版本的二進(jìn)制文件
- 2.4 配置環(huán)境變量
- 2.5 scala測(cè)試
- 2.6 vscode運(yùn)行scala
- 三、windows安裝sbt
- 3.1、sbt下載及安裝
- 3.2 配置環(huán)境變量
- 3.3 sbt配置
- 3.4測(cè)試
- 四、用Chisel點(diǎn)亮FPGA小燈
- 4.1 Hello world 實(shí)現(xiàn)
- 4.2 上板驗(yàn)證
- 五、在DE2-115開發(fā)板上實(shí)現(xiàn)流水燈
- 六、心得體會(huì)
一、chisel簡(jiǎn)介
傳統(tǒng)數(shù)字芯片的RTL設(shè)計(jì)采用Verilog語(yǔ)言為主,Chisel語(yǔ)言的全稱是Constructing Harward in Scala Embeded Language,即在Scala語(yǔ)言中導(dǎo)入Chisel3庫(kù),即可使用Chisel語(yǔ)言。其特點(diǎn)是面向?qū)ο缶幊?#xff0c;可以方便地參數(shù)化定制硬件電路,加快設(shè)計(jì)流程。目前在RISC-V生態(tài)中應(yīng)用較多,中科院計(jì)算所主持的培育下一代處理器設(shè)計(jì)人才的“一生一芯”項(xiàng)目也在極力推進(jìn)該語(yǔ)言。
Chisel是一個(gè)Scala庫(kù),用于構(gòu)建高級(jí)別的、可綜合的、模塊化的硬件設(shè)計(jì)。它允許設(shè)計(jì)師在高層次上定義硬件的行為,然后通過(guò)一系列的轉(zhuǎn)換步驟將其轉(zhuǎn)換為低層次的Verilog或VHDL代碼。這使得設(shè)計(jì)師可以專注于實(shí)現(xiàn)硬件的功能,而不需要關(guān)心底層的細(xì)節(jié)。
Chisel的主要特點(diǎn)包括:
高級(jí)抽象:使用Scala的高級(jí)別抽象來(lái)描述硬件行為。
可綜合:生成的Verilog或VHDL代碼可以直接用于ASIC或FPGA的設(shè)計(jì)。
模塊化:可以將設(shè)計(jì)分解為多個(gè)獨(dú)立的模塊,每個(gè)模塊都可以獨(dú)立地進(jìn)行測(cè)試和驗(yàn)證。
交互式開發(fā):可以在Scala REPL中直接運(yùn)行Chisel代碼,以便于調(diào)試和驗(yàn)證。
為什么要提出Chisel?
Chisel的設(shè)計(jì)者們是這么說(shuō)的(以下翻譯自官網(wǎng)Motivation – “Why Chisel?”):
在我們的科研項(xiàng)目和硬件設(shè)計(jì)課程中,與現(xiàn)有硬件描述語(yǔ)言進(jìn)行了多年的斗爭(zhēng),這促使我們開發(fā)一種新的硬件語(yǔ)言。Verilog和VHDL是作為硬件仿真語(yǔ)言開發(fā)的,直到后來(lái)它們才成為硬件綜合的基礎(chǔ)。這些語(yǔ)言的大部分語(yǔ)義不適用于硬件綜合,事實(shí)上,許多結(jié)構(gòu)都無(wú)法綜合。其他結(jié)構(gòu)在他們?nèi)绾斡成涞接布?shí)現(xiàn)是很不直觀的,或者說(shuō)他們的使用可能會(huì)意外地導(dǎo)致非常低效的硬件結(jié)構(gòu)。雖然可以使用這些語(yǔ)言的子集并且還能得到可以接受的效果,但它們?nèi)匀怀尸F(xiàn)出混亂和令人困惑的規(guī)范模型,特別是在教學(xué)環(huán)境中。
然而,我們開發(fā)新硬件語(yǔ)言的最強(qiáng)烈動(dòng)機(jī)是我們希望改變電子系統(tǒng)設(shè)計(jì)的方式。我們認(rèn)為,重要的是不僅要教學(xué)生如何設(shè)計(jì)電路,還要教他們?nèi)绾卧O(shè)計(jì)電路生成器——從高級(jí)設(shè)計(jì)參數(shù)和約束自動(dòng)生成設(shè)計(jì)的程序。通過(guò)電路生成器,我們希望利用設(shè)計(jì)專家的辛勤工作,為大家提高設(shè)計(jì)抽象水平。為了表達(dá)靈活和可拓展的電路結(jié)構(gòu),電路生成器必須采用復(fù)雜的編程技術(shù)來(lái)確定如何根據(jù)高級(jí)參數(shù)值和約束更好地定制其輸出電路。雖然Verilog和VHDL包含一些用于編程電路生成的原始結(jié)構(gòu),但它們?nèi)狈ΜF(xiàn)代編程語(yǔ)言中的強(qiáng)大功能,例如面向?qū)ο缶幊?、類型推斷、?duì)函數(shù)式編程的支持以及反射等。
我們沒(méi)有從頭開始構(gòu)建新的硬件設(shè)計(jì)語(yǔ)言,而是選擇在現(xiàn)有語(yǔ)言中嵌入硬件構(gòu)造原語(yǔ),我們選擇Scala不僅是因?yàn)樗覀冋J(rèn)為對(duì)于構(gòu)建電路生成器很重要的編程特性,還因?yàn)樗菍iT作為特定領(lǐng)域語(yǔ)言(DSL)的基礎(chǔ)而開發(fā)的。
這里只做簡(jiǎn)單的介紹:更多資料可以查看以下鏈接
鏈接: link
二、vscode搭建scala開發(fā)環(huán)境
2.1 安裝Scala官方插件
在VS Code中安裝插件,先安裝 Scala Syntax (official),再安裝 Scala (Metals):
第一個(gè)和第二個(gè)都需要安裝
2.2 java版本(本人用的是jdk18)
注意可能部分jdk不適配
直接打開終端,輸入
java -version
2.3 下載Scala Windows版本的二進(jìn)制文件
下載鏈接:link
然后一直點(diǎn)擊next即可
注意需要記得安裝的路徑
2.4 配置環(huán)境變量
1、變量值即為安裝的路徑
2.PATH變量下再新增值
2.5 scala測(cè)試
終端輸入scala,出現(xiàn)以下信息即可
2.6 vscode運(yùn)行scala
代碼如下:
object HelloWorld
{ def main(args: Array[String]): Unit = {println("Hello, world!") }
}
三、windows安裝sbt
3.1、sbt下載及安裝
官網(wǎng):http://www.scala-sbt.org/download.html
如果下載的是壓縮文件,解壓后需要配置環(huán)境變量等
通過(guò)下面這種方式一般都自動(dòng)配置好了環(huán)境變量
點(diǎn)擊next即可,還是要記住安裝路徑()
3.2 配置環(huán)境變量
這里和sacla的配置內(nèi)容相同
3.3 sbt配置
修改 sbt\conf\sbtconfig.txt 為以下內(nèi)容:
# sbt configuration file for Windows# Set the java args#-mem 1024 was added in sbt.bat as default-Xms1024m
-Xmx1024m
-Xss4M
-XX:ReservedCodeCacheSize=128m# Set the extra sbt options-Dsbt.log.format=true
-Dsbt.boot.directory=D:/sbt/boot/
-Dsbt.global.base=D:/sbt/.sbt
-Dsbt.ivy.home=D:/sbt/.ivy2
-Dsbt.repository.config=D:/sbt/conf/repo.properties
-Dsbt.override.build.repos=true
設(shè)置阿里云鏡像,國(guó)內(nèi)的網(wǎng)絡(luò)環(huán)境復(fù)雜,在 sbt\conf\ 下新建 repo.properties 文件,內(nèi)容為
[repositories]localaliyun-central: https://maven.aliyun.com/repository/centralaliyun-public: https://maven.aliyun.com/repository/publicjcenter: https://jcenter.bintray.com/repo1: https://repo1.maven.org/maven2/store_2: https://repo2.maven.org/maven2/aliyun-releases: https://maven.aliyun.com/repository/releasesaliyun-apache-snapshots: https://maven.aliyun.com/repository/apache-snapshotsaliyun-google: https://maven.aliyun.com/repository/googlealiyun-jcenter: https://maven.aliyun.com/repository/jcenteraliyun-spring: https://maven.aliyun.com/repository/springaliyun-spring-plugin: https://maven.aliyun.com/repository/spring-pluginsbt-plugin: https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/sonatype: https://oss.sonatype.org/content/repositories/snapshots typesafe: https://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnlytypesafe2: https://repo.typesafe.com/typesafe/releases/atlassian: https://packages.atlassian.com/content/repositories/atlassian-public/spring-plugin: https://repo.spring.io/plugins-release/hortonworks: https://repo.hortonworks.com/content/repositories/releases/
3.4測(cè)試
完成后打開cmd,輸入 sbt,可能會(huì)有一段下載依賴包的過(guò)程,成功后會(huì)進(jìn)入命令行,即sbt安裝成功
退出方式:在命令框中輸入 exit 即可退出
四、用Chisel點(diǎn)亮FPGA小燈
參考的chisel書為chisel-book,是一個(gè)PDF文檔,
鏈接: link
4.1 Hello world 實(shí)現(xiàn)
我們從書上找到相應(yīng)的代碼,然后把代碼拉下來(lái)
git clone https://gitcode.com/schoeberl/chisel-examples.git
我們知道FPGA需要的是.v文件,顯然我們拉下來(lái)的代碼并沒(méi)有這個(gè)文件,所以我們需要進(jìn)行一些處理
來(lái)到當(dāng)前文件目錄,運(yùn)行 sbt run
第一次編譯需要等待一段時(shí)間,然后顯示成功。
hello.scala
//點(diǎn)亮小燈
/** This code is a minimal hardware described in Chisel.* * Blinking LED: the FPGA version of Hello World*/
//
import chisel3._
//
/*** The blinking LED component.*/
//
class Hello extends Module {val io = IO(new Bundle {val led = Output(UInt(1.W))})val CNT_MAX = (50000000 / 2 - 1).U
// val cntReg = RegInit(0.U(32.W))val blkReg = RegInit(0.U(1.W))
// cntReg := cntReg + 1.Uwhen(cntReg === CNT_MAX) {cntReg := 0.UblkReg := ~blkReg}io.led := blkReg
}
//
/*** An object extending App to generate the Verilog code.*/
object Hello extends App {(new chisel3.stage.ChiselStage).emitVerilog(new Hello())
}
然后即可生成.v文件
hello.v文件如下
以及頂層文件 hello_top.v:
4.2 上板驗(yàn)證
-
創(chuàng)建quartus項(xiàng)目
板子型號(hào)為 EP4CE115F29C7 -
加入.v文件
將生成的 Hello.v文件 和 hello_top.v文件 添加到項(xiàng)目中,并設(shè)置hello_top.v為頂層文件:
3、引腳綁定
4、燒入
實(shí)驗(yàn)結(jié)果如下:
五、在DE2-115開發(fā)板上實(shí)現(xiàn)流水燈
步驟和上面相似:
修改 Hello.scala 文件為:
import chisel3._
import chisel3.util._class Hello extends Module {val io = IO(new Bundle {val led = Output(UInt(8.W)) // 8 位 LED 輸出})val maxCount = (50000000 / 10).U // 調(diào)整這個(gè)參數(shù)改變流水燈的速度(DE2-115 使用 50MHz 時(shí)鐘)val counter = RegInit(0.U(32.W))val position = RegInit(0.U(3.W))// 計(jì)數(shù)器邏輯counter := counter + 1.Uwhen(counter === maxCount) {counter := 0.Uwhen(position === 7.U) {position := 0.U}.otherwise {position := position + 1.U}}// LED 輸出邏輯io.led := (1.U << position)
}object Hello extends App {(new chisel3.stage.ChiselStage).emitVerilog(new Hello())
}
修改后再次運(yùn)行
hello.v 文件
module Hello(input clock,input reset,output [7:0] io_led
);
`ifdef RANDOMIZE_REG_INITreg [31:0] _RAND_0;reg [31:0] _RAND_1;
`endif // RANDOMIZE_REG_INITreg [31:0] counter; // @[Hello.scala 10:24]reg [2:0] position; // @[Hello.scala 11:25]wire [31:0] _counter_T_1 = counter + 32'h1; // @[Hello.scala 14:22]wire [2:0] _position_T_1 = position + 3'h1; // @[Hello.scala 20:28]assign io_led = 8'h1 << position; // @[Hello.scala 25:18]always @(posedge clock) beginif (reset) begin // @[Hello.scala 10:24]counter <= 32'h0; // @[Hello.scala 10:24]end else if (counter == 32'h4c4b40) begin // @[Hello.scala 15:30]counter <= 32'h0; // @[Hello.scala 16:13]end else begincounter <= _counter_T_1; // @[Hello.scala 14:11]endif (reset) begin // @[Hello.scala 11:25]position <= 3'h0; // @[Hello.scala 11:25]end else if (counter == 32'h4c4b40) begin // @[Hello.scala 15:30]if (position == 3'h7) begin // @[Hello.scala 17:28]position <= 3'h0; // @[Hello.scala 18:16]end else beginposition <= _position_T_1; // @[Hello.scala 20:16]endendend
// Register and memory initialization
`ifdef RANDOMIZE_GARBAGE_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_INVALID_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_REG_INIT
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_MEM_INIT
`define RANDOMIZE
`endif
`ifndef RANDOM
`define RANDOM $random
`endif
`ifdef RANDOMIZE_MEM_INITinteger initvar;
`endif
`ifndef SYNTHESIS
`ifdef FIRRTL_BEFORE_INITIAL
`FIRRTL_BEFORE_INITIAL
`endif
initial begin`ifdef RANDOMIZE`ifdef INIT_RANDOM`INIT_RANDOM`endif`ifndef VERILATOR`ifdef RANDOMIZE_DELAY#`RANDOMIZE_DELAY begin end`else#0.002 begin end`endif`endif
`ifdef RANDOMIZE_REG_INIT_RAND_0 = {1{`RANDOM}};counter = _RAND_0[31:0];_RAND_1 = {1{`RANDOM}};position = _RAND_1[2:0];
`endif // RANDOMIZE_REG_INIT`endif // RANDOMIZE
end // initial
`ifdef FIRRTL_AFTER_INITIAL
`FIRRTL_AFTER_INITIAL
`endif
`endif // SYNTHESIS
endmodule
(這個(gè)實(shí)驗(yàn)直接把hello.v文件設(shè)為top文件即可,不需要加其他文件了)
然后依照和上面一樣即可
引腳綁定信息如下:
實(shí)驗(yàn)效果:需要按住key0
六、心得體會(huì)
初次使用chisel,說(shuō)實(shí)話遇到了許多的困難,無(wú)論是軟件安裝還是例子的尋找的遇到了一定的問(wèn)題,最后磕磕絆絆終于完成了本次實(shí)驗(yàn)。
Chisel以Scala為基礎(chǔ),它的抽象級(jí)別高,極大提升了硬件設(shè)計(jì)效率,讓代碼更簡(jiǎn)潔且易于維護(hù)。通過(guò)Chisel,我體驗(yàn)了用近似軟件工程的思維做硬件設(shè)計(jì)的便捷,特別是在模塊化、參數(shù)化設(shè)計(jì)上的優(yōu)勢(shì),這為復(fù)用代碼和快速迭代創(chuàng)造了條件。Chisel結(jié)合Scala的強(qiáng)大生態(tài),使得測(cè)試和驗(yàn)證更加高效,同時(shí)降低了硬件設(shè)計(jì)的學(xué)習(xí)曲線,尤其適合教學(xué)和研究用途。
感謝這些文章
https://blog.csdn.net/weixin_43681766/article/details/124905667
https://blog.csdn.net/zhengwenbang/article/details/108483335