Uploaded by lihc1314i

第7讲 存储器、Verilog HDL硬件描述语言基础(1)

advertisement
数字电路与系统
第6讲
触发器与存储器
概述
存储器与寄存器的不同之处
➢ 用途(相同)——存储电路的历史状态
➢ 电路功能
• 对于状态方程
当前状态= H (历史状态,当前输入)
~~~ ~~~~~~
▪ 寄存器:
▪ 存储器:连线和附加的组合逻辑译码
程序存储器
寄存器
数据存储器
概述
器件结构
寄存器
存储器
存储单元
触发器
管存储单元
存储密度
低
高
访问方式
连线
地址译码结合读/写脉
冲
访问操作
并发
每次只能读/写部分存
储数据
概述
存储器的地址
➢“因为半导体存储器的存储单元数目极其庞大而器件的引脚
数目有限,所以在电路结构上就不能像寄存器那样把每个存
储单元的输入和输出直接引出。
➢为了解决这个矛盾,在存储器中的每个存储单元编了一个地
址,只有被输入地址代码指定的那些存储单元才能与公共的
输入/输出引脚接通,进行数据的读出或写入。 ”
➢地址、数据、读写控制 三总线结构
存储器的容量 = 字数×位数(字长)
概述
半导体存储器
半导体存储器的分类
随机存取 RAM:Random-Access Memory
SRAM
DRAM
只读 ROM:Read-Only Memory
掩模ROM、PROM
EPROM、E2PROM、FLASH
概述
半导体存储器
5.7.1 随机存取存储器(RAM)
5.7.2 只读存储器(ROM)
存储器的应用——专题
➢ 存储器的扩展
5.7.1 随机存取存储器
特点
➢可以随时从任何一个指定的地址读出数据,也可以随
时将数据写入任何一个指定的存储单元中去
➢掉电后存储的数据丢失
静态随机存储器 SRAM
动态随机存储器 DRAM
➢比静态的集成度高
5.7.1随机存取存储器
RAM的基本结构
➢
行/列地址译码
·····
·
···
地
址
输
入
行
地
址
译
码
器
数据总线
存储矩阵
读/写
控制器
输入/输出
读写控制
列地址译码器
…
地址输入
思考:为什么有“行/列”地址译码?
➢ 减少译码器复杂度、节省芯片内部的走线
控制信号:片选 CS ,读/写控制 R / W
5.7.1随机存取存储器
静态RAM
静态随机存储器 SRAM
➢ 由于CMOS电路具有微功耗的特点,尽管它的制造工艺比
NMOS复杂,但在大容量的静态存储器上采用CMOS存储单
元。
➢ CMOS工艺的SRAM还能够在降低电源电压的状态下保存数
据。
5.7.1随机存取存储器
静态RAM
静态随机存储器 SRAM
=0
VDD
VDD
保存状态
0=
=1
5.7.1随机存取存储器
静态RAM
静态随机存储器 SRAM
=0
VDD
保存状态
VDD
断开
断开
断开
=1
0=
断开
5.7.1随机存取存储器
静态RAM
静态随机存储器 SRAM
=0
VDD
保存状态
VDD
断开
断开
断开
=1
0=
GND
VDD
断开
5.7.1随机存取存储器
静态RAM
静态随机存储器 SRAM
=0
VDD
保存状态
VDD
VDD
断开
断开
断开
=0
1=
断开
GND
5.7.1随机存取存储器
静态RAM
静态随机存储器 SRAM
=1
VDD
VDD
断开
断开
读取状态
1=
=0
5.7.1随机存取存储器
静态RAM
静态随机存储器 SRAM
=1
GND
VDD
写入状态
0=
=1
5.7.1随机存取存储器
动态随机存储器 DRAM
动态RAM
利用MOS管栅极电容可以存储电荷的原理制成
为了及时补充漏掉的电荷以避免存储的数据丢失,必须定时地
给栅极电容补充电荷,称为刷新或再生。
➢ 刷新控制电路(外接或内部集成)
大容量,高集成度
➢ 存储单元:四管、三管, 单管
➢ 单管虽然外围控制电路比较复杂,但有利于提高集成度
5.7.1随机存取存储器
动态RAM
动态随机存储器 DRAM
D
保存状态
VDD or GND
断开
Qn+1=D
5.7.1随机存取存储器
动态RAM
动态随机存储器 DRAM
断开
VDD
读取状态
D=Qn
Qn
5.7.1随机存取存储器
动态随机存储器 DRAM
VDD
写入状态
Qn+1=VDD
5.7.1随机存取存储器
动态RAM
SRAM与DRAM的对比
6T~10T
32~64 Mbytes:CPU缓存
1T1C
~Gbytes:主存
5.7.1随机存取存储器
存储器容量的扩展
位扩展
8位、16位、32位、64位…
位扩展方式:字数(存储单元的个数)够用,而位
数(字的宽度)不够
扩展连线方法:
➢地址线并联
➢控制线并联( R / W 、CS )
➢每一片的双向数据线(I/O)按位的高低排列好
5.7.1随机存取存储器
存储器容量的扩展
位扩展
例:将1024*1的RAM扩展成1024*8
A9
R/W
CS
I/O
I/O
1024×1
1024×1
1024×1
RAM(0)
RAM(1)
RAM(7)
A0 A1 … A9 R/W CS
…
A0 A1 … A9 R/W CS
…
A0 A1 … A9 R/W CS
…
…
……
……
…
A0
A1
I/O
I/O0
I/O1
I/O7
5.7.1随机存取存储器
存储器容量的扩展
字扩展
➢ 将RAM(ROM)接成字数更多的存储器
➢ 地址扩展
例:
用256×8位RAM接成1024 ×8位
• 用4片
• “然而每片RAM上的地址输入范围只是8位,给出的
地址范围全是0~255,无法区分4片中同样的地址单
元”
• 回顾:寻址——译码产生新的译码信号实现选片逻
辑
5.7.1随机存取存储器
存储器容量的扩展
字扩展
字扩展的连线方法
➢ 地址线
• 原有的地址线并联;
• 用译码器对增加的外部地址线进行译码,译码后的
2n-m 根线分别连接RAM的片选,实现选片功能
➢ 数据线并联
➢ 控制线:
• 读写脉冲 R / W 并联
• 新的 CS 信号(利用译码器上的选通信号)
5.7.1随机存取存储器
存储器容量的扩展
字扩展
…
I/O0 I/O1
……
……
256×8
8,9
A8
A9
CS
R/W
256×8
I/O7 I/O0 I/O1
……
……
256×8
I/O7 I/O0 I/O1
00 xxxx xxxx
01 xxxx xxxx
10 xxxx xxxx
RAM(0)
RAM(1)
RAM(2)
……
……
I/O7
I/O7
256×8
11 xxxx xxxx
RAM(3)
A0 A1 … A7 R/W CS A0 A1 … A7 R/W CS A0 A1 … A7 R/W CS A0 A1 … A7 R/W CS
…
…
…
…
…
A0
0~7 A1
A7
I/O7 I/O0 I/O1
……
……
I/O0
I/O1
I/O2
A0 /Y0
/Y1
A1 /Y2
S /Y3
I/O6
5.7.1随机存取存储器
存储器容量的扩展
存储器扩展
如果RAM(ROM)的位数和字数都不够用,就
需要同时采用位扩展和字扩展
➢CPU的地址线——
(要考虑实际应用中需要的地址空间的大小)
➢CPU的数据线——
➢地址空间(编址)——(映像)——存储器
5.7.1随机存取存储器
存储器容量的扩展
例:以256×1的RAM芯片扩展为1k的内存,且数据线宽度为8。
➢ 分析:
• 位扩展 1bit → 8bit
• 字扩展 考虑1k的存储器需要几根地址线? ——10根
位扩展
5.7.1随机存取存储器
存储器容量的扩展
例:以256×1的RAM芯片扩展为
1k的内存,且数据线宽度为8。
(0,0)
(1,0)
(3,0)
(0,1)
(1,1)
(3,1)
(0,7)
(1,7)
(3,7)
字扩展
5.7.2 只读存储器
ROM的结构
➢ 存储矩阵、地址译码器、输出缓冲器
➢ 数据线、地址线、选通控制线
➢ 存储单元的结构——
用通/断表示“0 / 1”
5.7.2 只读存储器
◼
固定ROM(掩膜ROM)
➢ 厂家把数据写入存储器中,用户无法进行修改
◼
一次性可编程ROM(PROM)
➢ 出厂时存储内容全为1(或全为0),用户可根据自己的需要编程一次
◼
光可擦除可编程ROM(EPROM)
➢ 用浮栅技术生产的可编程存储器,其内容可通过紫外线照射而被擦除
◼
电可擦除可编程ROM(E2PROM)
➢ 采用浮栅技术,其存储单元的是隧道MOS管,可用电擦除,擦除速度
毫秒量级
◼
快闪存储器(Flash Memory)
➢ 采用浮栅型MOS管,电擦除方式,数据写入方式与EPROM类似,擦除
/写入速度快,集成度高
5.7.2 只读存储器
掩膜ROM和PROM
➢ 掩膜——光刻IC工艺
➢ PROM
• 既然在存储矩阵中,“0”和“1”是
用位线和字线是否连通(上图中,
“1”连通)表达的;
• 出厂时,存储矩阵交叉点用熔丝连接
• 编程脉冲
❖即为大电流“写”,将“0”的
位熔断
• 一次编程
5.7.2 只读存储器
E2PROM 和 快闪存储器(Flash Memory)
➢ 电信号可擦除、可编程ROM;
➢ 存储单元:
❖ E2PROM:叠栅结构MOS管+选通管。
❖ Flash:单管叠栅结构;全部源级连在一起的MOS管单元,可以被同时擦除。
E2PROM
Flash
隧道区30~40nm
隧道区10~15nm
考虑电容分压:
“控制栅—浮置栅”
的电容和“浮置
栅—源区”的电容
存储器
小结
半导体存储器
随机存取存储器
• SRAM – 6T结构
• DRAM – 1T1C结构
• 位、字扩展
只读存储器
• 掩模ROM、PROM – 一次
• EPROM、E2PROM、FLASH
数字电路与系统
第8讲
Verilog HDL硬件描述语言基础
二、HDL与Verilog的简介
Verilog HDL的概念与历史
HDL语言
➢ HDL是一种独立于硬件平台的,硬件逻辑描述语言;
➢ HDL可用于描述硬件电路的结构,也可描述硬件电路的行为,
HDL是对硬件电路的抽象描述,这种描述具有多种级别。
行为级:技术指标和算法的HDL描述,容易理解
RTL级:逻辑功能的HDL描述,稍难理解
门级 :逻辑结构的HDL描述,很难理解
开关级:具体的晶体管物理器件的描述,基本不能理解
其中,RTL级的描述是行为级描述的一个子集,RTL级的描述可以
进行综合并用FPGA或者ASIC实现。
Verilog HDL的概念与历史
HDL语言的分类
➢ 主要有两种:Verilog 和 VHDL
➢ Verilog由商业公司发明,起源于C语言,因此非常类似于C语言,
容易掌握
➢ VHDL由美国军方提出,起源于ADA语言,格式严谨,不易学习
VHDL代码
Verilog代码
architecture MLU_DATAFLOW of MLU is
signal A1:STD_LOGIC;
signal B1:STD_LOGIC;
signal Y1:STD_LOGIC;
signal MUX_0, MUX_1, MUX_2, MUX_3: STD_LOGIC;
begin
A1<=A when (NEG_A='0') else not A;
B1<=B when (NEG_B='0') else not B;
Y<=Y1 when (NEG_Y='0') else not Y1;
MUX_0<=A1 and B1;
MUX_1<=A1 or B1;
MUX_2<=A1 xor B1;
MUX_3<=A1 xnor B1;
with (L1 & L0) select
Y1<=MUX_0 when "00",
MUX_1 when "01",
MUX_2 when "10",
MUX_3 when others;
end MLU_DATAFLOW;
Verilog HDL的概念与历史
Verilog 的抽象级别的描述举例
➢ 行为级/算法级
➢
RTL级/功能级
integer fp;
initial
begin
fp=$fopen(“result_out.txt");
end
always @(posedge clk)
if(ena==1’b1)
$fdisplay(fp,"%2d",result*4);
else
$fdisplay(fp,"%3d", result*6);
描述可以不对应具体电路,可广泛使
用各种函数,代码最终的运行平台为
计算机,不一定可综合
描述对应具体电路,代码
最终的运行平台为FPGA
或者ASIC,可综合
Verilog HDL的概念与历史
Verilog 的抽象级别的描述举例
➢ 门级/结构级
module
maxgate(a,b,out,outbar,sel);
input a,b,sel;
output out,outbar;
wire out1,out2;
assign out1 = a&sel;
assign out2 = b&(~sel);
描述对应具体电路,也可综合
➢ 开关级/物理级
可用于描述晶体管的具体参数,
本课程不涉及
wire out,outbar;
assign out = out1|out2;
assign outbar = ~out;
endmodule
Verilog HDL的概念与历史
Verilog 的不同抽象级别的功能总结
➢ 行为级的描述具有非常宽松的语法约束,可能无法综合,常用于编
写测试程序,用于测试RTL代码的功能
➢ RTL级和门级的描述具有较为严格的书写要求,其描述对应具体的
电路结构,用于编写运行于FPGA或者ASIC的代码。
Verilog 代码的可综合性
➢ 综合:将verilog代码转换成门级描述
➢ 可综合性:即指verilog代码能够被转换成门级描述,只有可综合的
代码才能下载到硬件平台里。
➢ Verilog代码有两类
1. 实现具体硬件功能,最终的运行平台为FPGA或者ASIC,这类描述必须可综合。
2. 用于验证逻辑电路的正确性,这一类描述的运行平台是计算机,不要求可综合。
➢ 什么样的代码可综合?通过后续课程的学习来掌握
二、Verilog的模块
Verilog的模块
数字电路:由若干功能相同或不相同的元件组成
小元件组合成大元件
元件的类型、管脚与功能;元件的例化
Verilog的模块
module(模块)
module是层次
化设计的基本
构件
module sel2reg(sel, a, b, clock);
input sel, a, b, clock;
output d;
wire c;
assign c = sel ? b: a;
逻辑描述放在
module内部
reg d;
always @ (posedge clock)
d <= c;
endmodule
每一个模块的描述从关键词module开始,有一个名称(如SN74LS74,
DFF,ALU等等),由关键词endmodule结束。
Verilog代码在module内部进行书写。
Verilog的模块
module(模块)主要由模块名,端口,内部功能三部分组成
端口等价于硬件的
引脚(pin)
端口在模块名字后
的括号中列出
端口可以说明为
input, output及inout
Verilog的模块
module(模块)主要由模块名,端口,内部功能三部分组成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
module TIMER
(clk,
rst,
out);
input clk,rst;
output[3:0] out;
reg[3:0] out;
always @(posedge clk)
begin
if (rst||out>=9)
out = 4'b0000;
else
out = out+1;
end
endmodule
模块的结构
1 module 模块名 (端口1, 端口2, 端口3, … …);
2 //模块内容
3
//I/O说明
4
input 信号名1, 信号名2, … …;
5
output 信号名1, 信号名2, … ...;
6
inout 信号名1, 信号名2, … ...;
7
//内部信号说明
8
reg 信号名1, 信号名2, … …;
9
wire 信号名1, 信号名2, … …;
10 integer 信号名1, 信号名2, … …;
11 parameter 参数名1=参数值1, 参数名2=参数值2, … …
12 //功能定义
13 initial块;
14 always块;
15 module实例化;
16 逻辑门实例化;
17 assign语句;
18 endmodule
Verilog的模块
内部功能的描述
在Verilog 模块中有三种方法可以生成逻辑电路:
- 用 assign 语句:
assign cs = ( a0 & ~a1 & ~a2 ) ;
- 用元件的实例调用:
and and_inst ( q, a, b);
- 用 always 块:
assign语句用于描述简单的组
合逻辑电路
编译软件里提供了一些基本的元件
,用户根据库元件的端口定义,可
以直接调用,类似C语言中的库函数
always @ (posedge clk or posedge clr)
begin if (clr) q<= 0; else if (en) q<= d;
end
always @ (*)
begin if (a==1) b = b+1;
end
Always模块用于描述复杂的
组合逻辑电路和时序逻辑电
路
Verilog的模块
内部功能的运行
如在模块中逻辑功能由下面三个语句块组成 :
assign cs = ( a0 & ~a1 & ~a2 ) ;
// -----1
and and_inst ( qout, a, b);
// -----2
always @ (posedge clk or posedge clr)
begin
if (clr)
q<= 0;
else if (en)
q<= d;
end
//-----3
三个语句块是并行的,它们产生独立的逻辑电路;而在 always 块中,
begin 与 end 之间是顺序执行的。
三、Verilog的基本语法
Verilog的基本语法
➢ Verilog的基本语法
Verilog中的逻辑状态
Verilog中的变量
Verilog中的语句
Verilog的基本语法
➢ 逻辑电路中信号的4种状态
0: 低电平状态
1: 高电平状态
x(X): 未知状态
z(Z): 高阻态,电流不流入也不流出;
➢ 实际电路中只有0,1和z三种状态;
➢ x只出现在软件仿真测试中,当信号未初始化或者由两
个及其以上信号驱动时即为x。
Verilog的基本语法
Verilog中的数字
➢ 数字的表示 3’d4, 12’hff, 3’b101 5’b1100x
位宽
如果省略,默认
位宽通常为32位
’进制
数字
进制符号
b
o
d
h
除了正常各种进制的数
字之外,还可使用x和z
进位计数制
二进制
八进制
十进制
十六进制
英文
binary
octal
decimal
hexadecimal
➢ 进制不能单独省略,只能与位宽同时省略,且只有十进制能省略。
使用省略方式容易导致端口的不匹配以及硬件资源的增加,建议
使用完整的表述方式。
➢ 为增强可读性,可在数字中间加下划线“_”,例如12’h34_a,
32’h98_32_14_45
Verilog的基本语法
数字的表示举例
Number
representation
Binary
equivalent
Explanation
4’d5
0101
Decimal 5 is interpreted as a 4-bit number
8’b101
00000101
Binary 101 is turned into an 8-bit number
8’hb_3
10110011
Binary equivalent of hex; underscore is ignored
10’o752
0111101010
Octal 752 with a 0 padded to its left to make it a
8’hf
00001111
10-bit number
Hexadecimal f is expanded to 8 bits by padding
12’hxa
xxxxxxxx1010
zeros to its left
Hexadecimal xa is expanded to 12 bits by extending
the left x
’hxa
32’hxa
The number of bits is omitted
99
32’d99
Only decimal number can omit database
Verilog的基本语法
Verilog中的变量
➢ 两种主要信号类型:线网型信号wire(net) 和寄存器型信号reg
➢ wire(net)用于表示电路中的连线
• 仅实现组合逻辑:即当输入变化时,输出随之变化
• 用于定义被assign语句赋值的信号,模块之间的连线以及模块
的输入信号
• 所定义信号不能在always块和initial块中被赋值
• 模块中信号的默认类型
➢ Verilog中的reg一方面表示电路中的寄存器,另一方面表示在always
块中被赋值的组合逻辑信号
always @ (*)
• 作为寄存器时,能维持数值,即只有当时钟触发后,输入才会
begin if (a==1) b = b+1;
给到输出 end
• 所有在always块和initial块中被赋值的信号,均需要定义为reg型
• 不是一定会被综合为寄存器
Verilog的基本语法
变量的声明
➢ 变量声明的格式如下:
类型
通常为wire或者
reg,不可省略
位宽
名称
遵循verilog统一的命名
规则,多个信号之间使
用“,”隔开
使用[起始序号 : 结束序号]表示,
总位宽为起始序号-结束序号+1。
当位宽为1位时可省略
wire clk;
//定义了一个1位的wire型信号
wire clk, rst;
//定义了两个1位的wire型信号
reg [4:0] dataout1, dataout2;
//定义了两个5位的reg型信号
reg [5:1] dataout1, dataout2;
//定义了两个5位的reg型信号
➢ 注意:声明的最后使用“;”结束
Verilog的基本语法
Verilog中的语句
➢ 概述
Verilog HDL 包含丰富的功能语句,来实现编码所需要的基本功能。
其中有些与C语言类似,比较容易理解。但是也有一些与C语言不同,在
学习中要注意这些不同点,深刻理解其物理意义。
➢ 特有语句
过程块语句、语句组、时序控制语句、赋值语句
➢ 通用语句
条件语句、分支语句、循环语句
Verilog的基本语法
Verilog中的语句
➢ 时序控制语句
➢ 时延控制语句
➢ 事件控制语句
#延迟时间
@(事件列表)
语意是“当……时”
分为如下两种类型:
1. 边沿触发事件:指定信号发生指定的边沿跳变行为,分为信号的
上升沿和下降沿控制。格式为:
@(<边沿触发事件1> or <边沿触发事件2> or… or <边沿触发事件n>) 行为语句
含义:当某个敏感信号的上升沿(posedge)或下降沿(negedge)
到来时,启动行为语句的执行。
2.电平敏感事件:指定信号的电平发生变化。格式为:
@(<电平触发事件1> or <电平触发事件2> or … or <电平触发事件n>) 行为语句
含义:当这些信号中的任何一个发生变化时,启动行为语句的执行。
Verilog的基本语法
Verilog中的语句(不可综合)
➢ 示例
Initial
Initial
#2 data = 2;
begin
//等待,直到时钟上升沿
@(posdege clk)
a = 0; b = 1;
//等待,直到sel发生变化
@(sel)
#5 b = 0;
#5 a = 1;
Initial
begin
a = 0; b = 1
#5 b = 0;
#5 b = 1
#5 a = 1;
end
end
Verilog的基本语法
Verilog中的语句
➢ 赋值语句
两种赋值方式:阻塞赋值 “=” 与非阻塞赋值 “<=”。
➢ 非阻塞(non-blocking)赋值方式
always @(posedge clk)
begin
q1 <= in;
q2 <= q1;
out <= q2;
end
分析电路特点
初始时刻:in=1,q1=0,q2=1;
第一个时钟上升沿到来后:in=1,
q1=1,q2=0;
第二个时钟上升沿到来后:in=0,
q1=1,q2=1;
时钟上升沿到来时,3个D触发器
同时被赋值;各个赋值之间没有先后顺序
➢ 非阻塞赋值方式的特点
• 在时序逻辑中,一个非阻塞赋值代表一个D触发器。
• 块结束后,赋值动作才能完成,因此上面语句所赋的变量值
不能立刻为下面语句使用。
• 在时序逻辑中,块语句中的各个赋值语句之间没有先后顺序
Verilog的基本语法
Verilog中的语句
➢ 阻塞(blocking)赋值方式
➢ 阻塞赋值方式的特点
module maxgate(a,b,out,outbar,sel);
input a,b,sel;
output out,outbar;
reg out1,out2,out,outbar;
always @ (a or sel or b)
begin
out1 = a&sel;
out2 = b & (~sel);
out = out1 | out2;
outbar = ~out
end
endmodule
• 赋值动作立刻完成
• 通常使用阻塞赋值方式描述组合逻辑电路
• 在实际电气特征上中实际上没有先后顺序
➢ 牢记:在时序逻辑电路中使用非阻塞赋值方式
Verilog的基本语法
Verilog中的语句
➢ 阻塞(blocking)赋值方式的不恰当使用
always @(posedge clk)
always @(posedge clk)
begin
begin
end
q1 = in;
q1 <= in;
q2 = q1;
q2 <= q1;
out = q2;
out <= q2;
end
➢ 不要在时序逻辑电路中使用阻塞赋值,赋值语句的顺序不同导致
电路的结构不同
➢ 牢记:在时序逻辑电路中使用非阻塞赋值方式
存储器
小结
Verilog HDL
描述方式
• 行为级
• RTL级
语法结构
• 可综合性:直接描述硬件
• 如何实现组合逻辑(阻塞)及时序逻辑(非阻塞)
Verilog的基本语法
Verilog中的语句
➢ 条件语句
条件语句的标准形式如下:
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
当表达式1的值不为0时,
执行语句1,否则当表达
式2的值不为0时,执行
语句2,否则执行语句3
always @ (sel or num1 or num2)
always @ (sel or num1 or
if (sel = = 2’d0)
num2)
result = num1 + num2;
else if (sel = = 2’d1)
result = num1 – num2;
else
if (sel = = 2’d1)
begin
result1 = num1 + num2;
result2 = num1 - num2;
result = num1;
end
else
当有多句执行语句时,使
用begin…end来确定配对
关系。作用相当于c语言
中的{…}
begin
result1 = num1;
result2 = num2;
end
Verilog的基本语法
Verilog中的语句
➢ 分支语句
wire [2:0] sel;
reg [3:0] result;
分支语句使用case来表述,其表达形式如下: always @ (sel)
case(控制表达式)
分支项的位宽必须与控
制表达式一致,前端表
示位宽的数字不要省略
case(sel)
分支项1:语句1;
3’d0:
result = 4’d5;
分支项2:语句2;
3’d1:
result = 4’d2;
分支项3:语句3;
3’d2:
result = 4’d1;
default:语句4;
defualt: result = 4’d0;
endcase
endcase
各分支项的判断内
容不要重复
➢ 当分支项较多时,使用case语句比使用if…else语句可读性更强。
➢ Casex和casez为case的变体,分别允许分支项中出现x与z,例如
casex(sel)
casez(sel)
3’b0x0: result = 4’d5;
3’b0z0:
result = 4’d5;
3’b10x: result = 4’d2;
3’b10z:
result = 4’d2;
defualt: result = 4’d0;
defualt: result = 4’d0;
endcase
endcase
Verilog的基本语法
Verilog中的语句
➢ 循环语句
循环语句通常用于生成周期性的波形,用于测试
循环语句包括forever语句,repeat语句,while语句和for语句
reg i;
reg i;
reg [3:0] i, output;
reg [3:0] i, output;
forever
repeat (5)
i = 0;
begin
begin
while (i <= 15)
begin
for ( i = 0 ; i <= 15 ; i = i +
1 ) begin
#10 i =~i;
end
#10 i =~i;
end
output = i;
#10 i = i + 1;
output = i;
#10;
end
end
➢ 循环语句通常不可综合,只有将循环语句进行展开才可能能综合,
在实际工程中,很少使用。
Verilog的基本语法
Verilog描述举例
➢ 比较器的设计实例
实现数字逻辑功能的代码
module compare ( equal, data1, data2 );
input [3:0] data1, data2;
测试向量
`timescale 1ns/1ns
module compare_test;
reg [3:0] data1, data2;
initial
begin
data1 = 4’d3; data2 = 4’d4;
output equal;
#20 data1 = 4’d2; data2 = 4’d2;
wire equal;
#30 data1 = 4’d1; data2 = 4’d5;
assign equal = (data1 == data2) ?
1’b1:1’b0;
#10 data1 = 4’d7; data2 = 4’d7;
endmodule
end
compare
u0( .equal(result), .data1(data1 ), .data2(data2 ) );
endmodule
Verilog的基本语法
Verilog中的运算符
➢ 算术运算符
+,-,*,/,%,其中+,-可综合,*部分可综合,/,%不可综合
运算结果为多比特
当参与运算的输入量有一个为x或者z时,输出为x
注意各运算变量之间的位宽关系,当心位数不够导致运算结果溢出
wire [3:0] number1, number2;
wire [4:0] result;
assign result = number1 + number2;
wire [3:0] number1, number2;
wire [3:0] result;
assign result = number1 + number2;
当number1为14,number2为4时,上述两段程序中的result分别为什
么值?
Verilog的基本语法
Verilog中的运算符
➢ 关系运算符
运算结果为单比特true/false
注意= =与= = =的区别,= =不比较x与z,
而= = =比较x与z
(3 != 5)= 1’b1;
(4’b1011 = = 4’d11) = 1’b1;
(4’b10x1 = = 4’d11) = x;
(4’b10x1 = = 4’b10x1) = x;
(3 != = 5)=1’b1;
(4’b10x1 = = = 4’b10x1) = 1’b1;
➢ 位运算符
对向量进行逐比特的运算
~(4’b0101)={~0,~1,~0,~1}=4’b1010
4’b0101&4’b0011=4’b0001
Verilog的基本语法
Verilog中的运算符
➢ 移位运算符 << >>
a>>n与a<<n
<<与>>分别表示左移位与右移位,n表示移动位数。
新移入的位使用0代替,移出的位丢弃
8’b01100111<<3 = 8’b00111000
8’b01100111>>4 = 8’b00000110
8’d43>>2 = 8’b00101011>>2 = 8’b00001010 = 8’d10
➢ 位拼接运算符 { }
能将若干位宽小的信号拼接成位宽大的信号,各信号之间使用”,”隔开
示例:
wire [2:0] a = 3’b101, wire [1:0] b = 2’b10, wire [4:0] c, wire [1:0] d;
情况1: c = {a, b} = {3’b101, 2’b10} = 5’b10110;
情况2:{c, d} = {b, b, a} = {2’b10, 2’b10, 3’b101} = 7’b1010101;
则c=5’b10101, d=2’b10;
位拼接符能嵌套使用
{a, 2{b,c}, 3{d}} = {a, b, c, b, c, d, d, d};
Verilog的基本语法
Verilog中的运算符
➢ 条件运算符 ?:
标准书写方式为: 表达式1 ?表达式2:表达式3
其含义为当表达式为true时,条件运算符的运算结果为表达式2,否
则为表达式3
条件运算符为if…else….的简洁表达方式
a = (Indata1 > 4’d5) ? 3’d4 : 3’d3;
条件运算符的嵌套使用
a = (Indata1 > 4’d5) ? ((Indata2 > 4’d2) ? 1’b1 : 2’d2 ) : 3’d3;
➢ 运算符的优先级别
非
!~
算术运算符
*, /, +, -
移位运算符
<<, >>
关系运算符
>, <, = =
位运算符
&, |, ^
逻辑运算符
&&, ||
条件运算符
?:
最高优先级别
()具有最高优先级,为增强
可读性与减少出错,在书写表
达式时使用()
最低优先级别
Download