Verilog HDL 数字系统设计及实践 第6章 行为级仿真模型建模

合集下载

《Verilog HDL数字系统设计——原理、实例及仿真》课件第13章

《Verilog HDL数字系统设计——原理、实例及仿真》课件第13章

第13章 ModelSim仿真工具
10
图13.3 Main主窗口界面
第13章 ModelSim仿真工具
11
(2) 通过File→New→Project菜单命令创建一个新工程,如 图13.4所示。
第13章 ModelSim仿真工具
12
图13.4 创建工程
第13章 ModelSim仿真工具
13
(3) 自动弹出Create Project对话框,如图13.5所示。在 Project Name文本框中填写项目名称,这里输入count4。 Project Location是工作目录,可通过Browse按钮来选择或改变。 ModelSim不能为一个工程自动建立一个目录,因此最好自己 定义保存路径。本例中保存的路径为“E: /count4”。Default Library Name说明所做的设计被编译到哪一个库中,这里使用 默认值work。单击OK按钮,此步骤后产生的工程文件 .mpf文 件被创建并存储于所选择的目录下。在编译完设计文件后, 在Workspace窗口的Library中就会出现work库。
将逻辑库映射到物理目录。 (2) 设计输入。向工程中添加有效的设计单元,包括设计
文件、ModelSim管理文件夹、仿真环境设置等。可以将这些 文件拷贝到工程目录,也可以简单地将它们映射到本地。
(3) 编译设计文件。进行语法检查并完成编译。 (4) 运行仿真。对指定的设计单元进行仿真。 图13.1给出了在ModelSim工程中仿真一个设计的基本流 程,该流程是基本的仿真流程。
第13章 ModelSim仿真工具
8
count4
data[3..0] load clk rst
out[3..0]
inst

《Verilog HDL数字系统设计——原理、实例及仿真》课件第5章

《Verilog HDL数字系统设计——原理、实例及仿真》课件第5章

第5章 结构级建模方法
27
图5.8 多输出门
第5章 结构级建模方法
28
图5.9和表5.7为多输出门的逻辑符号和逻辑表。
第5章 结构级建模方法
29
图5.9 多输出门的逻辑符号
第5章 结构级建模方法
第5章 结构级建模方法
5
下面是门类型的引用:
nand #10 nd1(a,data,clock,clear); 该语句中引用了一个名为nd1的与非门(nand),其输入为 data、clock和clear,输出为a,输出与输入的延时为10个单位 时间。
第5章 结构级建模方法
6
5.1.1 基本门
1.多输入门
图5.2 与门的逻辑符号
第5章 结构级建模方法
10
表 5.1 与门的逻辑表
and
01xz
0
0000
1
01xx
x
0x xx
z
0x xx
第5章 结构级建模方法
11
2) 与非门(nand) 图5.3和表5.2所示为与非门的逻辑符号和逻辑表。 例如:
nand U2 (sum, a, b, c); /*与非门U2,输出为sum,带有3个输入a、b、c*/
第5章 结构级建模方法
15
图5.4 或门的逻辑符号
第5章 结构级建模方法
16
表 5.3 或门的逻辑表
or
01xz
0
01xx
1
1111
x
x1xx
z
x1xx
第5章 结构级建模方法
17
4) 或非门(nor) 图5.5和表5.4所示为或非门的逻辑符号和逻辑表。 例如:
nor U5(out,in1,in2);

HDL 第6次课

HDL 第6次课

测试与仿真
测试仿真 施加 激励 待验证 设计模块 响应 输出 观察输出 对比结果
观察对比波形(波形仿真) 测试激励 待测设计 生成文本(命令式仿真)
对已设计模块的测试与仿真通常可分为以下三个步骤: 对被测设计的顶层接口进行例化。 给被测设计的输入接口添加激励。 判断被测设计的输出响应是否满足设计要求
//二输入与门 module and_2(A,B,F); input A,B; output F; and U1(F,A,B); endmodule
//半加器 开关级描述(调用开关级元件) module halfadder(A,B,F,CO); input A,B; UDP级描述(用户自定义元件) output F,CO; xor U1(F,A,B); and U2(CO,A,B); 元件名 (<时延>)<实例名>(<端口列表>) endmodule 类型 基本门 多输入门 元件
end
添加复位信号
//复位信号产生 //复位低有效,已定义“’timescale 1ns/1ps” initial begin rst_n=0; #100; //100ns延时
rst_n=1; //撤销复位
end
课后作业:
1、利用不同描述方式设计加法器、乘法器
2、练习编写加法器、乘法器测试模块
行为描述方式侧重反映电路输入、输出信号间的关系, 一般采用 initial 语句或 always 语句描述逻辑功能。
//二输入与门 module and_2(A,B,F); input A,B; output F; reg F; initial F=0; always@(A or B) assign=A&B; endmodule //半加器 module halfadder(A,B,F,CO); input A,B; output F,CO; reg F,CO; always@(A or B) begin case({A,B}) 2’b00:begin F=0;CO=0;end 2’b01:begin F=1;CO=0;end 2’b10:begin F=1;CO=0;end 2’b11:begin F=1;CO=1;end end endmodule

