VerilogHDL那些事儿命令式的仿顺序操作.doc

VerilogHDL那些事儿命令式的仿顺序操作.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Verilog HDL那些事儿 命令式的仿顺序操作 ? 标签:无标签 声明:本文为原创作品,版权归akuei2及黑金动力社区()共同所有,如需转载,请注明出处命令式的仿顺序操作 什么是Verilog HDL式的仿顺序操作!?在明白这东西之前,我们先看几个例子: 假设我要建立可以产生SSS,S0S,0S0,000这四种模块。如果模仿C语言函数会是如下: //基础函数 S_Function(){.} O_Function(){.} //基于基础函数创建的函数 SSS_Function() S_Function();S_Function();S_Function(); SOS_Fucntion() S_Function();O_Function();S_Function(); OSO_Fucntion() O_Function();S_Function();O_Function(); OOO_Fucntion() O_Function();O_Function();O_Function(); 我们会很自然的,以S_Function()和O_Fucntion()为基础,再建立出四个新的SOS_Function(),SSS_Function(),OSO_Function(),和OOO_Fucntion()。在仿顺序语言上(如C语言),这样的方法当然,没有问题,但是在Verilog HDL上呢? 笔者说过仿顺序操作归根究底不是单纯模仿顺序操作而已,而是利用Verilog HDL语言本身的特质,去模仿顺序操作。4.1章~4.2章的实验,虽然达到以上这一点,但这只是仅限于少个函数而已。 我们来看看,如果以4.1章~4.2章为基础,来模仿以上的顺序操作的话,会是什么样一个结果。 如图上!可怕吧!逐渐建立SSS组合模块,SOS组合模块,OSO组合模块和OOO模块。然而每一个组合模块都包含各自的控制模块,S摩斯码模块,O模式码模块 和选择器。最后,每一个组合模块的输出,还需要一个输出选择器来协调操作。 我们从另一个方面来分析它的缺点: (一)模块的重复,资源的消耗。 (二)建模量多,连线设计繁多。 (三)模块调用的难度。 诸如以上等。如果你有笔者这样的耐性,当然没有问题,但是实际上笔者也觉得非常猥琐,而且建模的设计也很苦难。所以我们需要另一种仿顺序操作的方法,毕竟4-1章和4-2章的方法,只适合小规模的仿顺序操作。 那个方法即是命令式的仿顺序操作。 何谓命令式的仿顺序操作?我们来看看下面的一张图,就可以知道个大概: 如上图!结果我们可以把如上的建模精简到这样的程度,当然在各个所包含的内容中,代码的结构也是有保障的。如果继续引入以上的例子,那么: function_module.v module function_module Function_Start_Sig, Function_Done_Sig, Pin_Out ); input[1:0]Function_Start_Sig; input Function_Done_Sig; output Pin_Out; /*/ //定时器和延时器 /*/ reg[3:0]i; reg rPin_Out; reg isDone; always@(posedge or CLK or negedge RSTn) if(!RSTn) begin i=4d0; rPin_Out=1b0; isDone=1b0; end ===else if(Function_Start_Sig[1]) case(i) //S摩斯码产生 4d 9: begin isDone=1b1;i=i+1b1;end 4d10: begin isDone=1b0;i=4d0; endcase ===else if(Function_Start_Sig[0]) case(i) //0摩斯码产生 4d 9: begin isDone=1b1;i=i+1b1;end 4d10: begin isDone=1b0;i=4d0; endcase /*/ assign Function_Done_Sig=isDone; assign Pin_Out=rPin_Out; /*/ endmodule 关于function_module.v关键的部分是Function_Start_Sig的位宽和else if部分。 Function_Start_Sig的每一位位宽都代表不同的Start_Sig。 Function_Start_Sig[1.0] 位命令 功能 10 S莫斯码产生 01 O摩斯码产生 然而Done_Sig和以往一样,没有任何变化。假设我要产生S模式码,那么我只要往Function_Start_Sig输入2b10即可。 cmd_control_modu

文档评论(0)

shujukd + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档