分块地址产生433m无线模块电路图的设计 用VerilogHDL语言设计 只要求设计出程序就行 欢迎高手光临

《verilog_数字系统设计课程》(第二版)思考题答案数字,答案,思考题答..
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
《verilog_数字系统设计课程》(第二版)思考题答案
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
基于Verilog HDL的乐曲演奏电路设计
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口& & 一个复杂电路系统的完整Verilog HDL模型是由若干个Verilog HDL模块构成的,每一个模块又可以由若干个子模块构成。其中有些模块需要综合成具体电路,而有些模块只是与用户所设计的模块交互的现存电路或激励信号源。利用Verilog HDL语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构来描述极其复杂的大型设计,并对所作设计的逻辑电路进行严格的验证。
& & Verilog HDL行为描述语言作为一种结构化和过程性的语言,其语法结构非常适合于算法级和RTL级的模型设计。这种行为描述语言具有以下功能。
& & Verilog HDL的构造性语句可以精确地建立信号的模型。这是因为在Verilog HDL中,提供了延迟和输出强度的原语来建立精确程度很高的信号模型。信号值可以有不同的强度,可以通过设定宽范围的模糊值来降低不确定条件的影响。
& & Verilog HDL作为一种高级的硬件描述编程语言,有着类似C语言的风格。其中if语句、case语句等和C语言中的对应语句十分相似。如果读者已经掌握C语言编程的基础,那么学习Verilog HDL并不困难,只要对Verilog HDL某些语句的特殊方面着重理解,并加强上机练习就能很好地掌握它,利用它的强大功能来设计复杂的数字逻辑电路。下面将介绍Verilog HDL中的基本结构和语法。
& & Verilog HDL程序入门
& & 首先来看几个Verilog HDL程序,然后从中分析Verilog HDL程序的特性。
例1:加法器。
module& adder ( count,sum,a,b,cin );&
//加法器模块端口声明
&input [2:0] a,b;& & & & & & & & & &
& & //端口说明
&output [2:0]
&assign {count,sum} = a + b + & &
//加法器算法实现
这个例子通过连续赋值语句描述了一个名为adder的三位加法器可以根据两个三比特数a、b和进位(cin)计算出和(sum)和进位(count)。从例子中可以看出整个Verilog HDL程序是嵌套在module和endmodule声明语句里的。
例2:比较器。
module& compare ( equal,a,b );& &
//比较器模块端口声明
& & & & &output&& & & & & & & &
//输出信号equal
& & & & &input [1:0] a,b; & & & & & & //输入信号a、b
& & & & &assign& equal=(a==b)?1:0; //如果a、b 两个输入信号相等,输出为1,否则为0
这个程序通过连续赋值语句描述了一个名为compare的比较器。对两比特数a、b进行比较,如a与b相等,则输出equal为高,否则为低电平。在这个程序中,&/*........*/&和&//.........&表示注释部分,注释只是为了方便程序员理解程序,对编译是不起作用的。
例3:使用原语的三态驱动器。
module& trist2(out,in,enable); & & //三态启动器模块端口声明
& & &output&& & & & & & & & & & & //端口说明
& & &input&
& & &bufif1& mybuf(out,in,enable);& //实例化宏模块bufif1
这个例子描述了一个名为trist2的三态驱动器。程序通过调用一个在Verilog语言库中现存的三态驱动器实例元件bufif1来实现其功能。
例4:自行设计的三态驱动器。
module& trist1(out,in,enable);&
& //三态启动器模块端口声明
& & &output&& & & & & & & & & &
& //端口说明
& & &input& in,
& & &mytri& tri_inst(out,in,enable);//实例化由mytri模块定义的实例元件tri_inst
& & &module& mytri(out,in,enable); //三态启动器模块端口声明
& & &output&& & & & & & & & & & & &
//端口说明
& & &input& in,
& & &assign& out = enable? in : ' &
//三态启动器算法描述
这个例子通过另一种方法描述了一个三态门。在这个例子中存在着两个模块。模块trist1调用由模块mytri定义的实例元件tri_inst。模块trist1是顶层模块。模块mytri则被称为子模块。
通过上面的例子可以看到。
本网站试开通微、小企业商家广告业务;维修点推荐项目。收费实惠有效果!欢迎在QQ或邮箱联系!
试试再找找您想看的资料
资料搜索:
查看相关资料 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
copyright & &广电电器(中国梧州) -all right reserved& 若您有什么意见或建议请mail: & &
地址: 电话:(86)774-2826670&基于Verilog语言的可维护性设计技术_52RD研发博客
基于Verilog语言的可维护性设计技术 Post at
0:11:00陈曦chenxiee@mails.& & & & &注:本文内容主体部分直接翻译参考文献[1]较多内容,因此本文不用于任何商业目的,也不会发表在任何学术刊物上,仅供实验室内部交流和IC设计爱好者交流之用。
“曲意而使人喜,不若直节而使人忌;无善而致人誉,不如无恶而致人毁”《菜根谭》【摘要】 本文以VerilogHDL为例,从可重用性、代码可扩展性、可读性、变量本地化、参数(parameter)和宏(`define)的对比以及封装子程序的角度探讨了可维护性设计应遵守的几条基本原则。【关键词】设计重用; 可维护性设计; 本地化; 参数; 宏前言& 随着集成电路制造技术的发展,对设计提出了更多的挑战,随着设计复杂度的增加,又提出了片上系统(SoC)的概念。为了加速设计收敛,设计重用、可测性设计、可验证性设计和可维护性设计得到了更多重视。本文以VerilogHDL为例,对可维护性设计进行了初步探讨。1、设计重用与可维护性设计设计重用是一个很大的概念,严格来讲,可验证性设计和可维护性设计都在设计重用之列。可维护性设计的目的本身就是便于设计重用,便于让后来人读懂前人所写的代码,但设计重用包括的内容更广泛。设计重用讲的是设计总体风格而不是设计的细节,“it is about forests, rather than trees”。最重要的概念:本地化(locality)DD一定要尽量使问题本地化,这样有利于问题的排除。对于大的设计尤为重要。三条基本原则n & &尽量采用全同步设计,将输入和输出寄存,这样有利于将时序优化本地化n & &采用bottom-up验证方法,保证每个子模块的功能是正确的,然后再进行整体验证。n & &花时间设计一个好的设计规范,力图使这样的规范具有好的体系结构和模块划分,这样有利于本地化的有效实现。& 一个好的设计应该包括:完备的文档、好风格的代码、详尽的注释、良好易用的验证环境和鲁棒的脚本。影响设计重用的障碍本质上说是管理和企业文化;开发和管理内部IP资源是最大的重用挑战。关于设计重用这里不再讨论,否则就有喧宾夺主之嫌了。2、关于代码可扩展性的一点讨论代码可扩展性实际上也包括在设计重用之内。代码可扩展性或称可扩展性设计要求便于向将来新的设计过渡。比如64位的PCI标准出来的时候,现行的32位PCI接口设计模块可以通过比较简单的改动而变为64位,而不需要一切从头再来。一般设计中通过定义参数和宏来便于修改。典型例子就是总线:`define WORD 16`define DWORD 32reg [`WORD-1:0] intructionreg [`DWORD-1:0] data_bus,addr_当然代码可扩展性不仅仅包括参数和宏的使用,如下例:module tri_buf(in,out, ena);parameter WIDTH=8;input [WIDTH-1:0]output[WIDTH-1:0]assign out= ena?in:’endmodule这是一段有潜在问题的代码,Verilog将高位扩展为0来匹配输出,所以当WIDTH&32时,上述代码是有问题的,仿真的时候甚至都看不出来,因此不利于可扩展性。象这样的问题可以用Verilog lint等工具来检查。3、可读性最重要可读性最重要。许多设计者有个习惯:追求尽量用短的代码来完成同样的功能,国内许多考试中也要求用少于多少行的代码完成某某功能(很不好的倾向)。对于HDL,我不推荐这样的风格,因为综合工具会帮助你完成优化工作。我的建议是:同样的代码可长可短,不要为了减少行数而影响可读性。如下例:Module rrarb(request,grant,reset,clk);Input [1:0]Output[1:0]IIWReg last_Reg [1:0]Wire[1:0] next_
Assign next_grant[0]=~reset&(request[0] & (~request[1]|last_winner));Assugn next_grant[1]=~reset& (request[1] &(~request[0]| ~last_winner));Assign winner=~reset & ~next_grant[0] &(last_winner | next_grant[1]);Always @(posedge clk)BeginLast_winner=Grant=next_End当request[1:0]=2’b00,时,last_winner会发生什么变化?上面的代码可读性较之下面的代码差很多。Module rrarb(request,grant,reset,clk);Input [1:0]Output[1:0]IIWReg last_Reg [1:0]Always @(posedge clk)BeginIf(reset) begin Grant&=2’b00;Last_winner&=0;EndElse begin& Grant&=2’b00;If(request!=2’b00) begin:find_winnerRCase(request)&2’b01:winner&=0;&2’b10:winner&=1;&2’b11:if (last_winner==1’b0) winner&=1;& & & else & & & & & & & &winner&=0; &default:winner&=0;endcasegrant[winner] &=1’b1;last_winner&=endendendendmodule上述两个代码的综合结果差不多。而且上面第一段代码在always块内采用阻塞赋值的方法也存在潜在问题。4、要有好的注释风格要有好的注释风格。减少注释的行数跟节约代码的行数一样,我不推荐。像代码有好坏一样,注释也有好坏之分。比如://increment addraddr&=addr+1;上例中的注释就是一句废话,因为地址加1是不言自明的。这样的注释反而会影响可读性。好的注释应该给出该段代码的使用目的,它能够给不熟悉这段代码的人以信息。如下例://In burst mode,the bytes are written in consecutive addresses.Need to access the next address to verify that the next byte was properly saved.Addr&=addr+1;& 关于如何注释我在设计重用里面讲过,这里不再重复,请参考[2]。5、应尽量将声明本地化这种办法有点类似于C++中封装的概念,应尽量保持变量的可见性在必要的范围内,不要产生不必要的交互。如下例:integer I;
alwaysbegin &for(I=0;I&32;I=I+1) begin … endend
alwaysbegin& &for(I=15;I&=0;I=I-1) &begin … endend对于两段代码来讲,I是全局的,他们的不必要的交互会产生不可预料的结果。在verilog里面,你可以将I定义到always块里面,使I只对当前块可见。如下例:alwaysbegin:block1& integer I; &for(I=0;I&32;I=I+1) begin … endend
alwaysbegin:block2& integer I;& &for(I=15;I&=0;I=I-1) &begin … endend在Verilog里面其它使变量本地化的方法是采用function 和task。Function和task中定义的变量只对其内部可见。T& &Input [7:0]& && &Reg && &Begin& & & & …& &endendtaskfunction [31:0]input [31:0] val1;input[31:0] val2;reg [32:0]begin& &sum=val1+val2;& &average=sum/2;end另外,还要提一句关于`define VS parameter。一般设计中都要有一个头文件,里面用`define定义了一些宏。而模块中又有可能用parameter定义一些参数。两者的区别是一个是全局的一个是本地的。设计者可以根据需要进行定义。定义成本地参数避免可以避免同其他模块的变量名字冲突。定义成全局的宏则可以在整个设计的各个文件中使用。千万不可为了方便全部定义成宏。6.子程序封装封装有利于程序的可维护性。如果程序中多次用到一段代码,应根据实际情况尽量将它定义为function、task或module。这样做可以减少代码长度,提高可维护行和可验证性。下面以testbench为例说明。通常一个SoC设计中,需要首先设计和验证各个子模块,然后才进行系统级验证,因此要多次用到testbench。每个testbench中都要初始化时钟、进行系统复位等。这些多次用到的代码不如写在单独的一个文件(不妨称作basic.v)中,各个testbench只要使用include将他们包括进来就可以直接使用了。下面是我在最近的863项目中写的basic.v去掉一些注释后的内容,可以直接copy使用。要求将时钟定义为clk,复位管脚定义为rst,高有效。//start of basic.vevent ENDSIM;// CYCLE monitor and end-of-simulation checker.task monitor_& input max_& integer max_&& begin& & &cycles = 0;& & &fork& & & & // Count cycles.& & & & forever begin& & & & & &@(posedge clk);& & & & & &cycles = cycles + 1;& & & & end& & & & & & & & // Watch for max cycles. &If we detect max cycles then throw our testbench ENDSIM event.& & & & //& & & & begin& & & & & &wait (cycles == max_cycles);& & & & & &$display ("MAXIMUM CYCLES EXCEEDED!");& & & & & &-&ENDSIM;& & & & end& & &join& endendtask// Reset& begin& & &rst = 1;& & È& & &rst = 0;& & &$display ("End RESET.");& endendtask&// Drive the clock inputtask drive_& begin& & &clk &= 0;& & &forever begin& & & & #(`CLKLO) clk = 1;& & & & #(`CLKHI) clk = 0;& & &end& endendtask
// ************* &BASIC CONFIDENCE Test Tasks **************//// BASIC CONFIDENCE Test.//// This task will fork off all the other necessary tasks to cause reset, drive the clock, etc. etc.//// task clk_rst_gen_and_stop_& input cycle_& begin& & &$display ("designed by Chenxi. Email:chenxiee@mails.");& & &fork& & & & // Capture data& & & & capture_& & & & & & & & // Run the clock& & & & drive_& & & & & & & & // Do a reset& & & && & & & begin& & & & & &monitor_cycles(cycle_num);& & & & end& & & & // Catch end of simulation event due to max number of cycles or pattern from PIC code.& & & & begin& & & & & &@(ENDSIM); &// Catch the event.& & & & & &$display ("End of simulation signalled. &Killing simulation in a moment.");& & & & & � // Let anything else see this event...& & & & & &$& & & & end& & &join& endendtask//end of basiv .v在testbench中可以直接例化使用。//somemodule_tb.vmodule somemodule_`include “basic.v”initial begin// ** This is our top-level "Basic Confidence" test.…//generatr rst,clk,and stop at 5000 cycles & clk_rst_gen_and_stop_at(5000);…end…endmodule //End of somemodule_tb.v需要注意的是basic.v不能够单独编译。直接编译testbench就可以了。上述方法也在可综合的代码中使用。参考文献[1]推荐的另外一种办法是将上述basic.v用模块封装起来。如下例:initialbegin& &warnings=0;& &errors=0;endinput[80*8:1]begin& $write(“Warning at %t: %s”,$time,msg);& warnings=warnings+1;endendtaskbegin&$write(“Simulation Completed\n”);&$end…endmodule调用办法:module somemodule_initialbegin & …if(…) basic.warning(”Unexpected response detected”);…basic.end& &endmodule7、结论本文VerilogHDL为例,从可重用性与可维护性的关系、代码可扩展性设计、尽量增加可读性和使变量本地化、参数(parameter)和宏(`define)的对比以及封装子程序的角度探讨了可维护性设计应遵守的几条基本原则。作者的HDL coding经验不多,权当抛砖引玉。“公平正论不可犯手,一犯手则玷污终身”,“小处不渗漏,暗处不欺隐,末路不怠荒,才是真正英雄”,因此一定要依照以上原则进行可维护性设计!,不要试图降低师弟妹们对你的崇拜程度。欢迎大家提出宝贵意见。联系方式:chenxiee@mails..cnQQ:参考文献[1]Janick Bergeron,WRITING TESTBGENCHES CFunctional Verification of HDL Models, England:KLUWER ACADEMIC PUBLISHERS[2] 陈曦 设计重用 中国:清华大学[3] 陈曦的设计文件 basic.v已有 20 位网友发表了看法&

我要回帖

更多关于 电路模块 的文章

 

随机推荐