- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
智能机器人行为建模与决策
在本例中发生下面顺序的事件: 等待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)。在仿真过程中,值的确定倚赖于clk、set产生顺序,所以是不可预测的。这是不推荐的建模类型。 always wait (set) begin @( posedge clk) #3 q = 1; #10 q = 0; wait (! set); end 竞争 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 简单D触发器 d q qb 语法:寄存器变量= 定时控制 表达式; 执行过程:求表达式 - 定时控制 - 赋值 举例: reg_a= #10 reg_b; //延时10个单位后,执行赋值。 q= #2 (a b); //求表达式子,延时2个单位后赋值。 与assign语句延时不同,为传输延时。 在延迟赋值语句中表达式的值都有一个隐含的临时存储。可以用来简单精确地模拟寄存器交换和移位。 begin temp= b; @(posedge clk) a = temp; end a = @( posedge clk) b; 等价语句 在下面的每个例子中,a和b的值什么时候被采样?什么时候给a和b赋值? begin a = #5 b; b = #5 a; #10 $diplay(a, b); end fork a = #5 b; b = #5 a; #10 $diplay(a, b); join 在左边的例子中,b的值被立即采样(时刻0),这个值在时刻5赋给a。a的值在时刻5被采样,这个值在时刻10赋给b。 注意,另一个过程块可能在时刻0到时刻5之间影响b的值,或在时刻5到时刻10之间影响a的值。 在右边的例子中,b和a的值被立即采样(时刻0),保存的值在时刻5被赋值给他们各自的目标。这是一个安全传输。注意,另一个过程块可以在时刻0到时刻5之间影响a和b的值。 在仿真行为代码中定义一个命名事件可以触发一个活动。命名事件不可综合。 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块。 阻塞过程赋值执行完成后再执行在顺序块内下一条语句。 非阻塞赋值不阻塞过程流,
文档评论(0)