东莞市网站seo,商丘做网站张,wordpress亚马逊cdn,电动车网站模板本文作为SpinalHDL学习笔记第六十三篇#xff0c;介绍SpinalHDL的函数(Function)。 目录#xff1a;
1.简介(Introduction)
2.RGA到灰度(RGB to grey)
3.Valid和Ready负载总线(Valid Ready Payload bus) ⼀、简介(Introduction)
⽤Scala函数产⽣硬件的⽅式与VHDL/Verilog…本文作为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 * 8h4c);
assign _zz_gray_3 (_zz_gray_4 8);
assign _zz_gray_4 (g * 8h66);
assign _zz_gray_5 (_zz_gray_6 8);
assign _zz_gray_6 (b * 8h4c);
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)
//...
}