Verilog学习笔记01

作者:桂。

时间: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:

[email protected](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

.....

endgenerate

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

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

  A-结构说明语句

  B-常用系统任务

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

第八章:语法概念总复习练习

第九章:verilog HDL模型的不同抽象级别

第十章:如何编写和验证简单的纯组合逻辑模块

第十一章:复杂数字系统的构成

第十二章:在verilog HDL设计中启用同步时序逻辑

第十三章:设计可综合的状态机的指导原则

第十四章:深入理解阻塞和非阻塞赋值的不同

第十五、六章:较复杂时序逻辑电路设计实战

第十七章:简化的RISC_CPU设计

时间: 2024-07-31 23:16:03

Verilog学习笔记01的相关文章

【opengl 学习笔记01】HelloWorld示例

<<OpenGL Programming Guide>>这本书是看了忘,忘了又看,赶脚还是把笔记做一做心里比较踏实,哈哈. 我的主题是,好记性不如烂笔头. ================================================================ 1. 下载glut库 glut库地址为:www.opengl.org/resources/libraries/glut/glutdlls37beta.zip glut全称为:OpenGL Utilit

HTTP 学习笔记01

HTTP   hypertext transfer protocol (超文本传输协议) TCP/IP 协议集中的一个应用层协议 用于定义WEB浏览器与WEB服务器之间交换数据的过程以及数据本身的格式 HTTP 1.0  会话方式 HTTP 1.1 方式 HTTP 请求消息结构 一个请求行,若干消息头,以及实体内容 其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开. GET   方式下是没有实体内容的 POST .PUT.DELETE 方式下请求消息才可以包含实体内容 HT

SWIFT学习笔记01

1.Swift,用来判断option是不是nil,相当于OC的 if(option) if let name = option{ greeting = "if=====" }else{ greeting = "else===" } 2.运行switch中匹配到的子句之后,程序会退出switch语句,并不会继续向下运行,所以不需要在每个子句结尾写break. 3.//使用..创建的范围不包含上界,如果想包含的话需要使用...,集合上,就是[)与[]的关系 for i

C++ GUI Qt4学习笔记01

C++ GUI Qt4学习笔记01 qtc++signalmakefile文档平台 这一章介绍了如何把基本的C++只是与Qt所提供的功能组合起来创建一些简单的图形用户界面应用程序. 引入两个重要概念:一个是“信号和槽”,另一个是“布局”. 窗口部件(widget)是用户界面的一个可视化元素,相当于windows系统中的“控件”和“容器”.任意窗口部件都可以用作窗口. 1.1Hello Qt 正确安装Qt4开发环境,创建工程目录hello,源代码文件名为hello.cpp,进入hello目录 (1

HTML学习笔记01

HTML学习笔记 HTML学习笔记01 一.HTML的定义 1 HTML就是"HyperText Markup Language","超文本标记语言".2 HTML不是<color="red">编程语言,而是一种标记语言.3 标记语言是一套标记标签.4 HTML使用标记标签来描述网页. 二.HTML标签 1 HTML标签是由尖括号包围的关键词.2 HTML标签通常是成对出现的.3 标签对中的第一个标签是开始标签,第二个标签是结束标签.

MVC4 学习笔记01

1 . ASP.NET MVC 中 ActionResult 和 ViewResult 在使用上的区别是什么?要注意什么吗? ActionResult 是一个抽象(abstract)类,ViewResult 只是ActionResult 的一个实现(implementation).如果你确认你返回的是一个视图(view),你可以直接返回类型为ViewResult.ActionResult 有很多的派生类,如果你很确定你要返回的类型,你可以明确的返回该类型.如果你并不是很清楚,或者你根本不想去理解

python学习笔记(01):python和c语言 标识符命名规则比较

python标识符命名规则:标识符的第一个字符必须是字母表中的字母(大写或小写)或者一个下划线(‘ _ ’).标识符名称的其他部分可以由字母(大写或小写).下划线(‘ _ ’)或数字(0-9)组成.标识符名称是对大小写敏感的.例如,myname和myName不是一个标识符.注意前者中的小写n和后者中的大写N.有效 标识符名称的例子有i.__my_name.name_23和a1b2_c3.无效 标识符名称的例子有2things.this is spaced out和my-name. c语言标识符命

C++学习笔记——01

最近准备跳槽的事情,于是把C++翻出来看,顺便做了一些练习,主要是数据结构方面的,就贴在这里做个系列,权当督促自己了. 第一天,写了一个栈,调试了下没什么问题,内存泄露的问题也解决了. 1 #ifndef STACK_H 2 #define STACK_H 3 4 #include "stdlib.h" 5 #include "iostream" 6 7 class Stack 8 { 9 private: 10 typedef int NODE_DATA_TYPE

DirectX10学习笔记&lt;01&gt; 搭建环境-在Visual Studio中配置DirectX

一.工具下载 IDE:Visual Studio 2008 SDK:DirectX SDK,可以从Microsoft的网站上免费下载到.SDK中还包含示例.工具和文档.自带的工具很有用,我们会经常使用其中的DDS纹理工具. 二.设置Visual Studio 2008 菜单栏->Tools->Options... 左边选择Projects and Solutions->VC++ Directories 右边Show directiories for:选择Include files,往下列