zoukankan      html  css  js  c++  java
  • <转>verilog hdl中常数声明

    1、语法
    声明:
    parameter xx = yy;
    `define XX YY

    使用:
    xx
    `XX

    2、作用域
    parameter 作用于声明的那个文件;`define 从编译器读到这条指令开始到编译结束都有效,或者遇到`undef命令使之失效。

    如果想让parameter或`define作用于整个项目,可以将如下声明写于单独文件,并用`include让每个文件都包含声明文件:
    `ifndef xx
     `define xx yy // or parameter xx = yy;
    `endif

    `define也可以写在编译器最先编译的文件顶部。通常编译器都可以定义编译顺序,或者从最底层模块开始编译。因此写在最底层就可以了。

    3、作用
    parameter可以用作例化时的参数传递。具体方法参见《Verilog例化时的参数传递》一文

     

     

    数字声明

    Verilog中有两种数字生命:指明位数的数字不指明位数的数字

    指明位数的数字表示形式:<size>’<base format><number>

    Size用来指明数字位宽度,只能用十进制整数表示

    Base format包括十进制(’d或’D),二进制(’b或’B),八进制(‘o或’O),十六进制(‘h或’H)

    例如

    4’b1111       //4位2进制数

    12’h3ac      

    要注意的是这不是表示12位16进制数,表示12位二进制显示是16进制数

     

    例子

    parameter LinePeriod =12'd1040;

    parameter H_SyncPulse=8'd120;

    parameter H_BackPorch=10'd1040;

    parameter H_ActivePix=706;

     

    综合(Synthesize)后

           LinePeriod = "010000010000"

    H_SyncPulse = "01111000"

    H_BackPorch = "0000010000"

    H_ActivePix = "00000000000000000000001011000010"

     

       可以看出12’d 不是表示有12位十进制,而是表示有12位二进制。如果没有限定位数,ISE综合时默认为32位,所以编Verilog的时候不要超过32位。

       如果限定多余32位的话,综合时会报错。

     

    parameter H_ActivePix=33'b706;

     

    会报错,报错信息如下:

     

    ERROR:HDLCompilers:34 - "VGA_800X600.v" line 19 Illegal digit(s) in binary constant '706'

     

    还有注意的一个问题是LinePeriod和H_BackPorch都是1040(十进制),1040二进制为11位(2的十次方为1024),但“H_BackPorch”没有因为位数不够报错,但是把高位截掉了,变成“0000010000”,所以在Verilog编程的时候要注意赋值问题。

     

    不限定位数,默认为32位,这很浪费寄存器资源。

    限定位数小于常数的位数时,赋值就不正确了。

        所以赋值的位数要有富裕但不至于太浪费寄存器资源

  • 相关阅读:
    浅析BIO、NIO、AIO
    equals()和hashCode()区别
    mysql分区
    java反射
    设计模式
    两个线程一个生产者个一个消费者
    Redis事务
    常用面试题
    springboot整合redis(注解形式)
    ElasticSearch6更新与重大变化
  • 原文地址:https://www.cnblogs.com/icdz1990/p/4196715.html
Copyright © 2011-2022 走看看