当前位置: 首页 > news >正文

Chisel入门初步0

注:以下所有配置在Ubuntu22.04笔记本中运行

chisel模板构建

复制项目模板文件

git clone https://github.com/schoeberl/chisel-examples.git

安装vscode插件Metals
打开顶层目录,并设置为项目文件夹
打开终端输入

tree -L 3		# 查看三层目录结构

得到如下目录结构(helloworld文件夹示例下的结构)

$ tree -L 3
.
├── build.sbt
├── Makefile
├── quartus
│   ├── altde0
│   │   ├── hello.qpf
│   │   └── hello.qsf
│   ├── altde1
│   │   ├── hello.qpf
│   │   └── hello.qsf
│   ├── altde2-115
│   │   ├── hello.qpf
│   │   └── hello.qsf
│   ├── bemicro
│   │   ├── hello.cdf
│   │   ├── hello.qpf
│   │   ├── hello.qsf
│   │   └── hello.sdc
│   ├── bemicro_cv_a9
│   │   ├── hello.cdf
│   │   ├── hello.qpf
│   │   ├── hello.qsf
│   │   └── hello.sdc
│   └── de10-nano
│       ├── hello.cdf
│       ├── hello.qpf
│       └── hello.qsf
├── README.md
├── src
│   ├── main
│   │   └── scala
│   └── test
│       └── scala
├── verilog
│   └── hello_top.v
└── vivado├── arty-a7-100│   ├── Arty-A7-100-Master.xdc│   ├── project.tcl│   └── README.md└── basys3├── Basys-3-Master.xdc├── project.tcl└── README.md16 directories, 27 files

在./src/main目录下定义模块文件
在./src/test目录下编写test测试文件
在./verilog目录下生成相应的Verilog代码

一个简单的chisel案例

在./src/main目录下定义自动售货机的chisel样例

