SpinalHDL之结构(二)

本文作为SpinalHDL学习笔记第六十二篇,介绍SpinalHDL的区域(Area)

有时, ⽤Component定义逻辑可能是致命的, 因为:
需要定义所有的⽣成器参数和IO(冗⻓的, 重复的)
分隔你的代码

在这种时候你可以⽤Area来定义⼀组信号/逻辑:

Scala 复制代码
class UartCtrl extends Component {
...
val timer = new Area {
val counter = Reg(UInt(8 bits))
val tick = counter === 0
counter := counter - 1
when(tick) {
counter := 100
}
}
val tickCounter = new Area {
val value = Reg(UInt(3 bits))
val reset = False
when(time.tick) { //参考timer区域的tick
value := value + 1
}
when(reset) {
value := 0
}
}
val stateMachine = new Area {
...
}
}

Verilog:

Scala 复制代码
UartCtrl myUart (
.clk (clk ), //i
.reset (reset) //i
);
module UartCtrl (
input clk,
input reset
);
reg [7:0] timer_counter;
wire timer_tick;
reg [2:0] tickCounter_value;
wire tickCounter_reset;
assign timer_tick = (timer_counter == 8'h0);
assign tickCounter_reset = 1'b0;
always @(posedge clk) begin
timer_counter <= (timer_counter - 8'h01);
if(timer_tick) begin
timer_counter <= 8'h64;
end
if(timer_tick) begin
tickCounter_value <= (tickCounter_value + 3'b001);
end
if(tickCounter_reset) begin
tickCounter_value <= 3'b000;
end
end
endmodule

**Note:**在VHDL和Verilog中, 有时候前缀可以⽤来把变量拆分成逻辑块, 在SpinalHDL中可以⽤Area实现。
**Note:**ClockingArea是⼀种特殊的Area允许你⽤给定的ClockDomain定义⼀块硬件电路。

相关推荐
runnerdancer12 分钟前
Agent如何加载执行Skill的脚本
前端·agent
yingyima34 分钟前
VS Code 正则替换技巧:从凌晨3点的服务器报警开始
前端
默_笙40 分钟前
🛬 我让 AI 帮我写了一个打飞机游戏,结果 Canvas 把我整不会了
前端·javascript
梯度不陡40 分钟前
AI 到底能不能从零写软件?ProgramBench 和 RepoZero 给出了两种答案
前端·javascript·面试
冬奇Lab1 小时前
每日一个开源项目(第137篇):Penpot - 真正开源的设计协作工具,SVG 原生格式消灭设计-开发鸿沟
前端·开源·设计
nuIl1 小时前
实现一个 Coding Agent(7):Skills
前端·agent·cursor
nuIl1 小时前
实现一个 Coding Agent(8):会话持久化与多会话
前端·agent·cursor
jt君424262 小时前
React Native JSI 深入剖析 — 第 5 部分中文技术整理:用 HostObject 把 C++ 类暴露给 JavaScript
前端·react native
胡萝卜术2 小时前
滑动窗口最大值:从暴力到单调队列,层层优化全解析
前端·javascript·面试
fluffyox2 小时前
Notion 的公式栏里,藏着一台虚拟机——逆向 + 用 600 行 JS 复刻它的编译器与栈式 VM
前端