基于Chisel的FPGA流水灯设计
Chisel流水灯
- 一、Chisel
- (一)什么是Chisel
- (二)Chisel能做什么
- (三)Chisel的使用
- (四)Chisel的优缺点
- 1.优点
- 2.缺点
- 二、流水灯设计
一、Chisel
(一)什么是Chisel
Chisel是一种基于Scala的硬件构造语言,它允许设计者使用高级的编程概念来构建硬件。Chisel的设计哲学是“不要重复自己”(DRY),这意味着它鼓励设计者通过参数化和模块化来重用代码。
(二)Chisel能做什么
在硬件设计领域,传统的硬件描述语言(如Verilog和VHDL)虽然功能强大,但它们通常比较底层,需要设计者关注很多细节。这不仅增加了设计的复杂性,也容易引入错误。而Chisel语言提供了一种更高层次的抽象,使得设计者可以专注于硬件的功能和行为,而不是具体的实现细节。
(三)Chisel的使用
- 定义模块:
在Chisel中,硬件模块被定义为Scala的类或对象,这些类或对象可以包含端口(IO)和内部逻辑。 - 构建行为:
Chisel使用Scala的表达式来定义硬件的行为。例如,可以使用条件语句和循环来实现控制逻辑。 - 参数化设计:
Chisel支持参数化设计,这意味着可以通过参数来定义模块的大小和功能,从而创建可重用的硬件组件。 - 生成硬件:
在Chisel提中使用generateVerilog等工具来将高级的Chisel代码转换成传统的硬件描述语言。
(四)Chisel的优缺点
1.优点
- 硬件构建语言:
Chisel专注于硬件设计,提供了专门的语法和功能来构建硬件。
- 内嵌于Scala:
由于Chisel是Scala的一个特定领域语言,它能够利用Scala的高级特性,如面向对象编程、函数式编程等。
- 高度参数化:
Chisel支持使用Scala的元编程来创建高度参数化的硬件设计,这有助于代码复用和设计灵活性。
- 代码复用:
Chisel支持端口的嵌套、继承和重载,这使得端口代码复用变得高效,减少了定义和连接端口的工作量。
- 设计参数化:
Chisel的设计参数化特性允许设计者创建可配置和可重用的硬件模块。
- 编译器结构:
Chisel是硬件编译器框架的一部分,类似于LLVM在软件编译中的应用,这使得前后端解耦,允许编写其他前后端,并利用现有的中端优化和后端。
- 自动化特化/转换:
Chisel的编译器结构允许电路的自动化特化和转换,例如将电路转换为FPGA优化版本,提高运行速度。
2.缺点
- 学习曲线:
对于习惯于使用传统硬件描述语言(如Verilog和VHDL)的工程师来说,Chisel可能有一个陡峭的学习曲线,因为它需要掌握Scala语言和Chisel特定的语法。
- 社区和工具支持:
虽然Chisel正在获得越来越多的关注,但与Verilog和VHDL等成熟的硬件描述语言相比,它的社区和工具支持可能还不够广泛。
- 不支持某些结构:
Chisel可能不支持Verilog中的所有结构,例如模拟元素,尽管它提供了通过Verilog黑匣子的逃生舱口来解决这个问题。
- 普及度:
Chisel作为一种相对较新的语言,可能还没有在工业界得到广泛的普及和应用,这可能会影响到它的接受度和使用。
二、流水灯设计
先搭建好环境:chisel开发环境搭建(intellij)
built.sbt
name := "untitled2"version := "0.1"scalaVersion := "2.11.10"
scalacOptions += "-Xsource:2.11"libraryDependencies ++= Seq("edu.berkeley.cs" %% "chisel3" % "3.1.2","edu.berkeley.cs" %% "chisel-iotesters" % "1.2.3","org.scalatest" %% "scalatest" % "3.0.5" % "test"
)
FlowingLED.scala
package flowing_ledimport chisel3._
import chisel3.util._class FlowingLED extends Module {val io = IO(new Bundle {val led = Output(UInt(18.W))})// 计数器生成函数def genCounter(n: UInt): UInt = {val cntReg = RegInit(0.U(32.W))cntReg := Mux(cntReg === n - 1.U, 0.U, cntReg + 1.U)cntReg}val TIME_0_1S = 5000000.Uval count = genCounter(TIME_0_1S)val shiftReg = Reg(UInt(18.W)) // 初始化寄存器为0,位宽为18// 移位逻辑when(!reset.toBool()){shiftReg := 0.U // 复位时初始化为0}.otherwise {when(count === (TIME_0_1S - 1.U)) {shiftReg := Cat(shiftReg(16, 0), ~shiftReg(17)) // 移位操作}}io.led := shiftReg
}
FlowingLEDNew.
package flowing_ledimport chisel3.Driverobject FlowingLEDNew extends App {val targetDir = "output_FlowingLED"Driver.execute(Array("--target-dir", targetDir), () => new FlowingLED())
}

