基于Chisel的FPGA流水灯设计

Chisel流水灯

  • 一、Chisel
    • (一)什么是Chisel
    • (二)Chisel能做什么
    • (三)Chisel的使用
    • (四)Chisel的优缺点
      • 1.优点
      • 2.缺点
  • 二、流水灯设计

一、Chisel

(一)什么是Chisel

Chisel是一种基于Scala的硬件构造语言,它允许设计者使用高级的编程概念来构建硬件。Chisel的设计哲学是“不要重复自己”(DRY),这意味着它鼓励设计者通过参数化和模块化来重用代码。

(二)Chisel能做什么

在硬件设计领域,传统的硬件描述语言(如Verilog和VHDL)虽然功能强大,但它们通常比较底层,需要设计者关注很多细节。这不仅增加了设计的复杂性,也容易引入错误。而Chisel语言提供了一种更高层次的抽象,使得设计者可以专注于硬件的功能和行为,而不是具体的实现细节。

(三)Chisel的使用

  1. 定义模块:
    在Chisel中,硬件模块被定义为Scala的类或对象,这些类或对象可以包含端口(IO)和内部逻辑。
  2. 构建行为:
    Chisel使用Scala的表达式来定义硬件的行为。例如,可以使用条件语句和循环来实现控制逻辑。
  3. 参数化设计:
    Chisel支持参数化设计,这意味着可以通过参数来定义模块的大小和功能,从而创建可重用的硬件组件。
  4. 生成硬件:
    在Chisel提中使用generateVerilog等工具来将高级的Chisel代码转换成传统的硬件描述语言。

(四)Chisel的优缺点

1.优点

  1. 硬件构建语言:

Chisel专注于硬件设计,提供了专门的语法和功能来构建硬件。

  1. 内嵌于Scala:

由于Chisel是Scala的一个特定领域语言,它能够利用Scala的高级特性,如面向对象编程、函数式编程等。

  1. 高度参数化:

Chisel支持使用Scala的元编程来创建高度参数化的硬件设计,这有助于代码复用和设计灵活性。

  1. 代码复用:

Chisel支持端口的嵌套、继承和重载,这使得端口代码复用变得高效,减少了定义和连接端口的工作量。

  1. 设计参数化:

Chisel的设计参数化特性允许设计者创建可配置和可重用的硬件模块。

  1. 编译器结构:

Chisel是硬件编译器框架的一部分,类似于LLVM在软件编译中的应用,这使得前后端解耦,允许编写其他前后端,并利用现有的中端优化和后端。

  1. 自动化特化/转换:

Chisel的编译器结构允许电路的自动化特化和转换,例如将电路转换为FPGA优化版本,提高运行速度。

2.缺点

  1. 学习曲线:

对于习惯于使用传统硬件描述语言(如Verilog和VHDL)的工程师来说,Chisel可能有一个陡峭的学习曲线,因为它需要掌握Scala语言和Chisel特定的语法。

  1. 社区和工具支持:

虽然Chisel正在获得越来越多的关注,但与Verilog和VHDL等成熟的硬件描述语言相比,它的社区和工具支持可能还不够广泛。

  1. 不支持某些结构:

Chisel可能不支持Verilog中的所有结构,例如模拟元素,尽管它提供了通过Verilog黑匣子的逃生舱口来解决这个问题。

  1. 普及度:

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
可以得到仿真结果:
在这里插入图片描述
在这里插入图片描述
也可以看仿真出来的图在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/846181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp 怎么设置凸起的底部tabbar