VerilogHDL行为级建模

VerilogHDL行为级建模
if(condition1) statement_1; else if(condition2) statement_2; else if(condition3) statement_3; //可以出现多个 else statement_4;
20
示例
Verilog HDL数字系统设计及仿真
if(clock= =1) q=d; //clock为1时执行此句 if(sel= =1) out=A; //sel为1时执行此句 else out=B; //sel非1时执行此句 if(Sum < 60) Total_C = Total _c + 1; else if (Sum < 75) Total_B = Total_B + 1; else Total_A = Total_A + 1;
always @ (posedge clock ) always @ (posedge clock or negedge reset)
12
顺序块
Verilog HDL数字系统设计及仿真
以关键字begin…end将多条语句封装 成块 按顺序执行
initial initial begin begin a=0; a=0; b=1; #5 b=1; c={a,b}; #10 c={a,b}; d={b,a}; #15 d={b,a}; end end
8
always结构
Verilog HDL数字系统设计及仿真
always结构在仿真过程中是时刻活动 的,它的语句结构如下:
always <时序控制方式> 执行语句
如果没有控制方式的参与,此结构中 的语句可能会一直执行并发生死锁, 或者变成类似数据流级的语句

精品课件-VVerilog HDL数字设计教程-第6章 Verilog HDL仿真技术

