- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
您可能关注的文档
最近下载
- 基坑支护内支撑梁拆除施工方案.docx VIP
- 最新人教版一年级上册《数学游戏》课件(整套)教学PPT(2024年秋-新教材).pptx VIP
- 最新人教版一年级数学上册《数学游戏》教学课件(整套)PPT(2024秋-新教材).pptx VIP
- GBT6058-2005 纤维缠绕压力容器制备和内压试验方法.pdf
- GB╱T 23711.1-2009 氟塑料衬里压力容器电火花试验方法.pdf
- 7m焦炉推焦车的结构特征.pdf
- 研发领料单模板.docx VIP
- 辽宁省技工学校审批表.doc VIP
- GB 26501--2011 氟塑料衬里压力容器 通用技术条件.pdf
- 施工放样报验单.doc VIP
文档评论(0)