1. uniapp 怎么设置凸起的底部tabbar 1.1. 方案一系统提供 1.1.1. 使用uniapp官方提供的属性midButton 使用时,list数组须为偶数 (1)pages.json "tabBar": {"custom": true,"color": "#8F8F94",&q…

C语言 入门例子和代码学习

下面提供一些C语言的入门示例代码&#xff0c;并附有注释&#xff0c;以帮助理解每个部分的功能。 1. Hello World程序 #include <stdio.h> // 引入标准输入输出库 int main() { // 主函数的开始 printf("Hello, World!\n"); // 打印 "Hello, Wo…

HTML的标签(标题、段落、文本、图片、列表)

HTML的标签1 标题标签&#xff1a;段落标签&#xff1a;文本标签&#xff1a;图片标签:列表标签&#xff1a;有序列表&#xff1a;无序列表&#xff1a;定义列表&#xff1a;列表案例&#xff1a; 标题标签&#xff1a; 标签&#xff1a;h1~h6 注意&#xff1a;如果使用无效标…

运维相关知识

一、运维需要关注 服务器的哪些数据&#xff1f; 1. CPU 1.1 CPU使用率&#xff1a; top&#xff0c;vmstat (1) 用户CPU使用率&#xff1a;用户态程序的使用率。top 命令 us 字段和 nice字段 (低优先级) (2) 系统CPU使用率&#xff1a;内核态程序的使用率。top 命令 sy 字…

【前端每日基础】day32——节流和防抖

节流&#xff08;Throttle&#xff09;和防抖&#xff08;Debounce&#xff09;是两个在前端开发中常用的技术&#xff0c;它们用于控制某些函数的执行频率&#xff0c;以提升性能和用户体验。虽然两者的目标相似&#xff0c;但实现方式和适用场景有所不同。 一、节流&#xf…

【安规介绍】

文章目录 一、基础知识安规上的六类危险的防护&#xff1a;安全电压漏电流接触电流能量问题&#xff1a;火灾问题&#xff1a;热问题结构问题阻燃等级绝缘等级&#xff1a;对接地系统的要求&#xff1a;结构要求:电气要求&#xff1a; 二、设计的关键电气绝缘距离电气爬电距离:…

Python 关于加密和解密

1、理解 加密是通过使用各种加密算法来对数据进行加密和解密的过程。Python 提供了许多内置库和第三方库&#xff0c;可以用于实现各种加密算法和技术&#xff0c;包括对称加密、非对称加密、哈希函数等。以下是 Python 中常用的一些加密相关的库和模块&#xff1a; hashlib …

Python知识点14---被规定的资源

提前说一点&#xff1a;如果你是专注于Python开发&#xff0c;那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了&#xff0c;而如果你和作者一样只是操作其他技术的Python API那就足够了。 在Python中被规定的东西不止有常识中的那些关键字、构造器等编程语言…

Python知识点4---循环语句

提前说一点&#xff1a;如果你是专注于Python开发&#xff0c;那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了&#xff0c;而如果你和作者一样只是操作其他技术的Python API那就足够了。 Python支持两种循环for和while&#xff0c;但是他们和其他的语言有些…

乡村振兴与农村环境整治:加强农村环境治理,改善农村人居环境,打造干净整洁、生态宜居的美丽乡村

目录 一、引言 二、农村环境整治的重要性 1、提升农民生活质量 2、促进农村经济发展 3、保护农村生态环境 三、当前农村环境面临的问题 1、垃圾处理不当 2、污水处理设施缺乏 3、农业面源污染严重 四、加强农村环境治理的措施 1、完善农村垃圾处理体系 2、加强农村…

14.Ollydbg的基本使用

上一个内容&#xff1a;13.优化界面化的游戏辅助 Ollydbg是一个调试工具&#xff0c;它可以一步一步的运行一个程序并且还能很直观的看到被调试程序的寄存器状态、栈状态。Ollydbg需要以管理员方式运行&#xff01; 下图附加程序是调试一个正在运行的进程&#xff1a; 点击了…

STM32F103借助ESP8266连接网络

ESP8266配置 STM32F103本身是不具备联网功能的&#xff0c;所以我们必须借助其他单片机来进行联网&#xff0c;然后让STM32与联网单片机通信&#xff0c;就可以实现STM32联网了。 本文借助的是ESP8266模块&#xff0c;其通过UART协议与STM32通信&#xff08;http://t.csdnimg.c…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《考虑动态定价的新能源汽车能源站优化运行》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Nacos-SpringBoot-配置中心

Nacos配置中心 前情回顾 上一章呢 了解并且学习了Nacos服务注册与发现 在一系列破防中走了出来Nacos服务注册完成https://blog.csdn.net/m0_68711597/article/details/139265244?spm1001.2014.3001.5502 本以为接下来会一帆风顺 一马平川 没想刚出坑 又入坑 Nacos的配置…

Prime1 - 信息收集和分析能力的试炼

主机发现 nmap扫描与分析 端口22、80 详细扫描&#xff1b;linux、ubuntu、 udp扫描 端口都是关闭的 脚本扫描 web渗透 打开只有一张图片&#xff1b;源码有图片和一个alt&#xff1a;hnp security不知道有啥用&#xff0c;先记录下来吧 继续web渗透思路走吧&#xff0c;目录…

[Python]用Qt6和Pillow实现截图小工具

本文章主要讲述的内容是&#xff0c;使用python语言借助PyQt6和Pillow库进行简单截图工具的开发&#xff0c;含义一个简单的范围裁剪和软件界面。 主要解决的问题是&#xff0c;在高DPI显示屏下&#xff0c;坐标点的偏差导致QWidget显示图片不全、剪裁范围偏差问题。 适合有一点…

vivado BD_ADDR_SEG

按字母顺序排列的一类对象列表 BD_ADDR_SEG 描述 地址段或bd_addr_seg对象描述一个范围的位置和大小记忆力它们有一个范围&#xff08;大小&#xff09;和一个可选的起始偏移。对于各种内存映射的主接口和从接口&#xff0c;IP集成商遵循行业用于捕获存储器要求和能力的标准IP-…

爬楼梯 - LeetCode 热题 81

大家好&#xff01;我是曾续缘&#x1f607; 今天是《LeetCode 热题 100》系列 发车第 81 天 动态规划第 1 题 ❤️点赞 &#x1f44d; 收藏 ⭐再看&#xff0c;养成习惯 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法…

Android Kotlin 打开相册选择图片(多选)

1. 核心代码 打开系统相册功能&#xff0c;本代码使用两种方式打开本地相册&#xff0c;startActivityForResult 已经废弃&#xff0c;可以使用新的方式。 package com.example.facedetectordemoimport android.content.pm.PackageManager import androidx.appcompat.app.App…

【人工智能004】文本挖掘算法模型实战及经验总结(最近更新中)

1.熟悉、梳理、总结数据分析实战中的文本挖掘领域实战研发知识体系&#xff0c;这块领域很大&#xff0c;需要耗费很多精力&#xff0c;逐步总结、更新到位&#xff0c;&#xff0c;&#xff0c; 2.欢迎点赞、关注、批评、指正&#xff0c;互三走起来&#xff0c;小手动起来&am…