华为verilog代码规范(wps初学者入门教程)

对于初学者,可大致了解VerologHDL所提供的能力,掌握VerilogHDL语言的核心子集。1VerilogHDL语言具有:设计的行为特性、设计的数据流特性、设计的结构组成以及包括响应监控和设计验证方面的时延和波形产生机制。2如何描述自顶向下的设计思想:每个模块实现特定的功能,模块间可进行层次的嵌套,因此可以将大型的数字电路设计分割成大小不一的小模块来实现特定的功能,最后通过由顶层模块调用子模块来实现整体功能。3三种建模方式3.1结构化描述方式结构化建模方式就是通过对电

大家好,又见面了,我是你们的朋友全栈君。

对于初学者,可大致了解Verolog HDL所提供的能力,掌握Verilog HDL语言的核心子集。

1 Verilog HDL语言具有:设计的行为特性、设计的数据流特性、设计的结构组成以及包括响应监控和设计验证方面的时延和波形产生机制。

2 如何描述自顶向下的设计思想:每个模块实现特定的功能,模块间可进行层次的嵌套,因此可以将大型的数字电路设计分割成大小不一的小模块来实现特定的功能,最后通过由顶层模块调用子模块来实现整体功能。

3 三种建模方式

3.1 结构化描述方式

结构化建模方式就是通过对电路结构的描述来建模,即通过对器件的调用并使用线网来连接各器件的描述方式。这里的器件包括Verilog HDL的内置门,也可以是用户的一个设计。

3.2 数据流描述方式

数据流的建模方式就是通过对数据流在设计中的具体行为的描述来建模。最基本的机制是用连续赋值语句。还需要借助用于HDL提供的一些运算符,如按位逻辑运算符。

3.3 行为描述方式

        行为方式的建模是指采用对信号行为级的描述方式进行建模,在表示方面,类似数据流的建模方式,但一般把initial模块或always块语句描述的归为行为建模方式。行为建模方式通常借助一些行为级的运算符如+-等。

3 总结

在实际设计中,往往是多种设计模型的混合。一般对于顶层设计,采用结构描述方式(功能器件网表方式连接)对低层模块进行例化;对低层模块,可采用数据流(assign)、行为级(initial, always)或者二者的结合。

4 Verilog数据类型

Verilog语言主要包含两种数据类型:线网类型和寄存器类型。

4.1 线网类型

        wire和tri定义

线网类型主要有wire和tri两种。

tri用于定义三态线网。

wire型用于对结构化器件之间的物理连线的建模。如器件管脚,内部器件如与门的输出等。

线网型代表物理连线,不存储逻辑值,必须由器件驱动。通常由assign进行赋值,如assign A=B^C。

当wire型信号没有被驱动时,缺省值为Z高阻态。信号没有定义数据类型时,缺省为wire型。

4.2 寄存器类型

reg用于对存储单元的描述,如D型触发器,ROM等。存储器类型的信号在某种触发机制下分配了一个值,在分配下一个值时保留原值,但reg型变量不一定是存储单元,如always语句中进行描述的必须用reg类型的变量。

附上一些简单的入门级代码以供参考

//3.1 全加器
module adder4(count, sum, ina, inb, cin);
output[3:0]sum;
output count;
input [3:0] ina, inb;
input cin;
assign {count, sum}=ina+inb+cin;
endmodule 

//4位计数器
module count4(out, reset, clk);
output [3:0] out;
input reset, clk;
reg[3:0]out;
always@(posedge clk)
    begin 
        if(reset)out<=0;
        else out<=out+1;
        end
endmodule

//4位全加器的仿真程序
module adder_tp;
reg[3:0]a,b;    //测试输入信号定义为reg型
reg cin;
wire[3:0]sum;    //测试输出信号定义为wire型
wire cout;
integer i,j;

adder4 adder(sum, cout, a, b, cin);    //调用测试对象
always#5 cin=~cin;

initial 
begin 
a=0; b=0; cin=0;
for(i=1;i<16;i=i+1)
#10 a=i;
end

3.1.1.1 加法器
module addr(a,b,count,sum);
    input[2:0]a;
    input[2:0]b;
    input cin;
    output count;
    output [2:0]sum;
    
    assign {count, sum}=a+b+cin;
endmodule

//3.1.1.2 比较器
module compare(equal, a, b);
    input[1:0]a,b;    //declare the input signal;
    output equare;
    
    assign equare=(a==b)?1:0;
    //if a=b,  output 1, otherwise 0;
endmodule

/*三态缓冲器(驱动器,门),输入缓冲器用于将外设送来的数据暂时存放,以便处理器
将其取走;输出缓冲器的作用是用来暂时存放处理器送往外设的数据。
数控缓冲器的作用就是使高速工作的CPU与慢速工作的外设起协调和缓冲作用,实现数据传送的同步。
由于缓冲器用在总线上所以要有三态输出功能。*/
/*三态电路有三种不同的输出值,分别是逻辑0,1和高阻态,高阻态用来将逻辑门同系统的
其他部分加以隔离。*/

//3.1.1.3 三态驱动器
//定义mytri模块
module mytri(din, d_en, d_out);
    input din;
    input d_en;
    output d_out;
    
    assign d_out = d_en ? din:’bz;
