微信公众号获取更多FPGA相关源码:
1. 命名事件(named event)
在行为代码中定义一个命名事件可以触发一个活动。命名事件不可综合。
module add_mult (out, a, b);
input [2: 0] a, b;
output [3: 0] out;
reg [3: 0] out;
//***define events***
event add, mult;
always@ (a or b)
if (a> b)
-> add; // *** trigger event ***
else
-> mult; // *** trigger event ***
// *** respond to an event trigger ***
always @( add)
out = a + b;
// *** respond to an event trigger ***
always @( mult)
out = a * b;
endmodule
在例子中,事件add和mult不是端口,但定义为事件,它们没有对应的硬件实现。
- 是一种数据类型,能在过程块中触发一个使能。
- 在引用前必须声明
- 没有持续时间,也不具有任何值
- 只能在过程块中触发一个事件。
- ->操作符用来触发命名事件。
- a大于b,事件add被触发,控制传递到等待add的always块。
- 如果a小于或等于b,事件mult被触发,控制被传送到等待mult的always块。
2.行为描述举例
always wait (set)
begin
@( posedge clk) #3 q = 1;
#10 q = 0;
wait (! set);
end
在上面的例子中发生下面顺序的事件:
- 等待set=1,忽略时刻10的clk的posedge。
- 等待下一个clk的posedge,它将在时刻30发生。
- 等待3个时间单位,在时刻33(30+3)置q=1。
- 等待10个时间单位,在时刻43(33+10)置q=0。
- 等待在时刻48发生的set=0。
- 等待在时刻70发生且与clk的上升沿同时发生的set=1。
- 等待下一个上升沿。时刻70的边沿被忽略,因为到达该语句时时间已经过去了,如例子所示,clk=1。
重要内容:在实际硬件设计中,事件6应该被视为一个竞争(race condition)。在仿真过程中,值的确定倚赖于顺序,所以是不可预测的。这是不推荐的建模类型。
3.RTL描述举例
下面的RTL例子中只使用单个边沿敏感时序控制。
module dff (q, qb, d, clk);
output q, qb;
input d, clk;
reg q, qb;
always @( posedge clk)
begin
q = d;
qb = ~d;
end
endmodule
微信公众号获取更多FPGA相关源码: