硬件语言 Verilog HDL 学习 day01 了解基本知识,基本语法2,运算符,表达式

1.数字集成电路设计

数字集成电路设计方法的演变:

1. 以元件为基础

2.以单元为基础,

3.以 RTL 综合为基础

4. 以IP为基础。


2.集成电路的发展阶段

1. 第一阶段:以加工制造为主导的 IC  产业发展的初级阶段  (产品: 简单的微处理器

2.第二阶段: 是标准工艺加工线公司与IC 设计公司共同发展的阶段  (产品: MPU,微处理器)

3.第三阶段: IC产业的 四业 开始分离,功能强大的通用型中央处理器 和信号处理器

4.第四阶段: IC 产业开始以 Fundry 为主导,IP的使用广泛。


3.功能模块的可重用性

1. 软核(Soft IP Core)
软核在EDA 设计领域指的是综合之前的寄存器传输级(RTL) 模型;具体在FPGA 设计中指的是对电路的硬件语言描述,包括逻辑描述、网表和帮助文档等。软核只经过功能仿真,需要经过综合以及布局布线才能使用。其优点是灵活性高、可移植性强,允许用户自配置;缺点是对模块的预测性较低,在后续设计中存在发生错误的可能性,有一定的设计风险。软核是IP 核应用最广泛的形式。

2. 固核(Firm IP Core)
固核在EDA 设计领域指的是带有平面规划信息的网表;具体在FPGA 设计中可以看做带有布局规划的软核,通常以RTL 代码和对应具体工艺网表的混合形式提供。将RTL 描述结合具体标准单元库进行综合优化设计,形成门级网表,再通过布局布线工具即可使用。和软核相比,固核的设计灵活性稍差,但在可靠性上有较大提高。目前,固核也是IP 核的主流形式之一。

3. 硬核 (Hard IP Core)
硬核在EDA 设计领域指经过验证的设计版图;具体在FPGA 设计中指布局和工艺固定、经过前端和后端验证的设计,设计人员不能对其修改。不能修改的原因有两个:首先是系统设计对各个模块的时序要求很严格,不允许打乱已有的物理版图;其次是保护知识产权的要求,不允许设计人员对其有任何改动。IP 硬核的不许修改特点使其复用有一定的困难,因此只能用于某些特定应用,使用范围较窄。
 



4.Verilog HDL  语言要素

1.空白符  :空格符(\b),制表符(\t),换行符,换页符,

2.注意符 :  //  注释一行,   注释多行 /*   */     (注释最好是英文)

3.标识符:   标识符包含:字母,数字,$, _ (下划线),  开头只能是 字母和下划线

4.转义标识符: \

5.关键字: 系统自带的标识符,有固定的意义。

6.Verilog HDL 四种状态: 0 (低电平), 1(高电平) , x(未知态) , z (高阻态)-》总线

7.负数,  补码形式存在

8. 数值进制 , 二进制 b/B, 八进制 o/O, 十进制 d/D,  十六进制 h/H.

9.整数表示,

10.实数表示: (不能用于设计) 十进制表示,  科学计数法,



5.数据类型

物理数据类型:连线型、寄存器型和存储器型数据类型;信号强度表示数字电路中不同强度的驱动源,用来解决不同驱动强度存在下的赋值冲突:

驱动能力:
                                       

标记符    名称      类型 强弱程度
supply  电源级驱动 驱动 最强
strong    强驱动    驱动  逐渐下降
pull 上拉级驱动 驱动 逐渐下降
large 大容性 存储 逐渐下降
weak 弱驱动 驱动 逐渐下降
medium 中性驱动 存储 逐渐下降
small 小容性 存储 逐渐下降
highz 高容性 高阻

 


连线型数据类型:

连线型数据类型 功能说明
wrie,tri 标准连线 (缺省为该类型)
wor,trior 多重驱动时,具有线或特性的连线型
wand,trand 多重驱动时,具有线与特性的连线型
trireg 具有电荷保持特性的连线型数据
tri1 上拉电阻
tri0 下拉电阻
supply1 电源线,用于对电源建模,为高电平1
supply0 电源线,用于对地 建模, 为低电平0


寄存器: reg型

reg型是数据储存单元的抽象类型,其对应的硬件电路元件具有状态保持作用,能够存储数据,如触发器、锁存器等。
reg型变量常用于行为级描述,由过程赋值语句对其进行赋值。
reg型变量简单例子,
reg a:   //定义一个一也的名为a的reg变量
reg [3:0] b:  //  定义一个4位的名为b的reg型变量
reg[8:1]c.d.e;   //定义了三个名称分别为c、d、 e的8位的reg型变量

reg型变量一般为无符号数,若将一个负数赋给reg型变量,则自动转换成其二进制补
码形式。例如:
reg signed[3:0]rega;

rega=-2;  // rega的值为1110(14),是2的补码

原码: 0010

反码: 1101

补码: 1110



5.运算符与表达式

1.算数操作符,  加法(+),减法(-),乘法(*),除法(/), 取模(%)

重点:算术操作符的结果是位宽。算术表达式结果的长度是由最长操作数决定的,再赋值语句中,算术操作结果由操作最左端目标长度决定

一,加法

reg[3:0]a,b,c;
Reg[1:0]d,k;
a=4'b1001
d=2'b01

b=a+d   //b=4'b1010
k=a+d   //k=2'b10

二,减法

reg[3:0]a,b,c;
Reg[1:0]d,k;
a=4'b1001
d=2'b01

b=a-d   //b=4'b1000
k=a-d   //k=2'b00

三,乘法

reg[3:0]a,b,c;
Reg[1:0]d,k;
a=4'b1001
d=2'b01

b=a*d   //b=4'b1001
k=a*d   //k=2'b01

四,除法

reg[3:0]a,b,c;
Reg[1:0]d,k;
a=4'b1001
d=2'b01

b=a/d   //b=4'b1010
k=a/d   //k=2'b01

五,取模

reg[3:0]a,b,c;
Reg[1:0]d,k;
a=4'b1001
d=2'b11

b=a%d   //b=4'b0000
k=a%d   //k=2'b00

2.关系操作运算符 :  大于(>),小于(<),大于等于(>=) ,小于等于  (<=)  

重点:任何和不定状态的运算输出都是不定状态,但我们不会遇到,在数电中对不定状态管理非常严格。我们都知道产生不定状态只有两种情况一种是信号悬空,另一种是2个信号对一个信号驱动。(两个信号输入只有一个非门输出)

简单  (不知道对比的话,转为十进制自己看看 就行了)

重要的是:   不定态的加入

a = 3;

d = 4'hx    //不定状态

$display(a<=d)     //out x

3.相等关系符

有四种相等的关系符:  == (等于), !=(不等于)   ,  ===(全等), !==  (非全等)

重要:值得注意的是,我们经常会使用全等,因为相比较于等于,全等不会让不确定状态向下传播。还有就是不允许不同位宽信号对比。

一,== 等于关系符的 真值表

== 等于真值表
==0 0 1 x z
0 1 0 x x
1 0 1 x x
x x x x x
z x x x x

二,=== 等于关系符的真值表  (去除了 不定态)

=== 全等于关系符真值表
=== 0 1 x z
0 1 0 0 0
1 0 1 0 0
x 0 0 1 0
z 0 0 0 1

module xx_2;
reg[3:0]a,b,c,d;
initial
    begin
        a=4'b0xx1;
        b=4'b0xx1;
        c=4'b0011;
        d=2'b11;
        $display(a==b);   //结果为  x
        $display(c==d);   //结果为  1
        $display(a===b);  //结果为  1
        $display(c===d);  //结果为  0   (=== 算了位数在规则里面)

4.逻辑运算符  &&  (逻辑与) ,  ||  (逻辑或), !(逻辑 非)

  重点:若操作数有不定状态,则逻辑运算的结果也是不定状态

a=4'b1110;    //a=1  (可以这样理解)
b=4'b0000;    //b=0  (可以这样理解)
c=2'b10;      //c=1   (可以这样理解)

!a=0;
!b=1;
!c=0;

a&&b=0;
a&&c=0;
b&&c=0;

a||b=1;
a||c=0;
b||C=1;

5.按位操作符

按位取反“~”,按位与“&”,按位或“|”,按位异或“^”,按位同或“^~”

重点: 比较位置少的  自动补 0  比较

module bit
reg[2:0]a;
reg[3:0]b;
initial
    begin
                    // 因为 计算的时候一般是 位数相同的所以  a= 4'b   4位数
        a=4'b110;  // 运算的时候 在前面自动补一个 0  a=4'b0110
        b=4'b0001;
        $display("%b",~a);    //结果为 4'b1001
        $display("%b",~b);    //结果为 4'b1110
        $display("%b",a&b);   //结果为 4'b0000
        $display("%b",a|b);   //结果为 4’b0111
        $display("%b",a^b);   //结果为 4'b0111
    end
endmodule

6.移位操作符  << 左移   >>右移

a=4'b0110
$display("%b",a>>2);   //结果为 4'b0001
$display("%b",a<<2);   //结果为 4'b1000

7.条件运算符    (三目运算符)

module mux2(in1,in2,sel,out);
input [3:0]in1,in2;
input sel;
output [3:0]out;
reg [3:0]out;
assign out=(!sel)?in1:in2;
//sel为0时out等于inl,反之out等于in2
endmodule

8.连接和复制运算符

一,连接操作符:{信号1的某几位,……,信号n的某几位}

二,重复操作符{{}}:讲一个表达式放入最里面,外层放入复制因子。

module con11;
reg [2:0]a;
reg [3:0]b;
reg [7:0]c;
reg [4:0]d;
reg [5:0]e;
    initial
    begin
        a=3'b101;
        b=4'b1110;
        c={a,b};   //连接操作  a和b全部连接
        d={a[2:1],b[2:0]};   //连接操作  a的[2-1]位, b的 [2-0]位 连接,a在前面
        e={2{a}};// 复制操作符  复制两个a
        $display("%b",c);//结果7'b1011110
        $display("%b",d);//结果5'b10110
        $display("%b",e);//结果6'b101101
    end
endmodule