endmodule

//调用mytri模块
module trist(din, d_en, d_out);
    input din;
    input d_en;
    output d_out;

    mytri u_mytri(din, d_en, d_out);    //实例化mytri模块
endmodule

3.3.2.1 数据流描述方式
module FA_flow(A,B,Cin,Sum,Count)
    input A,B,Cin;
    output Sum, Count;
    
    wire S1,T1,T2,T3;
    
    //各个assign语句是并行执行的,即各语句的执行与语句之间的顺序无关。
    //下面的代码说明,在数据流描述方式中,除连续赋值语句之外还需要借助HDL提供的一些逻辑运算符来实现。
    assign #2 S1=A^B;    
    assign #2 Sum=S1^Cin;
    assign #2 T3=A&B;
    assign #2 T1=A&Cin;
    assign #2 T2=B&Cin;
endmodule

3.3.3 行为建模方式
//3.3.3.1 一位全加器的行为建模
module FA_behav1(A,B,Cin,Sum,Cout);
    input A,B,Cin;
    output Sum, Cout;
    reg Sum, Cout;
    reg T1,T2,T3;
    
    always@(A or B or Cin)
    begin 
        Sum(A^B)^Cin;    //相异为1相同为0
        T1=A&Cin;
        T2=B&Cin;
        T3=A&B;
        Cout=(T1|T2)|T3;
    end
endmodule

//1只有寄存器类型的信号才可以在always和initial语句中进行赋值,类型定义通过reg语句
实现;
2 always语句是一直重复执行,由敏感表中的变量触发;
3 always语句从0时刻开始;
4 在begin和end之间的语句是顺序执行,输出串行语句。
        
3.3.3.2一位全加器的行为建模
module FA_behav2(A,B,Cin,Sum,Cout);
    input A,B,Cin;
    output Sum, Cout;
    
    reg Sum, Cout;
    
    always@(A or B or Cin)
    begin 
        {Count, Sum}=A+B+Cin;
        //{Count, Sum}表示对位数的扩展,两个1bit相加,和有2位,低位放在Sum变量中,进位放在Count中;
        //相当于位数的拼接,从左到右由高到低
    end
endmodule

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/129242.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PermitRootLogin yes无效问题或SSH登录时报Permission denied, please try again.

    PermitRootLogin yes无效问题或SSH登录时报Permission denied, please try again.在这里,说一下所有解决办法吧,总有一个适合你:如果没有安装ssh,即看不见PermitRootLogin,则使用如下语句安装:sudoapt-getinstallopenssh-server 使用vim/etc/ssh/sshd_config进入,将PermitRootLogin设置为yes,之后systemctlrestartsshd进行重启。3. ssh用户名,大写更改为小写 更改登陆密码,改为6…

    2022年6月4日
    51
  • EasyDSS流媒体服务器软件-正式环境安装部署攻略

    EasyDSS流媒体服务器软件-正式环境安装部署攻略EasyDSS流媒体服务器软件,提供一站式的转码、点播、直播、时移回放服务,极大地简化了开发和集成的工作。其中,点播功能主要包含:上传、转码、分发。直播功能主要包含:直播、录像,直播支持RTMP输入,RTMP/HLS/HTTP-FLV的分发输出;录像支持自定义保存时长、检索及下载。提供丰富的二次开发接口,基于JSON的封装及HTTP调用。提供播放鉴权、推流鉴权等安全保证。提供用户及相关权限管理…

    2022年6月9日
    30
  • 【知识小结】Git 个人学习笔记及心得

    【知识小结】Git 个人学习笔记及心得

    2021年10月23日
    42
  • tomcat无法启动程序 Error filterStart

    tomcat无法启动程序 Error filterStart有时在启动tomcat时,有的应该程序无法启动,tomcat报错信息如下:org.apache.catalina.core.StandardContextstartSEVERE:ErrorfilterStartorg.apache.catalina.core.StandardContextstartSEVERE:Contextstartupfaileddueto…

    2022年7月11日
    13
  • ubuntu18.04配置静态ip和动态ip[通俗易懂]

    ubuntu18.04配置静态ip和动态ip[通俗易懂]今天需要使用ubuntu系统作项目了,发现问题来了:所使用的主机(ubuntu18.04)之前是配置好的静态ip,现在实验室响应学校信息中心的号召,使用单人账号登陆了,每个人独享自己的20M带宽,网速溜得一匹。现在问题来了,如何恢复成动态ip呢?自己算是取巧了吧,查看的是如何配置静态ip,照着里面原始的ip配置,恢复了动态ip。1.ubuntu18.04配置静态ip注意:18.04…

    2022年5月2日
    141
  • PIP 更换国内安装源「建议收藏」

    PIP 更换国内安装源「建议收藏」pip国内的一些镜像  阿里云http://mirrors.aliyun.com/pypi/simple/  中国科技大学https://pypi.mirrors.ustc.edu.cn/simple/  豆瓣(douban)http://pypi.douban.com/simple/  清华大学https://pypi.tuna.tsinghua.edu.cn/simpl…

    2022年6月4日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号