点击运行文件

用Quartus新建工程,添加FlowingLED.v
因对chisel还不是很熟悉,由chisel生成的verilog中有些错误,
所以需将
always @(posedge clock) beginif (reset) begin改为
always @(posedge clock) beginif (!reset) begin
再加入测试文件
flowing_led_tb
`timescale 1ns / 1psmodule flowing_led_tb;// 测试平台的输入输出定义reg clock; // 时钟信号reg reset; // 复位信号wire [17:0] io_led; // LED 输出// 实例化被测试模块FlowingLED uut (.clock(clock),.reset(reset),.io_led(io_led));// 时钟信号生成always #10 clock = ~clock; // 产生一个周期为20ns的时钟信号,即50MHz// 测试过程initial begin// 初始化输入信号clock = 0;reset = 0;#100;reset = 1; // 初始复位信号设为高// 等待一个时钟周期以稳定复位状态#1000000;// 释放复位信号reset = 0;// 等待一段时间观察 LED 的变化#100; // 等待1000ns,观察流水灯的初始状态// 结束仿真end// 监视信号initial begin$monitor("Time=%t, reset=%b, count=%d, io_led=%b, _T_28=%b, _T_24=%b, _GEN_2=%d",$time, reset, uut.count, io_led, uut._T_28, uut._T_24, uut._GEN_2);endendmodule
为方便测试可以将生成的count和GEN2改小一点:
assign _T_9 = count == 32'h10; // @[FlowingLED.scala 26:26:@9.4]assign _GEN_2 = 32'h9;// @[FlowingLED.scala 15:17:@24.6]
编译运行一下
打开Modelsim进行仿真
先运行
vlog 自己的路径:/Flowing_led_tb.v
vsim water_led_tb
在运行run -all
可以得到仿真结果:


也可以看仿真出来的图

相关文章:
基于Chisel的FPGA流水灯设计
Chisel流水灯 一、Chisel(一)什么是Chisel(二)Chisel能做什么(三)Chisel的使用(四)Chisel的优缺点1.优点2.缺点 二、流水灯设计 一、Chisel (一)什么是Chise…...
LabVIEW齿轮调制故障检测系统
LabVIEW齿轮调制故障检测系统 概述 开发了一种基于LabVIEW平台的齿轮调制故障检测系统,实现齿轮在恶劣工作条件下的故障振动信号的实时在线检测。系统利用LabVIEW的强大图形编程能力,结合Hilbert包络解调技术,对齿轮的振动信号进行精确分析…...
AI帮写:探索国内AI写作工具的创新与实用性
随着AI技术的快速发展,AI写作正成为创作的新风口。但是面对GPT-4这样的国际巨头,国内很多小伙伴往往望而却步,究其原因,就是它的使用门槛高,还有成本的考量。 不过,随着GPT技术的火热,国内也涌…...
n后问题 回溯笔记
问题描述 在nn格的棋盘上放置彼此不受攻击的n个皇后。 按照国际象棋的规则,皇后可以攻击与之处在同 一行或同一列或同一斜线上的棋子。n后问题等价于在nn格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。 代码 import java.uti…...
简述Java中实现Socket通信的步骤
在Java中,实现Socket通信通常涉及客户端和服务器端两个角色。以下是它们各自的基本步骤: 服务器端(Server) 创建ServerSocket对象: 在服务器端,首先需要创建一个ServerSocket对象。这个对象会监听来自客户…...
Asp.Net Core 实现分片下载的最简单方式
技术群里的朋友遇到了这个问题,起初的原因是他对文件增加了一个属性配置 fileResult.EnableRangeProcessing true;这个属性我从未遇到过,然后,去F1查看这个属性的描述信息也依然少的可怜,只有简单的描述为(获取或设置为 启用范围…...
[Mac软件]Leech for Mac v3.2 - 轻量级mac下载工具
黑果魏叔推荐Leech是由Many Tricks开发的适用于Mac OS X的轻量级且功能强大的下载管理器。 Leech让您完全控制下载,并与浏览器完全集成。您可以将下载排队,暂停和恢复,从受密码保护的服务器下载,并将密码存储在系统范围的安全钥匙…...
留给“端侧大模型”的时间不多了
端侧大模型(Edge AI models),也就是只在设备本地(如智能手机、IoT设备、嵌入式系统等)运行的大模型,过去一两年来非常流行。 具体表现在,终端设备厂商,如苹果、荣耀、小米、OV等&…...
Pytest框架中的Setup和Teardown功能
在 pytest 测试框架中,setup 和 teardown是用于在每个测试函数之前和之后执行设置和清理的动作,而pytest 实际上并没有内置的 setup 和 teardown 函数,而是使用了一些装饰器或钩子函数来实现类似的功能。 学习目录 钩子函数(Hook…...
yolov10/v8 loss详解
v10出了就想看看它的loss设计有什么不同,看下来由于v8和v10的loss部分基本一致就放一起了。 v10的论文笔记,还没看的可以看看,初步尝试耗时确实有提升 好记性不如烂笔头,还是得记录一下,以免忘了,废话结束…...
Typescript高级: 深入理解infer关键字
概述 在 TS 中,infer 是一个高级类型操作,特别是条件类型和映射类型中非常有用的关键字它在泛型中使用也会是一个强大工具,增强了类型推断的能力,让开发者更灵活地处理和操作类型它允许在泛型类型推导过程中捕获一个具体的类型&a…...
JQC-3FF-S-Z 继电器模块使用(arduino)
前言 继电器模块可以控制电流的接通和非接通状态,和开关一样。实际上是用小电流去控制大电流运作的一种“自动开关” 本文只是简单使用继电器模块做一个 led 点亮和熄灭的案例,结合案例可以和 nodemcu 等板子结合做出远程控制开关。 材料准备 杜邦线…...
黑马一站制造数仓实战2
问题 DG连接问题 原理:JDBC:用Java代码连接数据库 Hive/SparkSQL:端口有区别 可以为同一个端口,只要不在同一台机器 项目:一台机器 HiveServer:10000 hiveserver.port 10000 SparkSQL:10001…...
网络I/O模型
网络I/O模型 同步I/O阻塞I/O非阻塞I/OI/O多路复用select函数接口示例 poll函数接口示例 poll 和 select 的区别epoll原理:示例 异步I/O 同步I/O 阻塞I/O 一个基本的C/S模型如下图所图:其中 listen()、connect()、write()、read() 都是阻塞I/O࿰…...
Docker 简介和安装
目录 Docker 是什么 跟普通虚拟机的对比 打包、分发、部署 Docker 部署的优势 Docker 通常用来做什么 重要概念:镜像、容器 安装 镜像加速源 Docker 是什么 Docker 是一个应用打包、分发、部署的工具 你也可以把它理解为一个轻量的虚拟机,它只虚…...
【源码】Spring Data JPA原理解析之Repository自定义方法命名规则执行原理(二)
Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 4、Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作 5、Spring Data JPA自定…...
Vue前端中从后端获取图片验证码
前端发送请求 <template><el-form :model"user" :rules"rules" ref"userForm" class"login" label-width"auto" style"max-width: 600px"><el-form-item label"用户名" prop"name…...
【源码】多语言H5聊天室/thinkphp多国语言即时通讯/H5聊天室源码/在线聊天/全开源
多语言聊天室系统,可当即时通讯用,系统默认无需注册即可进入群聊天,全开源 【海外聊天室】多语言H5聊天室/thinkphp多国语言即时通讯/H5聊天室源码/在线聊天/全开源 - 吾爱资源网...
gitlab 创建 ssh 和 token
文章目录 一、创建ssh key二、将密钥内容复制到gitlab三、创建token 一、创建ssh key 打开控制台cmd,执行命令 ssh-keygen -t rsa -C xxxxx xxxxx是你自己的邮箱 C:\Users\xx\.ssh 目录下会创建一个名为id_rsa.pub的文件,用记事本打开,并…...
Docker - Kafka
博文目录 文章目录 说明命令 说明 Docker Hub - bitnami/kafka Docker Hub - apache/kafka Kafka QuickStart Kafka 目前没有 Docker 官方镜像, 目前拉取次数最多的是 bitnami/kafka, Apache 提供的是 apache/kafka (更新最及时), 本文使用 bitnami/kafka bitnami/kafka 镜像…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
