作者:桂。

时间: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的调用

Verilog学习笔记的更多相关文章

  1. Verilog学习笔记简单功能实现(二)...............全加器

    先以一位全加器为例:Xi.Yi代表两个加数,Cin是地位进位信号,Cout是向高位的进位信号.列表有:   Xi     Yi    Cin Sum Cout 0 0 0 0 0 0 0 1 1 0 ...

  2. Verilog学习笔记基本语法篇(十二)········ 编译预处理

    h Verilog HDL语言和C语言一样也提供编译预处理的功能.在Verilog中为了和一般的语句相区别,这些预处理语句以符号"`"开头,注意,这个字符位于主键盘的左上角,其对应 ...

  3. Verilog学习笔记基本语法篇(十一)········ 常用系统函数

    1)系统任务:$monitor   格式: $monitor(p1,p2,p3...pn); $monitor; $monitoron; $monitoroff; 任务$monitor提供了监控输出列 ...

  4. Verilog学习笔记基本语法篇(十三)...............Gate门

    Verilog中已有一些建立好的逻辑门和开关的模型.在所涉及的模块中,可通过实例引用这些门与开关模型,从而对模块进行结构化的描述. 逻辑门: and (output,input,...) nand ( ...

  5. Verilog学习笔记简单功能实现(六)...............计数分频电路

    在分频器电路中最重要的概念有两个:1)奇分频/偶分频:2)占空比. A)其中最简单的就是二分频电路,占空比为50%,其Verilog程序为 module half_clk(clr,clk_in,clk ...

  6. Verilog学习笔记简单功能实现(五)...............序列检测设计

    这里采用夏宇闻教授第十五章的序列检测为例来学习; 从以上的状态转换图可以写出状态机的程序: module seqdet(x,out,clk,rst); input x,clk,rst; output ...

  7. Verilog学习笔记设计和验证篇(五)...............层次化事件队列

    详细的了解层次化事件队列有助于理解Verilog的阻塞赋值和非阻塞赋值功能.所谓层次化事件队列指的是用于调度仿真时间的不同Verilog事件队列.在IEEE的5.3节中定义了层次化事件队列在逻辑上分为 ...

  8. Verilog学习笔记设计和验证篇(三)...............同步有限状态机的指导原则

    因为大多数的FPGA内部的触发器数目相当多,又加上独热码状态机(one hot code machine)的译码逻辑最为简单,所以在FPGA实现状态机时,往往采用独热码状态机(即每个状态只有一个寄存器 ...

  9. Verilog学习笔记简单功能实现(三)...............同步有限状态机

    在Verilog中可以采用多种方法来描述有限状态机最常见的方法就是用always和case语句.如下图所示的状态转移图就表示了一个简单的有限状态机: 图中:图表示了一个四状态的状态机,输入为A和Res ...

  10. Verilog学习笔记简单功能实现(一)...............D触发器

    module D_flop(data,clk,clr,q,qb); input data,clk,clr; output q,qb; wire a,b,c,d,e,f,ndata,nclk; nand ...

随机推荐

  1. 【statistics】理想论坛2018-4-25日统计

    说明:利用理想论坛爬虫1.07版(http://www.cnblogs.com/xiandedanteng/p/8954115.html) 下载了前十页主贴及子贴,共得到359619条数据,以此数据为 ...

  2. (算法)前K大的和

    题目: 1.有两个数组A和B,每个数组有k个数,从两个数组中各取一个数加起来可以组成k*k个和,求这些和中的前k大. 2.有N个数组,每个数组有k个数,从N个数组中各取一个数加起来可以组成k^N个和, ...

  3. shell综合

    既可恶又不得不注意的地方: 1.if 与[ 之间必须有空格, 2.[ ]与判断条件之间也必须有空格, 3.]与; 之间不能有空格, 4.变量赋值的时候,等号两边不能有空格, 调试:sh -x xxx. ...

  4. T-SQL 之 游标

    游标是面向行的,它会使开发人员变懒,懒得去想用面向集合的查询方式实现某些功能. 在性能上,游标会占有更多的内存,减少可用的并发,占用带宽,锁定资源,当然还有更多的代码量. 用一个比喻来说明为什么游标会 ...

  5. 简单分页查询(web基础学习笔记十三)

    一.建立资源文件和工具类 1.1 .database.properties jdbc.driver_class=oracle.jdbc.driver.OracleDriver jdbc.connect ...

  6. Flash builder 调试技巧 (分享)

    如果这个Flash能直接自己运行,例如Air或者简单不依赖于外部网页的flash,当然非常容易调试.直接F11嘛~~~   但是,如果这个Flash要依赖于外部环境才能运行,那该怎么调试呢?   核心 ...

  7. 判断URL是否支持断点续传?

    #python #xiaodeng #判断URL是否支持断点续传? import urllib2 req = urllib2.Request('http://ftp.ubuntu.com/') req ...

  8. iptables阐述防火墙

    一:前言   防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种.无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘.而我们的任务就是需要去定义到底防 ...

  9. 微信小程序:酒店订房之时间选择器 picker

    下单页面,选择开始日期和结束日期,不废话,直接代码: 1.wxml: <picker mode="date" value="{{date1}}" star ...

  10. 如何解决普通用户使用sudo找不到命令

    一.在linux的普通用户下,要使用root权限的命令需要使用sudo [dev@dev1 client_api]# sudo git pull origin develop sudo: git: c ...