zoukankan      html  css  js  c++  java
  • Verilog学习笔记

    作者:桂。

    时间:2017-06-24  11:07:40

    链接:http://www.cnblogs.com/xingshansi/p/7039237.html 


    前言

    Verilog是硬件描述语言,不算FPGA的核心部分,以前没有接触过,找了本书翻看一下(《Verilog数字系统设计教程第三版》),顺便记录一些基础知识,从第三章开始。

    第三章:模块结构、基本数据类型、基本运算符

      A-模块的结构

    0、模块基本定义

    一个基本的模块就是:

    module name(in1,in2,...out1,out2,...)

    //内部逻辑

    endmodulw

    模块基本定义涉及两个要点:1)其他模块作为input的调用;2)I/O位宽的设定。

    1、always用法

    情形一

           always @(a or b) begin
                        if(a) q<=b;
                        else q<=0;end
    这个块是每当 a b发生变化时执行 还是a或者b中有一个是1或2个都是1时执行?

    :每当A,B变化时,这个块就执行。 ALWAYS后面的叫敏感参数列表,不表示信号值,而是信号变化触发这个块的执行。

    一般的,

    如果ALWAYS块的敏感参数列表没有带时钟,这个块将被综合成一个组合回路。参照组合回路的真值表。当输入端任何一个信号变化时,输出将立即做相应的变化。
    如果ALWAYS后代的是时钟,那ALWAYS块将被综合成一个时序回路。一般情况下,当时钟变化时,ALWAYS块执行。

    情形二

     always @(a) begin
    如果这个a被定义为一个reg [4:0]时 程序怎么判断执行?

    :如果综合逻辑没有问题,就是a的每一个元素变化时,这个块都要执行。

    2、assign、wire、always

    则块的描述语言为:

    module muxtwo(out,a,b,s1)
    input a,b,s1;//输入信号
    output out;//输出
    wire ns1,sela,selb; //定义内部连接线
        assign ns1 = ~s1;
    	assign sela = a&ns1;
    	assign selb = b&s1;
    	assign out = sela|selb;
    endmodule
    

      其中assign声明语句。相当于连线,一般是将一个变量的值不间断地赋值给另一个变量.

    对于reg与wire:

    reg:

    reg用在过程赋值语句中,而wire用在连续赋值语句中。(或者说reg在过程块内赋值,而wire在过程块外赋值)
    举个简单的例子
    module test(a, b, c);
      input a;
      input b;
      output c;
      reg c;
     always @(posedge a)
     begin
      c = b;
     end
    endmodule
    这个时候,c只能声明为reg,因为c的赋值是在过程(procedure)中进行的。
     
    wire:
    module test(a, b, c);
      input a;
      input b;
      output c;
      wire c;
      assign c = a&b;
     endmodule
    这里只能用wire。
    结合上图,wire定义了内部的连接节点,assign指定了逻辑关系。

    3、实例元件

    如:and   #2  u1(q,a,b);

    该语句表示:输入为a、b,逻辑关系为“与”,输出为q,延迟2个单位时间(#2)输出。

      B-数据基本类型

    0、常量

    1)数字

    二进制整数:b/B;十进制整数:d/D,八进制整数:o/O,十六进制整数:h/H;

    8‘ha2 //位宽为8的十六进制

    2)x、z、?

    x:不定值

    z/?:高阻值

    3)负数

    -8’d5

    4)下划线

    只能用在数字之间

    16b'1010_1011_1111_0000

    不说明位数,默认是32位

    5)parameter

    parameter 参数名1=表达式, 参数名2= 表达式, 参数名3=表达式......

    1、变量

    1)wire型

    上文已提及,wire型数据常用来表示用以assign关键字指定的组合逻辑信号。 

    2)reg型

    reg数据默认的初始值为不定值x,常用来表示“always模块内的指定信号。”

    3)memory型

    主要用来表示数组

    reg [n-1,0] 存储器名[m-1,0];

      C-运算符及其表达式

    最多只能三个?待验证

    第四章:运算符、赋值语句和结构说明语句

      A-运算符

    0、等式运算符

    其中3、4包括x/z/?也进行比较,1、2则对此进行忽略。

    1、拼接运算符

    {a,b,c,...}实现拼接,

    特别的,{4{w}};//表示{w,w,w,w}

    2、缩减运算符

    reg[3:0] B;

    reg C;

      C = &B;

    相当于

      C = ((B[0]&B[1])&B[2])&B[3];//类似多米诺骨牌

      B-赋值语句和块语句

    0、非阻塞赋值

    1)赋值不是立刻发生;2)时序电路常用

    对应就是

    非阻塞:<=,阻塞:=

    1、阻塞方式(相当于 值 直接塞过来,阻塞。)

    1)立即赋值;2)时序电路慎用

    对应

    2、顺序块(begin ... end)

    按顺序逐条执行。

    —>A:表示触发事件A。

    begin

      语句1;

      语句2;

    end

    或者

    begin:块名

      语句;

    end

    3、并行块(fork... join)

    同时执行。

    与begin ... end定义同。

    第五章:条件语句、循环语句、块语句和生成语句

      A-条件语句

    0、条件语句

     条件语句必须在过程块中使用,即由initial/always构成的语句(initial第六章提及)。

    ex:

    always@(some_event)

    begein

      if ....

    end

     if同样可以内嵌:

    另外,$display,$write用于信息的显示和输出

    1、case语句

    2、循环语句

    1)forever语句:周期性执行,只能在initial中使用。

    2)repeat:

    表达式通常指定循环次数。

    3)while语句

    4)for语句

    3、生成块

    感觉这个在重复操作/子模块切割(如只修改局部)应该会起作用。

    genvar j;//借助genvar定义变量,且变量只能在generate中使用   ,generate variant → genvar.

    结构为:

    generate

    .....

    endgenerate

    另外,generate可以与for 、case、if等语句搭配使用,如:

     第六章:结构语句、系统任务、函数语句和显示系统任务

      A-结构说明语句

    verilog语言中,任何模块都从属于以下4类说明语句:

    1)initial语句;

    2)always语句;

    3)task语句;

    4)function语句。 

    1、initial

    顾名思义:initialize,初始化。初始化通常有两个作用:1)赋初始值;2)生成测试用的激励波形。

    2、always

    always跟着触发条件

    例如:

    特别的,always @(*),则囊括所有变量。

    这里遇到了wait语句:

    若count_enable为0,则继续等待,直到非零,执行#20 count = count+1;

    3、task

    task基本用法

    task调用形式:

    4、function

     function基本用法:

    调用与task类似。function细节定义较多,用到再补充

    task与function的不同点:

      B-常用系统任务

    文件读写则是fopen、fclose那一套。

    常用的为$display $write。

    第七章:调试用系统任务和常用编译预处理语句

      A-系统任务

    1、$monitor

    $monitoron:开,off:关,因为可能涉及到多处的monitor,因此借助off/on进行管理。

    2、$time

    当前时刻,不过受时间精确度的影响:`timescale 10 ns/1 ns//用法:`timescale <时间单位>/ <时间精度>

    3、$realtime

    同time,返回实数型。

    4、$finish

    退出仿真器

    5、$stop

    暂停模式。

    6、$random

    随机数。

      B-常用编译预处理

    1、宏定义

    `define

    与其他语言的宏定义 类似,例如用 signal 代替 string。

    也可以定义常量/表达式:

    `define expression a+b+c+d

    2、文件包含

    `include 

    调用其它verilog 文件。

    3、条件编译命令

    `ifdef  `else  `endif

    其他

    • negedge:negative edge,下降沿触发,例如与always连用:always @ (negedge reset or posedge clkin)
    • posedge:positive edge,上升沿触发
    • 解释:
      defparam Gen_ClkLed.divdWIDTH=23,Gen_ClkLed.divdFACTOR=10000000;//10_000_000分频
      gen_divd Gen_ClkLed(.reset(Resetb),.clkin(ClkIn),.clkout(ClkLed));
      涉及defparam 以及.v的调用

  • 相关阅读:
    httpcontext in asp.net unit test
    initialize or clean up your unittest within .net unit test
    Load a script file in sencha, supports both asynchronous and synchronous approaches
    classes system in sencha touch
    ASP.NET MVC got 405 error on HTTP DELETE request
    how to run demo city bars using sencha architect
    sencha touch mvc
    sencha touch json store
    sencha touch jsonp
    51Nod 1344:走格子(贪心)
  • 原文地址:https://www.cnblogs.com/xingshansi/p/7039237.html
Copyright © 2011-2022 走看看