精品课件-VVerilog HDL数字设计教程-第6章 Verilog HDL仿真技术
reg clk; wire[7:0] data; reg[0:7] mem[0:63]; //使用文件进行初始化的数组 integer vec_file,i,j; //定义文件句柄,控制变量 reg flag; //写文件完毕后flag=1读开始
//调用已设计好的模块 sin_wave one(.clk(clk),.data(data)); //监视设计块输出,变量初始化,设置仿真时间 initial
module test_nested;
parameter d=20; //声明d是一个参数
reg [7:0] data; //声明data是一个8位的
寄存器变量
initial
fork:block1 //并行块
#d
data = 'h11;
#(2*d) data = 'h12;
#(3*d) data = 'h13;
标题栏
工作区
工具栏
菜单栏
信息显示区
命令窗口区
使用图形界面对设计进行仿真 图6-2 顶层设计sin_wave框图
定制宏功能模块——步骤1 图6-3 定制新的宏功能块
定制宏功能模块——步骤2 图6-4 LPM_ROM宏功能模块设定
定制宏功能模块——步骤3 图6-5 选择rom_64x8模块数据线和地址线宽度
begin y=10; //初始化寄存器areg for(index=0;index<size;index=index+1)
#5 memory[index]=index; //初始化一个memory end endmodule
initial块语句
【例6-8】initial块语句举例2 `timescale 1ns/1ns module test_initial; reg x; initial

VerilogHDL第六讲前仿真

VerilogHDL第六讲前仿真

并行块
在测试块中常用到fork…join块. 用并行块能表示以同一个时间起点算起的多个事件的运行,并行地
执行复杂的过程结构,如循环或任务。 格式: fork:<块名>
块内局部变量说明 时间控制1 行为语句1; …… 时间控制n 行为语句n; join
并行块执行时的特点:
并行块内各条语句是同时并行的执行的. 块内各条语句中指定的延时控制都是相对于程序流程 控制进入并行块的时刻的延时,也就是相对于并行块开 始执行时刻的延时. 当并行块内所有的语句都已经执行完毕后,也就是当执 行时间最长的那一条块内语句结束后,程序流程控制才 跳出并行块,结束并行块的执行.整个并行块的执行时间 等于执行时间最长的那条语句所需要的时间.
例:
module inline_tb; reg [7:0] data_bus;
initial fork data_bus= 8’b00; #10 data_bus = 8’h45; #20 repeat (10) #10 data_bus = data_bus +1; #25 repeat (5) # 20 data_bus = data_bus <<1; #140 data_bua = 8’h0f; join
reg go; wire clk; nand #(period/2) ul (clk,clk,go); initial begin
go=0; #(period) go=1; end
注:这两个时钟模型有些不同,行为描述的模型延迟 期间一直是低电平,而门级描述的模型开始延迟有半 个周期是不确定的。
6.1.2.2 测试模块
{CNTRL1,CNTRL2}=2’b01; #1$display(“cntrl1=%b,cntrl2=%b,output is %b”,CNTRL1,CNTRL2,

《Verilog HDL数字系统设计——原理、实例及仿真》课件第6章

《Verilog HDL数字系统设计——原理、实例及仿真》课件第6章

7
endtask always @ (code or a or b) begin case(code) 2'b00: my_and (a,b,c);
2'b01: c=a|b; 2'b10: c=a-b; 2'b11: c=a+b; endcase end endmodule
/*调用任务 my_and,注意端口列表的顺序应与 任务定义中的一致,这里的 a、b、c 分别对应 任务定义中的 a、b、out*/
endtask
//执行任务工作相应的语句
第6章 任务、函数及其他
5
6.1.2 任务的调用
任务调用的语法格式如下:
<任务名> (端口1,端口2,…,端口n); 例如:
my_task(v,w,x,y,z); 任务调用变量(v,w,x,y,z)和任务定义时的I/O变量(a, b, c, d, e)的顺序是一一对应的。当任务启动时,由v、w和x传入的变 量赋给了a、b和c,而当任务完成后的输出又通过c、d和e赋 给了x、y和z。
第6章 任务、函数及其他
6
【例6.2】 定义一个完成两个操作数按位与操作的任务, 然后在后面的算术逻辑单元的描述中调用该任务完成与操作。
module alutask(code,a,b,c); input[1:0] code; input[3:0] a,b; output[4:0] c; reg[4:0] c; task my_and;
input[3:0] a,b; output[4:0] out; integer i;
begin fo r(i= 3; i>=0; i= i-1) out[i]=a[i]&b[i];
end

数字系统设计与verilog HDL 第6章

数字系统设计与verilog HDL 第6章

4.关系运算符(Relational operators) < 小于 <= 小于或等于 > 大于 >= 大于或等于

5.等式运算符(Equality Operators) == 等于 != 不等于 === 全等 !== 不全等

例:对于A=2'b1x和 B=2'b1x,则 A==B结果为x, A===B结果为1
关键字(Keywords)
Verilog语言内部已经使用的词称为关键字或
保留字,这些保留字用户不能作为变量或节点
名字使用。
关键字都是小写的。
6.2 常量
程序运行中,值不能被改变的量称为 常量(constants),Verilog中的常量主 要有如下3种类型:
◆ 整数 ◆ 实数
◆ 字符串
整数(integer)
字符串(Strings)

字符串是双引号内的字符序列。 字符串不能分成多行书写。例如:
"INTERNAL ERROR"

字符串的作用主要是用于仿真时,显示一些 相关的信息,或者指定显示的格式。
6.3 数据类型
数据类型(Data Type)是用来表示数字电路中的 物理连线、数据存储和传输单元等物理量的。
空白符和注释
空白符(White space) 空白符包括:空格、tab、换行和换页。空白符使 代码错落有致,阅读起来更方便。在综合时空白符 被忽略。 注释(Comment) ◆ 单行注释:以“//”开始到本行结束,不允许续 行 ◆ 多行注释:多行注释以“/*”开始,到“*/”结 束
标识符(Identifiers)
第6章 Verilog HDL语法与要素
主要内容

《Verilog HDL数字系统设计——原理、实例及仿真》课件第11章

《Verilog HDL数字系统设计——原理、实例及仿真》课件第11章

第11章 模 型 机 设 计
表 11.1 16 位 RISC CPU 的指令系统
操作码 00000 00001 00010 00011 00100 00101 00110 00111
功能描述 CF+DR+SR→DR DR-SR-CF→DR DR*SR→(SR,DR)(无符号) DR/SR→DR(无符号) DR+IMM→DR(立即数和寄存器相加) DR-SR(比较置位,若 ZF=1,则 DR=SR) DR & SR→DR(按位与) DR SR→DR(按位或)
(5) 立即数加法指令(ADDI DR,IMM)。此指令是将目的寄 存器DR的值加上指令字中的8位立即数IMM,再加上进位标 志位,将计算结果写回目的寄存器DR中,并根据计算结果设 置标志位CF、ZF、OF和SF。
第11章 模 型 机 设 计
18
(6) 比较指令(CMP DR, SR)。此指令是将目的寄存器DR 的值与源寄存器SR的值进行比较,然后根据比较结果设置标 志位。若两数相等,则置零标志位为1;若目的寄存器DR的 值比源寄存器SR的值大,则置符号位SF为1;若目的寄存器 DR的值比源寄存器SR的值小,则置符号位SF为0。
第11章 模 型 机 设 计
17
(3) 无符号定点乘法指令(MUL DR, SR)。此指令是将目的 寄存器DR的值乘以源寄存器SR的值,将结果的高16位写回目 的寄存器DR中,低16位写回源寄存器SR中,并根据计算结果 设置标志位。
(4) 无符号定点除法指令(DIV DR, SR)。此指令是将目的 寄存器DR的值除以源寄存器SR的值,将结果写回目的寄存器 DR中,并根据计算结果设置标志位。
11
11.3 RISC CPU指令系统设计

连载《fpga线下培训-第6天》【FPGA数据流建模、行为级建模、结构化建模区别】及【Ve。。。

连载《fpga线下培训-第6天》【FPGA数据流建模、行为级建模、结构化建模区别】及【Ve。。。

连载《fpga线下培训-第6天》【FPGA数据流建模、⾏为级建模、结构化建模区别】及【Ve。

这篇⽂件记录,FPGA的3种建模⽅式及基本的Verilog HDL语法,内容会根据学习进度,不断更新⼀、FPGA的3种建模⽅式 A、数据流建模(assign)在数字电路中,信号经过组合逻辑时会类似于数据流动,即信号从输⼊流向输出, 并不会在其中存储。

当输⼊变化时,总会在⼀定时间以后体现在输出端 同样,我们可以模拟数字电路的这⼀特性,对其进⾏建模,这种建模⽅式通常被称为数据流建模 1.1、是使⽤连续赋值语句(assign)对电路的逻辑功能进⾏描述,该⽅式特别便于对组合逻辑电路建模 1.2、连续驱动,连续赋值语句是连续驱动的,也就是说只要输⼊发⽣变化,都会导致该语句的重新计算。

  1.3、只有线⽹型的变量才能在assign语句中被赋值 1.4、因为assign语句中被赋值的变量,在仿真器中不会存储其值,所以该变量必须是线⽹(Nets)类型,不能是寄存器(reg)类型 1.5、线⽹类型的变量,可以被多重驱动,也就是说可以在多个assign语句中驱动同⼀个net 1.6、reg型变量,不能被不同的⾏为进程(eg:always块)驱动 1.7、建议使⽤assign对组合逻辑建模,这是因为assign语句的连续驱动特点与组合逻辑的⾏为⾮常相似, ⽽且在assign语句中加延时可以⾮常精确地模拟组合逻辑的惯性延时。

1.8、assign语句与⾏为语句块(always和initial)、其它连续赋值语句、门级模型之间是并⾏的。

⼀个连续赋值语句是⼀个独⽴的进程,进程之间是并发的,同时也是交织的 B、⾏为级建模(initial、always)  ⾏为⽅式的建模是指采⽤对信号⾏为级的描述(不是结构级的描述)的⽅法来建模。

在表⽰⽅⾯,类似数据流的建模⽅式,但⼀般是把⽤initial 块语句或always 块语句描述的归为⾏为建模⽅式。

《Verilog HDL数字系统设计——原理、实例及仿真》课件第7章

《Verilog HDL数字系统设计——原理、实例及仿真》课件第7章
第7章 门电路设计与实现
1
第7章 门电路设计与实现
7.1 基本门电路 7.2 组合门电路 7.3 三态门电路 7.4 双向总线缓冲器
第7章 门电路设计与实现
2
7.1 基 本 门 电 路
基本门电路包括与门、或门、非门。表7.1是二输入与门、 或门和非门的真值表。
第7章 门电路设计与实现
3
表 7.1 二输入与门、或门和非门真值表
第7章 门电路设计与实现
24
图7.7 8位双向总线缓冲器的逻辑符号
逻辑符号
第7章 门电路设计与实现
25
表 7.4 8 位双向总线缓冲器的真值表
EN
DIR
数据传输
0
X
高阻
1
0
A→B
1
1
A←B
第7章 门电路设计与实现
26
实现双向数据传输的总线缓冲器可以用图7.8来表示,其 中的dir是数据传送方向的控制信号,bus_a、bus_b分别表示A、 B两端的数据信号。代码7.4是一个8位双向总线数据缓冲器的 Verilog HDL描述。
22
图7.6 三态门电路的功能仿真波形
第7章 门电路设计与实现
23
7.4 双向总线缓冲器
在数字电路中,总线缓冲器主要用于将设备与总线互连。 常用的缓冲器有单向和双向两种。例如,一个8位的单向缓冲 器可以实现从A端到B端的单向数据传送,需要8个三态门, 并将这8个三态门的控制段连接在一起由一个共同的使能信号 来进行控制。一个8位的双向缓冲器是指能够实现从A端到B 端或从B端到A端的双向数据传送,因此需要16个三态门,8 个门用于实现 A端到B端的数据传送,另外8个门用于实现从 B端到A端的数据传送。图7.7是8位双向总线缓冲器的逻辑符 号。表7.4是双向总线缓冲器的真值表。

数字系统设计QuartusⅡ的VerilogHDL建模与仿真

数字系统设计QuartusⅡ的VerilogHDL建模与仿真
设计输入
使用Quartus II软件的设计输入工具, 将设计转换为可编程的硬件描述语言或
原理图。
仿真
使用Quartus II软件的仿真工具,对 设计进行功能仿真和时序仿真,以确
保设计的正确性。
综合与布局布线
将设计转换为可编程的配置文件,并 进行布局布线,以确保设计的正确性。
编程与配置
将生成的配置文件下载到FPGA芯片 中,完成数字系统的设计和实现。
VS
优化设计
根据仿真结果分析和实际需求,对 Verilog HDL代码进行优化,提高设计的 性能和可靠性。
05
数字系统设计实例
实例一
总结词
简单计数器
详细描述
简单计数器是一个常见的数字系统设计实例,用于对输入信号进行计数。通过Verilog HDL建模,可 以实现计数器的逻辑功能,并在Quartus II中进行仿真测试。
模块化设计
将复杂的数字系统划分为若干个 较小的模块,每个模块具有明确 的功能和接口,便于设计和验证。
行为描述
使用Verilog HDL的逻辑运算符、 控制语句等对数字系统的行为进 行描述,实现逻辑功能。
层次化设计
将不同层次的模块按照层次结构 组织起来,上层模块调用下层模 块,实现系统的层次化设计。
Verilog HDL的仿真流程和工具
移位运算符:左移、右移。
04
05
数据类型:`reg`、`wire`、 `integer`等。
03
Quartus II软件介绍
Quartus II软件的特点和功能
高度集成
Quartus II软件集成了数字系统设计所需的所有工具,包括编辑器、 编译器、仿真器等,方便用户进行一站式设计。

《Verilog HDL数字系统设计——原理、实例及仿真》课件第3章

《Verilog HDL数字系统设计——原理、实例及仿真》课件第3章

"INTERNAL ERROR" //空格也是字符串的组成部分
"time_del_125"
//下划线也是字符串的组成部分
第3章 数据类型和表达式
6
3.1.2 变量
变量即在程序运行过程中其值可以改变的量,在Verilog HDL中变量的数据类型有很多种,其中最基本的是线网型 (Net Type)和寄存器型(Register Type)两种,且每种类型都有其 在电路中的实际意义。这两种数据类型中最常用的是wire型、 reg型和integer型。
wire start,do;
//声明 2 个 1 位的连线型信号
wand [4:0] addr;
//声明 1 个 5 位的线与型信号
tri [MSB-1:LSB+1] addr1; //声明三态线 addr1,位宽由表达式确定
第3章 数据类型和表达式
10
wire和tri是最常用的线网类型,它们具有相同的语法格式 和功能。wire型变量通常用来表示单个门驱动或连续赋值语 句驱动的网络型数据,tri型变量则用来表示多驱动器驱动的 网络型数据。如果wire型或tri型变量没有定义逻辑强度(logic strength),在多个驱动源的情况下,逻辑值会发生冲突从而产 生不确定值。如果多个驱动源驱动同一个连线(或三态线网), 则这个线网的有效值可由表3.2来决定。
第3章 数据类型和表达式
7
1.线网型变量
线网表示器件之间的物理连接,称为线网类型信号,其
特点是输出的值紧跟输入值的变化而变化。对线网型变量有
两种驱动方式,一种是在结构描述中将其连接到逻辑门或模 块的输出端;另一种方式是用持续赋值语句assign对其进行赋 值。该类变量不能存储数据。

verilog行为建模

verilog行为建模
迟控制
#y x=x+1; //标识符延迟控制 #(4:5:6) q=0;//最小、典型和最大延迟值
end
延迟控制指定了 过程赋值语句被 推迟执行的时间。 延迟值总是指遇 到该赋值语句时, 需要等待执行的 相对时间。
b.内嵌赋值延迟控制
内嵌赋值延迟控制将延迟控制嵌入到赋值语句中,放在赋 值符的右边,这种延迟方式的效果与常规延迟赋值是完全 不同的。
a. 常规事件控制
使用符号 @ 语句执行的条件是信号的值发生了变化 正向跳变posedge 负向跳变negedge
@ (clock) q =d; //只要信号clock发生改变,就执行q=d语句 @ (posedge clock) q=d; //只要信号clock发生正向跳变,就执行q=d @ (negedge clock) q=d; //只要信号clock发生负向跳变……. q=@ (posedge clock) d; //立即计算d的值,在clock上升沿赋值给q
▪ Verilog的行为建模是用一系列以高级编程语言编写的并行的、 动态的过程块来描述系统的工作。
5.1 结构化过程语句
Verilog中有两种结构化过程语句:initial和always语句,是 行为建模的两种基本语句,所有的行为语句只能出现在这两种 结构化过程语句里。
➢每个initial语句和always语句代表一个独立的执行过程 (或过程块)。
b=a; //使用非阻塞语句的两个并行always块 always @ ( posedge clock)
a<=b; always @ ( posedge clock)
b<=a;
▪ 第一种描述使用阻塞赋值,产生了竞争。 ▪ 第二种描述使用非阻塞赋值语句,在时钟上升沿到来

《Verilog HDL数字系统设计——原理、实例及仿真》课件第4章

《Verilog HDL数字系统设计——原理、实例及仿真》课件第4章

拟仿真的过程语句,通常不能被逻辑综合工具所支持。
第4章 行为级建模方法
9
图4.1 initial语句执行顺序
第4章 行为级建模方法
10
【例4.1】 用initial语句在仿真开始时对各变量进行初始 化。
initial begin ina ='b000000; #10 ina ='b011000; #10 ina ='b011010; #10 ina ='b011011; #10 ina ='b010011; #10 ina ='b001100; end
法格式如下: always @ <敏感信号表达式> 语句块
其中,语句块的格式为 <块定义语句1> 时间控制1 行为语句1;
… 时间控制n 行为语句n; <块定义语句2>
第4章 行为级建模方法
13
以上的格式中: (1) 关键词always表明了该过程块是一个“always过程 块”。 (2) @ <敏感信号表达式>是可选项,有敏感事件列表的 语句块被称为“由事件控制的语句块”,它的执行要受敏感 事件的控制。 (3) “时间控制”用来对过程块内各条语句的执行时间进 行控制,它可以是任何一种时间控制方式。 (4) 语句块中的行为语句可以是如下语句中的一种:过程 赋值语句(阻塞型或非阻塞型)、过程连续赋值语句、if条件分 支语句、case条件分支语句、循环控制语句(forever、repeat、 while、for循环控制语句)、wait等待语句、disable中断语句、 事件触发语句、任务调用语句(用户定义第4章 行为级建模方法
4
通过该例,应建立以下概念: (1) 只有寄存器类型的信号才可以在always和initial 语句 中进行赋值,类型定义通过reg语句实现; (2) 采用行为级描述方式,即直接采用“+”来描述加法, {Count,Sum}表示对位数的扩展,因为两个1 bit相加,产生 的和有两位,低位放在Sum变量中,进位放在Count 中; (3) always语句一直重复执行,由敏感列表(always语句括 号内的变量)中的变量触发; (4) always语句从0时刻开始; (5) 在begin和end之间的语句是顺序执行的,属于串行语 句。

数字系统设计QuartusⅡ的VerilogHDL建模与仿真-精品文档

数字系统设计QuartusⅡ的VerilogHDL建模与仿真-精品文档
支持多家公 司的PLD
EDA Tool
FPGA Advantage
Provider
Mentor Graphics
Description
包括 HDL Designer Series (可视化的 设计输入工具), ModelSim(仿真工 具),Precision RTL Synthesis (最 新的逻辑综合器)。
1 门级描述(程序如下) 顶层实体名称 //Gate-level description of a 3-to-8line decoder (Figure 1) • module _3to8decode(A1,A2,A3,E,Y); • input A1,A2,A3,E; //定义输入信号 • output[7:0] Y; //定义输出信号 • wire A1not,A2not,A3not,Enot; //定义电路内部节点信号 • not n1(A1not,A1), //非门调用 • n2(A2not,A2), • n3(A3not,A3), • n4(Enot,E); • and n5(Y[0],A3not,A2not,A1not,Enot), //与门调用 • n6(Y[1],A3not,A2not,A1,Enot), • n7(Y[2],A3not,A2,A1not,Enot),
设计输入文件
设计实例1
设计要求
设计一个3线-8线译码器,真值表如表1所示:(1)设置使能控制 端,低电平有效。(2)输出高电平有效。 (3)采用Verilog语 言的文本输入方式。(4) 进行功能仿真与验证。 *说明:本例采用门级描述和行为描述两种方式。两种方式描述均能 完成设计要求。
设计实例1
此处为安装的默认路径 此处为_3to8decode 此处为_3to8decode

Verilog HDL学习要点之行为级建模

Verilog HDL学习要点之行为级建模

第 三 种 事 件 表 达 式 代 表 所 指 定 的 信 号 发 生 了 负 跳 变 ( x 0
z 0 1 0 1 x 1 0 中的一种) ,就算事件触发;
Байду номын сангаас
敏感事件列表在 always 过程块中的应用 (1) 用 always 过程块实现组合逻辑 • 事件表达式内不能包含 posedge 和 negedge 关键词 • 组合逻辑的所有输入都要作为<信号名>出现在敏感列表中 (2) 用 always 过程块实现时序逻辑 • 事件表达式可以是上述表达式三种中的任意一种 • 不要求所有输入都要作为<信号名>出现在敏感列表中
end wait (enable==1) d=a&b|c; begin wait (enable==1); d=a&b; d=d|c; end 注意此处要想实现 wait 语句对后面语句的控制只能在顺序执行的语句中。 例子: (参照实现时序逻辑的仿真) module zzy(flag1,flag2); output flag1,flag2; reg enable,flag1,flag2; initial begin flag1=1; flag2=1; enable=1; #20 enable=0; #10 enable=1; end always begin #10; wait(enable==1) flag1=~flag1; end initial begin #10 @(posedge enable) flag2=~flag2; end endmodule
• •
上述变量矢量的的某一位或某几位 存储器数据类型,只能对某个地址单元的整个字进行操作,不能对该字的某一位或某几 位进行赋值操作。 • 上述几个变量用连接操作符“{,}”拼接起来构成的整体。 赋值语句中可以出现延时控制和事件控制的时间控制, 根据控制语句出现的位置可以分为外 部事件控制方式(如#10 a=b)和内部时间控制方式(如 b=#10 ~b) 。前者是等待一段时间后 才计算等号右边的表达式的值, 后者是立即计算等号右边的表达式的值, 等待一段时间后才 赋值。

Verilog HDL数字系统设计及实践

Verilog HDL数字系统设计及实践

读书笔记
中规中矩的verilog书,该有的都有。 个人感觉前面章节都比较好理解,最后一章有点难,适合新手阅读。 新手看它就像活在梦里,初期代码风格似乎有变化,但是之后稳定了,也容易明白了。
目录分析
1.2模块和端口
1.1一个简单的例 子—— 4位全加器
的设计
1.3层次化设计思 想
1.4 Testbench的 概念
9.3 include 9.4 timescale
本章小结
9.5预编译处理实 例
思考与练习
0 1
10.1阻塞 语句与非阻 塞语句
0 2
10.2敏感 变量的不完 备性
0 3
10.3锁存 器的产生与 危害
0 4
10.4组合 逻辑反馈
0 6
10.6优先 级与并行编 码
0 5
10.5 for 循环
10.7多路控制分支 结构
Verilog HDL数字系统设计及实践
读书笔记模板
01 思维导图
03 读书笔记 05 作者介绍
目录
02 内容摘要 04 目录分析 06 精彩摘录
思维导图
关键字分析思维导图
设计
内容
逻辑
层次化
建模
小结
实例
数字
行为
共章 设计
形式
设计
语句
时间
描述
行为
时序

内容摘要
本书介绍硬件描述语言Verilog HDL及电路设计方法,共11章,主要内容包括:Verilog HDL层次化设计、 Verilog HDL基本语法、Verilog HDL行为描述、组合逻辑建模、行为级仿真模型建模、各层次Verilog HDL描 述形式与电路建模、任务和函数、编译预处理、Verilog HDL设计与综合中的陷阱、异步设计与同步设计的时序 分析。

Verilog HDL 数字系统设计及实践 第6章 行为级仿真模型建模

Verilog HDL 数字系统设计及实践 第6章 行为级仿真模型建模

6.3 仿真模型建模实例
integer i; reg [35:0] line; wire [3:0] cmd = line[35:32]; // 指令 wire [15:0] addr = line[31:16]; // 地址 wire [15:0] data = line[15:0]; // 写数据或读操作期望的数据 initial begin #0 rst_n = 1'b1; write = 1'b0; select = 1'b0; resp_ok = 1'b0; #50 rst_n = 1'b0; #50 if (stat_cur != Reset) $display("error: expect Reset, stat_cur = %b", stat_cur); #50 rst_n = 1'b1; #50 i = 0; line = stimulus[i]; if (stat_cur != Idle) $display("error: expect Idle, stat_cur = %b", stat_cur); // 寄存器变量值的要在下一个仿真时刻才稳定,因此我们在进行while判断之 // 前先延迟1。 // 后面代码中也有很多#1的延迟,其作用和这里相似。
6.3 仿真模型建模实例
6.3.3从文件读取激励 【例6.5】用Verilog HDL语言设计一个测试环境,对本书第5章例5.9所示的有限状态机进 行测试。状态机的激励从文件中读取,该激励将模拟多次总线的传输过程,以检测状态机 是否能够按照预先设想的转换图进行状态转换。 // exmaple_6_5: Testbench for the sample bus controller FSM from example_5_9 module fsm_bus_control_tb (); reg rst_n, write, select, resp_ok; wire clk; wire [2:0] stat_cur, sta reg [35:0] stimulus [0:31]; parameter Reset = 3'b000; parameter Idle = 3'b001; parameter Read = 3'b010; parameter Write = 3'b011; parameter Delay = 3'b100;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

6.3 仿真模型建模实例
#1; // 每个while循环进行一次读/写操作,即FSM状态转换一圈。 while (cmd != 4'h2) begin $display("info: cmd = %h, addr = %h, data = %h", cmd, addr, data); if (cmd == 4'h0) begin // 写操作 write = 1'b1; select = 1'b1; @ (posedge clk) #1 if (stat_cur != Write) $display("error: expect Write, stat_cur = %b", stat_cur); end else if (cmd == 4'h1) begin // 读操作 write = 1'b0; select = 1'b1; @ (posedge clk) #1 if (stat_cur != Read) $display("error: expect Read, stat_cur = %b", stat_cur); end // 等待设备回复 @ (posedge clk)
6.3 仿真模型建模实例
.o_dout(dout) ); // 加载输入激励 initial begin // 初始化仿真模型的寄存器变量 #0 rst_n = 1'b1; din = 1'b0; flag_data_check = 1'b0; // 开始进行复位,复位时间视系统要求而定 #50 rst_n = 1'b0; #50 rst_n = 1'b1; // 复位完成,向数据输入端口加载激励 #10 din = 1'b1; flag_data_check = 1'b1; // 再次加载新的激励 #50 din = 1'b0; flag_data_check = 1'b1; #50 $finish; end // 自动检测输出数据
图6.1 一个完整的芯片设计工程
一个完整的芯片设计工程应该包含Testbench测试 环境的设计和被测对象的设计。
6.2 仿真时间和时序控制
在运行真实芯片时,芯片的各个时间参数和我们真实生活中使用的时间是相同的。在 仿真的时候,我们也有自己的时间,这个时间是仿真器虚拟出来的,与真实的时间不一定 相同。 复杂的电路行为往往在时间上有很强的前后依赖关系。在可综合的电路描述中,这种 时序上的控制只能通过同步时钟和有限状态机来实现。当电路的功能变得复杂以后,对时 序控制逻辑的设计也变得越来越困难。 Verilog HDL提供的时序控制语句主要有3种:延迟控制语句,事件控制语句和条件等 待语句。 延迟控制语句用#加数字的形式来表示程序继续运行需要等待的仿真时间。 ... initial begin #10 a = b; #20 a = c; end
6.3 仿真模型建模实例
6.3.3从文件读取激励 【例6.5】用Verilog HDL语言设计一个测试环境,对本书第5章例5.9所示的有限状态机进 行测试。状态机的激励从文件中读取,该激励将模拟多次总线的传输过程,以检测状态机 是否能够按照预先设想的转换图进行状态转换。 // exmaple_6_5: Testbench for the sample bus controller FSM from example_5_9 module fsm_bus_control_tb (); reg rst_n, write, select, resp_ok; wire clk; wire [2:0] stat_cur, stat_nxt; // 激励从文件中读取后存储在该寄存器变量 reg [35:0] stimulus [0:31]; parameter Reset = 3'b000; parameter Idle = 3'b001; parameter Read = 3'b010; parameter Write = 3'b011; parameter Delay = 3'clock_gen #(15) cgen ( .o_clk(clk) ); fsm_bus_control fsm ( .i_clk(clk), .i_rst_n(rst_n), .i_write(write), .i_sel(select), .i_ok(resp_ok), .o_stat_next(stat_nxt), .o_stat_current(stat_cur) ); // 利用$readmemh系统函数从文件中读取激励 initial $readmemh("fsm_sim.dat", stimulus); // 循环从stimulus变量中读取指令
6.1 行为级建模概述
Testbench 被测模块
时钟发生器 可综合的模块
输入激励加载 模拟或者IP模块 的仿真模型 输出结果检查
被测对象我 们又可以叫 做“芯片”, 因为它描述 的是我们希 望设计的芯 片本身的功 能。
Testbench通常是用 Verilog HDL语言描述的 不可综合的模块,用来产 生与芯片真实的工作环境 相同的输入激励,来对芯 片的功能进行测试。
Verilog HDL 数字系统设计及实践
第6章 行为级仿真模型建模
学习指南
【知识目标】 (1)了解Verilog HDL语言不可综合行为描述的特点; (2)了解仿真模型和Testbench的概念和作用; (3)掌握各种常用Verilog HDL行为描述方法。 【技能目标】 (1) 熟练应用Verilog行为描述构建仿真模型和Testbench; (2) 熟练构建可进行自动测试的芯片仿真环境。 【重点难点】 (1) 行为级建模与可综合建模的区别与联系; (2) 如何构建可进行自动测试的仿真环境。
6.3 仿真模型建模实例
6.3.4输出结果监控 【例6.6】利用$monitor系统函数构建一个简单的持续监控变量值变化情况的模块。 // example_6_6: A simple signal monitor program module monitor_tb (); wire out; reg opa, opb; assign #2 out = opa & opb; initial begin #0 opa = 1'b0; opb = 1'b0; #10 opa = ~opa; #10 opb = ~opb; #10 $finish; end initial begin $monitor("out = %b; opa = %b; opb = %b", out, opa, opb); end endmodule
6.3 仿真模型建模实例
always @ (posedge clk) begin if (flag_data_check) begin #1 if (din != dout) $display("error: output wrong data: dout = %b, din = %b", dout, din); else $display("ok: output correct data: dout = din = %b", dout); flag_data_check = 1'b0; end end endmodule
6.3 仿真模型建模实例
#1 if (stat_cur != Delay) $display("error: expect Delay, stat_cur = %b", stat_cur); // 没有给ok信号,Delay状态应该保持 @ (posedge clk) #1 if (stat_cur != Delay) $display("error: expect Delay, stat_cur = %b", stat_cur); resp_ok = 1'b1; @ (posedge clk) #1 if (stat_cur != Idle) $display("error: expect Idle, stat_cur = %b", stat_cur); i = i + 1; line = stimulus[i]; resp_ok = 1'b0; #1; end #50 $finish; end endmodule
6.3 仿真模型建模实例
6.3.1 时钟发生器 时钟发生器是Verilog HDL仿真模型中最重要的模块。所有硬件电路的工作都离不开时钟 输入。同步时序电路中的存储单元在时钟沿触发,对电路的数据流和状态进行控制。
【例6.1】用Verilog HDL设计一个时钟发生模块。时钟周期可通过参数period调节,占空 比为50% // example_6_1: A simple clock generator for simulation module clock_gen #( parameter period = 10 ) ( output reg o_clk ); initial // 设置时钟的初始值 o_clk = 1'b0; // 每隔半周期,时钟信号反转一次。 always #(period/2) o_clk = ~o_clk; endmodule
6.3 仿真模型建模实例
6.3.2简单的仿真环境
【例6.4】用Verilog HDL设计一个简单的仿真环境,对本书例5.2所示的带异步复位端口的 寄存器模块进行自动测试。 // example_6_4: Testbench for the DFF appears as example_5_2 module dff_asyn_reset_tb (); wire clk; wire dout; reg rst_n; reg din; reg flag_data_check; // 该标志位用来表示是否进行输出数据检查 clock_gen #(15) cgen ( .o_clk(clk) ); dff_asyn_reset dff1 ( .i_clk(clk), .i_rst_n(rst_n), .i_din(din),
相关文档
最新文档