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的调用

  • 相关阅读:
    抽象线程之Parallel类
    任务
    创建线程之Thread类和线程池
    创建线程之异步委托
    折半插入排序
    单链表的使用(插入,查找,删除,链表的倒置,删除相同结点)
    插入排序
    [Python]小甲鱼Python视频第034课(with else)课后题及参考解答
    [Python]小甲鱼Python视频第033课(except)课后题及参考解答
    [Python]小甲鱼Python视频第32课(except)课后题及参考解答
  • 原文地址:https://www.cnblogs.com/xingshansi/p/7039237.html
Copyright © 2011-2022 走看看