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

SpinalHDL之结构(三)

本文作为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.kler.cn/news/314862.html

相关文章:

  • JavaScript高级—— js 是单线程运行的
  • 无人机+自组网:中继通信增强技术详解
  • 论文解读《MmAP : Multi-Modal Alignment Prompt for Cross-Domain Multi-Task Learning》
  • C#开发基础之单例模式下的集合数据,解决并发访问读写冲突的问题
  • PostgreSQL常用表操作SQL脚本整理
  • java重点学习-JVM类加载器+垃圾回收
  • 从一到无穷大 #35 Velox Parquet Reader 能力边界
  • 计算机基础知识笔记
  • 基于协同过滤+python+django+vue的音乐推荐系统
  • 鸿蒙Harmony-Next 徒手撸一个日历控件
  • Qt中样式表常用的属性名称定义
  • 利用Python与Ansible实现高效网络配置管理
  • 【Harmony】轮播图特效,持续更新中。。。。
  • Ubuntu24.04 安装ssh开启22端口及允许root用户远程登录
  • 【Flink实战】flink消费http数据并将数组展开多行
  • linux-虚拟化与容器化-虚拟化
  • 无法删除选定的端口,不支持请求【笔记】
  • Java流程控制语句——跳转语句详解:break 与 continue 有什么区别?
  • Go 并发模式:管道的妙用
  • biopython解析mmcif文件得到组装体、链、序列、原子坐标、变换矩阵等信息
  • 统信服务器操作系统【1050e版】安装手册
  • 十个服务器中毒的常见特征及其检测方法
  • elasticsearch学习与实战应用
  • 音视频生态下Unity3D和虚幻引擎(Unreal Engine)的区别
  • T4—猴痘识别
  • Qwen2-VL的微调及量化
  • React【1】【ref常用法】
  • 小程序地图展示poi帖子点击可跳转
  • 20240921在友善之臂的NanoPC-T6开发板上使用Rockchip原厂的Android12适配宸芯的数传模块CX6602N
  • 【监控】【Nginx】使用 ELK Stack 监控 Nginx