数字电路与系统 第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; ➢ 运算符的优先级别 非 !~ 算术运算符 *, /, +, - 移位运算符 <<, >> 关系运算符 >, <, = = 位运算符 &, |, ^ 逻辑运算符 &&, || 条件运算符 ?: 最高优先级别 ()具有最高优先级,为增强 可读性与减少出错,在书写表 达式时使用() 最低优先级别