SpinalHDL之结构(三)

devtools/2024/10/19 7:36:53/

本文作为SpinalHDL学习笔记第六十三篇,介绍SpinalHDL的函数(Function)

目录:

1.简介(Introduction)

2.RGA到灰度(RGB to grey)

3.Valid和Ready负载总线(Valid Ready Payload bus)

⼀、简介(Introduction)

⽤Scala函数产⽣硬件的⽅式与VHDL/Verilog中非常不同, 原因如下:
◆你可以在他们内部例化寄存器、组合逻辑和模块。
◆你不需要使⽤process/@always模块, 因此也不会限制你对信号声明的范围。
◆所有事情都是通过引⽤传递, 这使得各种操作都便于控制。

例如你可以把总线作为变量传递到函数中, 这样函数就可以在内部读写总线。你也可以返回⼀个模块, ⼀个总线, 或是任何来⾃于Scala世界的东⻄。

⼆、RGA到灰度(RGB to grey)

例如, 如果想要把红/绿/蓝颜⾊通过系数转化为灰度, 可以⽤如下函数来实现:

//输入RGB⾊彩
val r, g, b = UInt(8 bits)
//定义灰度系数乘的函数
def coef(value: UInt, by: Float): UInt = (value * U((255 * by).toInt, 8 bits) >> 8)
//计算灰度
val gray = coef(r, 0.3f) + coef(g, 0.4f) + coef(b, 0.3f)

Verilog:

wire [7:0] _zz_gray;
wire [7:0] _zz_gray_1;
wire [15:0] _zz_gray_2;
wire [7:0] _zz_gray_3;
wire [15:0] _zz_gray_4;
wire [7:0] _zz_gray_5;
wire [15:0] _zz_gray_6;
wire [7:0] r;
wire [7:0] g;
wire [7:0] b;
wire [7:0] gray;
assign _zz_gray = (_zz_gray_1 + _zz_gray_3);
assign _zz_gray_1 = (_zz_gray_2 >>> 8);
assign _zz_gray_2 = (r * 8'h4c);
assign _zz_gray_3 = (_zz_gray_4 >>> 8);
assign _zz_gray_4 = (g * 8'h66);
assign _zz_gray_5 = (_zz_gray_6 >>> 8);
assign _zz_gray_6 = (b * 8'h4c);
assign gray = (_zz_gray + _zz_gray_5);

三、Valid和Ready负载总线(Valid Ready Payload bus)

例如, 如果你⽤valid, ready和payload信号定义了⼀条简单的总线, 你可以在其中定义⼀些常⽤的函数。

case class MyBus(payloadWidth: Int) extends Bundle with IMasterSlave {
val valid = Bool()
val ready = Bool()
val payload = Bits(payloadWidth bits)
//在master模式中定义数据的⽅向
override def asMaster(): Unit = {
out(valid, payload)
in(ready)
}
//把that链接到this上
def <<(that: MyBus): Unit = {
this.valid := that.valid
that.ready := this.ready
this.payload := that.payload
}
//把this连接到FIFO的输入, 返回FIFO的输出
def queue(size: Int): MyBus = {
val fifo = new MyBusFifo(payloadWidth, size)
fifo.io.push << this
return fifo.io.pop
}
}
class MyBusFifo(payloadWidth: Int, depth: Int) extends Component {
val io = new Bundle {
val push = slave(MyBus(payloadWidth))
val pop = master(MyBus(payloadWidth))
}
val mem = Mem(Bits(payloadWidth bits), depth)
//...
}


http://www.ppmy.cn/devtools/117775.html

相关文章

Qt 每日面试题 -4

31、继承与派生的区别? 角度不同 继承是从子类的角度讲的&#xff0c;派生是从基类的角度讲的。 定义不同 派生指江河的源头产生出支流。引申为从一个主要事物的发展中分化出来。继承是面向对象软件技术当中的一个概念&#xff0c;与多态、抽象共为面向对象的三个基本特征。继…

NLP-transformer学习:(7)evaluate实践

NLP-transformer学习&#xff1a;&#xff08;7&#xff09;evaluate 使用方法 打好基础&#xff0c;为了后面学习走得更远。 本章节是单独的 NLP-transformer学习 章节&#xff0c;主要实践了evaluate。同时&#xff0c;最近将学习代码传到&#xff1a;https://github.com/Mex…

计算机毕业设计 奖学金评定管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

MySQL数据库迁移与备份实录

这里写目录标题 事情起因的概述查看磁盘空间使用情况为了进一步的明确宕机原因&#xff0c;查看MySQL日志信息进一步排查 如何针对磁盘空间不足进行挂载区域的修改以及数据的迁移与备份分析与梳理如何修改MySQL数据卷的挂载位置停止MySQL服务备份 MySQL 配置文件迁移 MySQL 数据…

使用lodash库实现防抖和节流

在 JavaScript 中&#xff0c;lodash 是一个非常流行的实用工具库&#xff0c;提供了许多常用的函数&#xff0c;其中就包括防抖和节流的实现。lodash 提供的 debounce 和 throttle 函数可以让我们更方便地实现这两种功能。 1. 使用 lodash 的 debounce&#xff08;防抖&#…

在Java中,有没有其他方式可以替代List<Map<String,Object>>来存储和处理数据?

在Java中&#xff0c;有多种方式可以替代List<Map<String, Object>>来存储和处理数据。选择哪种方式取决于你的具体需求&#xff0c;比如数据结构的复杂性、类型安全、性能要求等。以下是一些常见的替代方案&#xff1a; 自定义类&#xff08;POJOs&#xff09;&am…

Java 编码系列:线程基础与最佳实践

引言 在多任务处理和并发编程中&#xff0c;线程是不可或缺的一部分。Java 提供了丰富的线程管理和并发控制机制&#xff0c;使得开发者可以轻松地实现多线程应用。本文将深入探讨 Java 线程的基础知识&#xff0c;包括 Thread 类、Runnable 接口、Callable 接口以及线程的生命…

《经典图论算法》约翰逊算法(Johnson)

摘要&#xff1a; 1&#xff0c;约翰逊算法的介绍 2&#xff0c;约翰逊算法的实现步骤 3&#xff0c;约翰逊算法的准确性验证 4&#xff0c;约翰逊算法的代码实现 1&#xff0c;约翰逊算法的介绍 约翰逊算法(Johnson algorithm)是在稀疏图上求每对顶点之间最短路径的一种算法&a…