- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
(2)同步置位与清零 对于同步置位与清零的触发器,其置位和清零信号是在时钟信号的有效沿发挥作用的,描述这些触发器的always块的敏感信号只有时钟,但是在块内总是首先检查置位和清零信号。对于高电平置位清零的同步触发器,有如下格式: always @ ( posedge clk) //敏感信号表中只有时钟沿 begin if (reset) begin /* 触发器清零*/ end else if (set) begin /* 触发器置位*/ end else begin /* 时钟逻辑*/ end end 9.7 Verilog HDL语言描述状态机 Verilog HDL中常用always块和case语句描述状态机。状态机描述一般可分为次态逻辑、输出逻辑和状态寄存器三部分。 1.状态机描述 ① Verilog中需要定义寄存器变量,并进行状态编码。 定义寄存器变量分现态与次态,例如: reg [1:0] state,next_state; //定义位宽为2的寄存器信号state和next_state 使用参数语句定义状态编码,例如: parameter s0 = 2‘b00,s1 = 2’b01, s2 = 2‘b10, s3 = 2’b11;//只能用1个参数语句定义状态编码 ② 使用always语句描述状态寄存器的状态转换,例如: always @ (posedge clk) //描述状态寄存器的always块,在时钟的上升沿 begin state =next_state; end //实现从现态到次态的状态转换 ③ 使用always语句、case语句描述次态逻辑。 ④ 使用always语句或是连续赋值语句assign描述输出。 ⑤ 或者使用always语句、case语句描述输出与次态逻辑,先描述输出,再描述次态逻辑。 2.Verilog HDL描述状态机时应该注意的约定 ① 每一个模块只描述一个状态机。 ② 在组合always块的顶部(case语句前)可给出次态的初始值,还可给输出赋初值。一旦在case语句前给输出赋初值,则在各状态下,可只对不同于初值的输出赋值。 若是输出未赋过初值,则应该在各状态对所有输出信号赋值。若只对部分输出信号赋值,则在仿真时,有些状态下输出信号为任意值。 ③ 状态转移描述,要把向其他状态转移的条件与保持在自己状态的条件同时写清楚。 ④ 一般情况下,还应该给状态机设置一个异步或是同步复位引脚,以便在任何情况下可以把状态机复位到初始状态。在复位或是在某些条件下,所有状态都向初始状态转移的情况,可以在状态寄存always块中处理。 例如,按钮key在低电平时,从所有状态返回状态s0,则可以写成如下: always @ (posedge clk or negedge key) begin if(!key) state=s0; //描述key=0时,返回初始状态s0的语句 else state=next_state; //否则,从现态转到次态 end 3.状态机描述例题 下面举例说明如何描述状态机的这三个部分。 【例9-13】 试用Verilog HDL描述图9-6所示的4状态摩尔状态机,该状态机有一个输入信号x和一个输出信号z。 ① 第1种描述:次态逻辑、输出逻辑使用一个always块描述,状态寄存器单独使用一个always描述的例子。Verilog HDL描述如下: module fsm1(clk,x,z); input x,clk; output z; reg z; reg [1:0] state,next_state; //定义寄存器类型的状态变量 parameter s0 = 2‘b00,s1 = 2’b01, s2 = 2‘b10, s3 = 2’b11; //用参数语句描述状态编码 always @ (posedge clk) //描述状态寄存器的always块 begin state =next_state; end //实现状态转换 always @ (state or x) //次态逻辑和输出逻辑always块 begin case (state) s0: begin z=1; //状态s0,先描述输出z=1 if (!x) begin next_state =s1; end //再描述次态逻辑 else begin next_state =s
文档评论(0)