import chisel3._
import chisel3.util._class FSM extends Module{val io = IO(new Bundle{val coin_one    =   Input(Bool())	// 由于均为1bit数据,这里使用的数据类型为布尔类型,等效为 val coin_one = Input(Uint(1.W))val coin_half   =   Input(Bool())val coin_back   =   Output(Bool())val water       =   Output(Bool())})
val s_idle :: s05 :: s10 :: s15 :: s_ok :: Nil = Enum(5)		// 建立状态机列表
val current_state = RegInit(s_idle)								// 定义初态(初始化)// 使用switch函数完成状态机的构建
switch(current_state) {is(s_idle) {when(io.coin_half) {current_state := s05}when(io.coin_one)  {current_state := s10}}is(s05) {when(io.coin_half) {current_state := s10}when(io.coin_one)  {current_state := s15}}is(s10) {when(io.coin_half) {current_state := s15}when(io.coin_one)  {current_state := s_ok}}is(s15) {when(io.coin_half) {current_state := s_ok}when(io.coin_one)  {current_state   :=  s_ok}}is(s_ok) {current_state := s_idle}
}
io.water := (current_state === s_ok)
io.coin_back := (current_state === s15 & io.coin_one === true.B)
}/* An object extending App to generate the Verilog code*/
object FSM extends App {			// 生成相应的Verilog代码
// 这里设置生成Verilog的目录位置(new chisel3.stage.ChiselStage).emitVerilog(new FSM(), Array("--target-dir", "./verilog/FSM"))
}

生成Verilog代码

在主目录下输入

make		# 此处等效于sbt run

选择顶层项目

$ make
sbt run
[info] welcome to sbt 1.9.7 (Private Build Java 17.0.9)
[info] loading settings for project hello-world-build-build from metals.sbt ...
[info] loading project definition from /home/wzm/Graduation Design/task/HyGCN Accelerator/chisel_try_nouse/chisel-examples/hello-world/project/project
[info] loading settings for project hello-world-build from metals.sbt ...
[info] loading project definition from /home/wzm/Graduation Design/task/HyGCN Accelerator/chisel_try_nouse/chisel-examples/hello-world/project
[success] Generated .bloop/hello-world-build.json
[success] Total time: 1 s, completed 2024年1月15日 下午3:15:28
[info] loading settings for project hello-world from build.sbt ...
[info] set current project to hello-world (in build file:/home/wzm/Graduation%20Design/task/HyGCN%20Accelerator/chisel_try_nouse/chisel-examples/hello-world/)Multiple main classes detected. Select one to run:[1] FSM[2] Hello[3] muxEnter number: 1		# 此处进行主项目的选择
[info] running FSM 
[success] Total time: 34 s, completed 2024年1月15日 下午3:16:02

在./verilog目录下查看生成的代码
一共是三个文件
—FSM.V
—FSM.fir
—FSM.anno.json
这里只关心FSM.v
生成代码如下:

module FSM(input   clock,input   reset,input   io_coin_one,input   io_coin_half,output  io_coin_back,output  io_water
);
`ifdef RANDOMIZE_REG_INITreg [31:0] _RAND_0;
`endif // RANDOMIZE_REG_INITreg [2:0] current_state; // @[FSM.scala 12:28]wire [2:0] _GEN_2 = io_coin_half ? 3'h2 : current_state; // @[FSM.scala 12:28 19:{28,43}]wire [2:0] _GEN_4 = io_coin_half ? 3'h3 : current_state; // @[FSM.scala 12:28 23:{28,43}]wire [2:0] _GEN_5 = io_coin_one ? 3'h4 : _GEN_4; // @[FSM.scala 24:{28,43}]wire [2:0] _GEN_6 = io_coin_half ? 3'h4 : current_state; // @[FSM.scala 12:28 27:{28,43}]wire [2:0] _GEN_7 = io_coin_one ? 3'h4 : _GEN_6; // @[FSM.scala 28:28 29:29]wire [2:0] _GEN_8 = 3'h4 == current_state ? 3'h0 : current_state; // @[FSM.scala 13:23 33:23 12:28]wire [2:0] _GEN_9 = 3'h3 == current_state ? _GEN_7 : _GEN_8; // @[FSM.scala 13:23]assign io_coin_back = current_state == 3'h3 & io_coin_one; // @[FSM.scala 37:40]assign io_water = current_state == 3'h4; // @[FSM.scala 36:28]always @(posedge clock) beginif (reset) begin // @[FSM.scala 12:28]current_state <= 3'h0; // @[FSM.scala 12:28]end else if (3'h0 == current_state) begin // @[FSM.scala 13:23]if (io_coin_one) begin // @[FSM.scala 16:28]current_state <= 3'h2; // @[FSM.scala 16:43]end else if (io_coin_half) begin // @[FSM.scala 15:28]current_state <= 3'h1; // @[FSM.scala 15:43]endend else if (3'h1 == current_state) begin // @[FSM.scala 13:23]if (io_coin_one) begin // @[FSM.scala 20:28]current_state <= 3'h3; // @[FSM.scala 20:43]end else begincurrent_state <= _GEN_2;endend else if (3'h2 == current_state) begin // @[FSM.scala 13:23]current_state <= _GEN_5;end else begincurrent_state <= _GEN_9;endend
// 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}};current_state = _RAND_0[2:0];
`endif // RANDOMIZE_REG_INIT`endif // RANDOMIZE
end // initial
`ifdef FIRRTL_AFTER_INITIAL
`FIRRTL_AFTER_INITIAL
`endif
`endif // SYNTHESIS
endmodule
http://www.lryc.cn/news/281030.html

相关文章:

  • MySQL 8.0中移除的功能(一)
  • 可抓取性和可索引性:它们是什么以及如何影响搜索引擎优化
  • Django教程第4章 | Web开发实战-三种验证码实现
  • 深度探讨 Golang 中并发发送 HTTP 请求的最佳技术
  • VUE指令(二)
  • 开源对象存储服务器MinIO本地部署并结合内网穿透实现远程访问管理界面
  • 【TypeScript】tsconfig.json文件到底是干啥的?作用是什么?
  • wagtail的数据模型和渲染
  • OpenHarmony4.0适配LVDS屏幕驱动
  • 【playwright】新一代自动化测试神器playwright+python系列课程01-playwright驱动浏览器
  • POSIX API与网络协议栈
  • 互联网加竞赛 基于卷积神经网络的乳腺癌分类 深度学习 医学图像
  • 腾讯云 IPv6 解决方案
  • Appium 自动化测试
  • 深入浅出Android dmabuf_dump工具
  • Guava RateLimiter预热模型
  • 【搭建个人知识库-3】
  • 如何看待 Linux 内核邮件列表重启将内核中的 C 代码转换为 C++
  • springboot网关添加swagger
  • 代码随想录 Leetcode383. 赎金信
  • 上下左右视频转场模板PR项目工程文件 Vol. 05
  • 【正点原子STM32连载】第三十三章 单通道ADC采集实验 摘自【正点原子】APM32E103最小系统板使用指南
  • Linux系统使用docker部署Geoserver(简单粗暴,复制即用)
  • libcurl使用默认编译的winssl进行https的双向认证
  • MySQL运维实战(3.3) 管理数据库(database)
  • Web3去中心化存储:重新定义云服务
  • 纸尿裤行业调研:预计到2024年提高至68.1%
  • 目标检测数据集 - 行人检测数据集下载「包含VOC、COCO、YOLO三种格式」
  • 重磅!巨匠纺品鉴正式签约“体坛冠军程晨”为品牌形象代言人
  • 亚信安慧AntDB超融合框架——数智化时代数据库管理的新里程碑