HDL建模技巧低级建模仿顺序操作midd_第1页
HDL建模技巧低级建模仿顺序操作midd_第2页
HDL建模技巧低级建模仿顺序操作midd_第3页
HDL建模技巧低级建模仿顺序操作midd_第4页
HDL建模技巧低级建模仿顺序操作midd_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

HDL建模技巧低档建模仿次序操作HDL阅读:22评论:0作者:.COM缺氧发表于-06-0613:38原文链接"尚有一种问题,就是编程风格的问题。内容能够较好的帮到初学者,从另一种角度去认识VerilogHDL建模技巧。还记得自己初次接触HDLHDL每一本笔记的开始都有一种初衷:在早期练习第1voidvoidFlashing_To_Right(){.}void任务都非常的简朴。几乎是入门级的实验,但是将这些实验带入到V(二)运用VmoduleFlashing(CLK,RSTn,Data_Out);inputCLK,RSTn;output[7:0]Data_Out;reg[7:0]Counter;always@(posedgeCLKornegedgeRSTn)if(~RSTn)Counter=8'd0;elseCounter=Counter+1'b1;reg[7:0]i;always@(posedgeCLKornegedgeRSTn)if(~RSTn)i=8'd0;elseif(Counter==200)i=i+1'b1;elseif(i==8)i=8'd0reg[7:0]rData;always@(posedgeCLKorRSTn)if(~RSTn)rData=8'b0000_0001;elseif(i8)rData={rData[6:0],1'b0};elseif(i==8)rData=8'b0000_0001;assign相比之下,Cinti;for(i=0;i3;i++)Flashing_To_Right();for(i=0;ii30;i++)Flashing_To_Right();给自己5分钟的思考,想想我究竟要体现什么?第2//独立模块always@(posedgeCLKornegedgecase(cState)"清扫":if(清扫完毕)nState="洗厕所"else"发号清扫命令""洗厕所":if(洗厕所完毕)nState="跑腿"else"发送洗厕所命令""跑腿":./*///效模块1-清扫工作always@(posedgeCLKornegedgeRSTn).elsecase(cState)IDLE:if(到扫命令)nSate="清扫nState=IDLE;"清扫":"执行清扫";"清扫完毕后报告";"待命低档功效模块2-洗厕所工作always@(posedgeCLKornegedgeRSTn).elsecase(cState)IDLE:if(洗厕所命令)nSate="洗厕所nState=IDLE;"洗厕所":"执行洗厕所";"洗厕所完毕后报告";"待命./*///低档功效模块3-跑腿工作always@(posedgeCLKornegedgeRSTn).else你尝试想象一下:如果有多个打工仔,散落在不同的地方。当老板要发号的时然而在"低档建模"的设计中,"模块化的组织"更有"层次感"。为了使"上一层组织起来。即使感觉上会有一种"杂乱感",但是实际运用起来,真的非常方便。第3Template(CLK,RSTn,.,//"n个输入输出",Start_Sig,Done_Sig);inputCLK;inputRSTn;inputStart_Sig;inputDone_Sig;.//"n个输出输入声明"/*/reg[3:0]i;regisDone;always@(posedgeCLKornegedgeRSTn)if(~RSTn)begini=4'd0;isDone=1'b0;.//任何复位的动作endelsen+1,4'bn+2://最后两个环节用来产生完毕信号Done;Done;//产生Done信号if(isDone==1)beginisDone=1'b0;i=4'd0;endelsebeginisDone=1'b1;i=i+1'b1;endendtask/*/assign最后两个ii等于0i=i+1;除此之外该模板还引入了reg[3:0]i;regisDone;reg[7:0]rData;always@(posedgeCLKornegedgeRSTn)if(~RSTn)begini=4'd0isDone=1'b0;rData=8'd0;endelsecase(i)4'd0:i=i+1;.endcasereg[3:0]i;regisDone;reg[7:0]rData;always@(posedgeCLKornegedgeRSTn)if(~RSTn)begini=4'd0;isDone=1'b0;rData=8'd0;endelsecase(i)4'd0:Next;.endcase/*/taski=i+1'b1;endtask其实这个问题我也考虑了很久,由于是"仿次序操作"的关系,故人类对第4建立2moduleflashing_to_right(CLK,RSTn,Start_Sig,Done_Sig,Q);inputCLK;inputRSTn;inputStart_Sig;outputDone_Sig;output[7:0]Q;/*/parameterDELAY=8'd200;/*/reg[7:0]Counter;always@(posedgeCLKornegedgeRSTn)if(~RSTn)Counter=8'd0;elseCounter=8'd0;/*/reg[3:0]i;reg[7:0]rData;regisDone;always@(posedgeCLKornegedgeRSTn)if(~RSTn)begini=4'd0;isDone=1'b0;rData=8'dx;endelseif(Start_Sig)case(i)4'd0:beginrData=8'dx;i=i+1'b1;endrData=(8'h80i-1);4'd9:begini=4'd10;isDone=1'b1;end4'd10:begini=4'd0;isDone=1'b0;endendcase/*/assignDone_Sig=isDone;assignQ=(i0&&i9)?rData:8'dx;/*/endmodulemoduleflashing_to_left(CLK,RSTn,Start_Sig,Done_Sig,Q);inputCLK;inputRSTn;inputStart_Sig;outputDone_Sig;output[7:0]Q;/*/parameterDELAY=8'd200;/*/reg[7:0]Counter;always@(posedgeCLKornegedgeRSTn)if(~RSTn)Counter=8'd0;elseif(Counter==DELAY)Counter=8'd0;elseCounter=8'd0;/*/reg[3:0]i;reg[7:0]rData;regisDone;always@(posedgeCLKornegedgeRSTn)if(~RSTn)begini=4'd0;isDone=1'b0;rData=8'dx;endelseif(Start_Sig)case(i)4'd0:beginrData=8'dx;i=i+1'b1;endrData=(8'h01i-1);4'd9:begini=4'd10;isDone=1'b1;end4'd10:begini=4'd0;isDone=1'b0;endendcase/*/assignDone_Sig=isDone;assignQ=(i0&&i在51行到53行之间,是移位操作,每一次的移位动作都需要200个时钟周期。移位操作一共有8个环节。最后该模块产生一种"高脉冲"以表达"完毕",然而i复位为0。如上的示意图。当我们要封装2会iinputCLK;inputRSTn;inputRight_Start_Sig;g,Left_Done_Sig,Q);inputLeft_Start_Sig;outputRight_Done_Sig;outputLeft_Done_Sig;U1(.CLK(CLK),//input-fromtop.RSTn(RSTn),//input-fromtop.Done_Sig(Right_Done_Sig),//output-totop.Q(Q_U1)//output-towire);/*/wire[7:0]Q_U2;flashing_to_leftU2(.CLK(CLK),//input-fromtop.RSTn(RSTn),//input-fromtop.Start_Sig(Left_Start_Sig),//input-fromtop.Done_Sig(Left_Done_Sig),//output-totop.Q(Q_U2)//output-toelserQ=3'dx;assignQ=rQ;/*/endmodule为assignQ=Right_Start_Sig?Q_U1:Q_U2;即使如上的写法和,第45到rQ=Q_U2;default:rQ=3'bxxx;endcaseQ=rQ;即使该写法的解读性很高效果也同样,但是却很浪费资源。生成的RTL:if(Left_Start_Sig)rQ=Q_U2;elserQ=3'dx;assignalways@(*)"always@(*)"这样的写法在Verilog中已经被支持(仿佛是这个版本)。在敏感包中的"*",if(Right_Start_Sig)rQ=Q_U1;elseif(Left_Start_Sig)rQ=Q_U2;else4."次,然后自左向右循环30次_Sig,Right_Done_Sig,Left_Done_Sig);inputCLK;inputRSTn;inputStart_Sig;inputRight_Done_Sig;inputLeft_Done_Sig;outputDone_Sig;outputRight_Start_Sig;outputLeft_Start_Sig;/*/reg[7:0]i;regisDone;regisLeft;regisRight;always@(posedgeCLKornegedgeRSTn)if(~RSTn)beginisDone=1'b0;i=8'd0;isRight=1'b0;isLeft=1'b0;endFlash_Right;if(Right_Done_Sig)begini=i+1'b1;isRight=1'b0;endelseisRight=1'b1;endtask/*/taskFlash_Left;if(Left_Done_Sig)begini=i+1'b1;isLeft=1'b0;endelseisLeft=1'b1;endtask/*/taskDone;if(isDone==1)beginisDone=1'b0;i=8'b0;endelsebeginisDone=1'b1;i=i+1'b1;endendtask/*/assignDone_Sig=isDone;assignflashing_to_right/left在40行,第if(Right_Done_Sig)begini=i+1'b1;isRight=1'b0;endif(isDone==1)beginisDone=1'b0;i=8'b0;endelsebeginmoduledone(CLK,RSTn,Start_Sig,Done_Sig,Q,Right_Done,Left_Done,//用于观察Right_Start,Left_Start//用于观察);inputCLK;inputRSTn;inputStart_Sig;outputDone_Sig;outputLeft_Done;outputRight_Done;outputRight_Start;outputLeft_Start;output[7:0]Q;/*/wireRight_Start_Sig;wireLeft_Start_Sig;wireRight_Done_Sig;wireU3(.CLK(CLK),.RSTn(RSTn),.Start_Sig(Start_Sig),//infromtop.Done_Sig(Done_Sig),//outtotop.Right_Start_Sig(Right_Start_Sig),//outtoU2.Left_Start_Sig(Left_Start_Sig),//outtoU2.Right_Done_Sig(Right_Done_Sig),//infromU2.Left_Done_Sig(Left_Done_Sig)//infromU2);/*/flashing_moduleU4(.CLK(CLK),.RSTn(RSTn),.Right_Start_Sig(Right_Start_Sig),//infromU1.Left_Start_Sig(Left_Start_Sig),//infromU1.Right_Done_Sig(Right_Done_Sig),//outtoU1.Left_Done_Sig(Left_Done_Sig),//outtoU1.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论