当前位置:   article > 正文

verilog 数字系统设计读书笔记-------持久更新_verilog随机数

verilog随机数

Verilog模型可以是实际电路的不同级别的抽象。这些抽象的级别和它们所对应的模型类型共有以下5种:系统级、算法级、RTL级、门级、开关级

‘bz :表示高阻态, ’bx表示不定值(0或1均可)

`include "muxtwo.v" 将文件引进

{$ random} 为系统任务,会产生一个随机数,

in = {$random} % 2;        //产生0到2(0或1) 的随机数in = $random % b;        //b为十进制整数,in为范围在 -(b-1):(b-1) 中的随机数

而“always”块既可用于描述组合逻辑,也可描述时序逻辑,always块中的语句称为顺序语句,因为他们是顺序执行的

verilog hdl 共有19种数据类型,最基本的4种为reg、wire、integer、parameter

其他的数据类型是:larger, medium,scalared, time, small, tri, trio, tril, triand, trior, trireg、vectored, wand, wor型

利用parameter 来传递参数

  1. //这是子模块//在子模块里面定义了常量width 和height
  2. module decoder(
  3. input wire in,
  4. output wire out)
  5. parameter width = 1;
  6. parameter height = 2;
  7. endmodule
  8. module top (
  9. input wire a,
  10. output wire b
  11. );
  12. //调用子模块并更改里面的常量width 和heigh
  13. decoder
  14. #(
  15. .width (10), //使decoder里面的width = 10
  16. .height (8)
  17. )
  18. decoder_inst(
  19. .in(),
  20. .out()
  21. );
  22. endmodule

用defparam来重定义模块种的值,如defparam module1.module2.module3.a = 0; module1,module2和module3是例化模块的名字

wire型变量通常是用来表示单个门驱动或连续赋值语句驱动的网络型数据,tri型变量则用来表示多驱动器驱动的网络型数据

原语:相当于库中的module,直接调用

符号优先级:

!是逻辑取反,~是按位取反

时序分析:时序分析的方法主要有两种,一种是静态时序分析,另一种是动态时序分析

静态分析:通过设计好的电路中的已知参数 利用EDA的工具模型分析出时钟和数据的关系。

动态分析: 把设计好的电路中的所有延时都考虑进来,加上EDA中的延时参数,然后观测Ts, Th是否满足要求,需要电路模拟跑起来。

Ts(建立时间:采样时钟的上升沿 到达 数据起始位置的时间)

Th(保持时间:采样时钟的上升沿 到达 数据结束位置的时间)

时序分析需要关心的路径:

1、从输入到输出的路径;

2、从输入到寄存器的路径;

3、从寄存器到输出的路径;

4、从寄存器到寄存器的路径;

5、异步清零信号和时钟存在异步的进入和退出问题。

编辑

图 中的 T1 为数据路径的延迟,,它包括 寄存器 REG1 时钟端寄存器 REG1 数据输出端 Q 的延迟(Tco)两级寄存器之间的组合逻辑与布线延迟( Tdata) 之和。

图 中的△T 为时钟偏斜,等于时钟到第二级寄存器时钟端的延迟时钟到第一级寄存器的时钟端的延迟 之差。注:△T 的值可以为正值也可以为负 值,一般情况它们之间的差就为一个正值,更容易计算。

另外Ts 为建立时间,Th 为保持时间,T_cycle 为时钟周期

根据波形图所表示的内容可以得出建立保持时间公式的推导,如下所示:

建立时间的公式为:Ts = T_cycle – T1 + △T = T_cycle –(Tco + Tdata)+ △T

保持时间的公式为:T1 – △T = (Tco + Tdata)– △T

第5章:条件语句、循环语句、块语句和生成语句

块语句:

1、顺序块: begin end

(1)块内的语句是按顺序执行的,即只有上面一条语句执行完后下面的语句才能执行。

(2)每条语句的延迟时间是相对于前一条语句的仿真时间而言的。

(3)直到最后一条语句执行完,程序流程控制才跳出该语句块。

2、并行块: fork join

(1)块内语句是同时执行的,即程序流程控制一进入到该并行块,块内语句则开始同时并

行地执行。

(2)块内每条语句的延迟时间是相对于程序流程控制进入到块内的仿真时间的。

(3)延迟时间是用来给赋值语句提供执行时序的。

(4)当按时间时序排序在最后的语句执行完后或一个disable语句执行时,程序流程控制

跳出该程序块。

3、生成块 generate endgenerate

3种生成语句的方法: 循环生成、条件生成、case生成

生成范围内允许声明下列数据类型:

(1)net(线网)、reg(寄存器):

(2)integer(整型数),real(实型数)、time(时间型)、realtime(实数时间型);

(3)event(事件)

不允许出现在生成范围之中的模块项声明包括:

(1)参数、局部参数:

(2)输入、输出和输入/输出声明;

(3)指定块。

生成块的本质是使用循环内的一条语句来代替多条重复的Verilog语句,简化用户的编程。

条件语句

case语句的所有表达式值的位宽必须相等,只有这样,控制表达式和分支表达式才能进

行对应位的比较。一个经常犯的错误是用'bx,'bz来替代n'bx,n'bz,这样写是不对的,因为信

号x,z的默认宽度是机器的字节宽度,通常是32位(此处n是case控制表达式的位宽)。

其中casez语句用来处理不考虑高阻值z的比较过程,casex语句则将高阻值z和不定值都视为不必关心的情况。所谓不必关心的情况,即在表达式进行比较时,不将该位的状态考虑在内。

循环语句

1、forever 连续执行 forever begin end forever 必须写在initial块中。

2、repeat 连续执行一条语句n次。 repeat (n)begin end

3、while

while(?) begin end

4、for for(i=0; i<n; i=i+1) begin end

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

1、initial 语句

initial 语句在仿真开始时对变量初始化,初始化并不需要任何仿真时间。

2、always语句

同步复位和异步复位

  1. //同步复位
  2. always @ (posedge sys_clk)
  3. if(sys_rst_n == 1'b0) //在时钟的上升沿才复位
  4. a <= 0;
  5. else
  6. a <= 1'b1;
  7. //异步复位
  8. always @ (posedge sys_clk or negedge sys_rst_n)
  9. if(sys_rst_n == 1'b0) //当复位信号为0时触发,和时钟无关
  10. a <= 0;
  11. else
  12. a <= 1'b1;

wait 关键字 (可以理解为if)

always

wait (count_enable) #20 count = count + 1;

3、task(任务)

任务和函数的不同:

(1)函数只能与主模块共用同一个仿真时间单位,而任务可以定义自己的仿真时间单位。

(2)函数不能启动任务,而任务能启动其他任务和函数。

(3)函数至少要有一个输入变量,而任务可以没有或有多个任何类型的变量。

(4)函数返回一个值,而任务则不返回值

任务的调用源码: caculation(data_in, data_out);

函数调用源码: data_out = caculation(data_in);

task和function中是不能使用initial和always的

任务定义和调用:

  1. //任务定义
  2. task my_task;
  3. input a,b;
  4. inout c;
  5. output d,e;
  6. begin
  7. d = a + b;
  8. e = a + b;
  9. end
  10. endtask
  11. //任务调用my_task(m,n,o,p,q);

常用的系统任务

$display (p1, p2, p3);

$write (p1, p2, p3);

这两个函数和系统任务的作用是用来输出信息,即将参数p2到pn按参数p1给定的格式

输出。参数p1通常称为“格式控制”,参数p2至pn通常称为“输出表列”。

文件输出任务:

打开文件: $fopen("a.txt");

任务$fopen返回一个被称为多通道描述符(multichannel descriptor)的32位值。

integer a;

a = $fopen("a.txt");

写文件 :$fdisplay、 $fmonitor、$fwrite、$fstrobe

$fdisplay(a,"hello")

关闭文件

$fclose(a);

  1. integer handle1, handle2, handle3; //整数为32位
  2. integer desc1, desc2, desc3;
  3. intial
  4. begin
  5. handle1 = $fopen("1.out"); //handle1 = 32'b0010; 第一位为1
  6. handle2 = $fopen("2.out"); //handle2 = 32'b00100;
  7. handle3 = $fopen("3.out"); //handle3 = 32'b001000;
  8. desc1 = handle1 | 1; //desc1 = 32'b0010
  9. $fdisplay(desc1, "aaa"); //写到文件1.out
  10. desc2 = handle2 | handle1; //desc2 = 32'b00110
  11. $fdisplay(desc1, "aaa"); //写到文件1.out 和2.out
  12. desc3 = handle3;
  13. $fdisplay(desc3, "aaa"); //只写到文件3.out
  14. $fclose(handle1); //关闭文件1
  15. end

4、function (函数) 函数的目的是返回一个用于表达式的值。

函数的定义:

①函数的定义不能包含有任何的时间控制语句,即任何用#、@、或wait来标识的语句。

②函数不能启动任务。

③定义函数时至少要有一个输入参量。

④在函数的定义中必须有一条赋值语句给函数中的一个内部变量赋以函数的结果值,该

内部变量具有和函数名相同的名字。

函数不能包含非阻塞赋值

函数不能返回数组

  1. //函数的定义//至少有一个输入变量
  2. function [7:0] return_data; //return_data 既作为函数名,也作为返回的寄存器变量
  3. input [3:0] a;
  4. reg[3:0] index;
  5. begin
  6. return_data = {a, index};
  7. end
  8. endfunction
  9. //调用
  10. out = return_data(b);

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

1、$monitor(p1, p2, ..., pn);

$monitor提供了监控和输出参数列表中的表达式或变量值的功能。

$monitoron 和 $monitoroff任务是通过打开和关闭监控标志来控制监控任务$monitor的启动和停止。

$monitor ( $time,,“rxd=%b txd=%b“,rxd,txd );

2、$time

$time可以返回一个64位的整数来表示的当前仿真时刻值, $time总是输出整数

$realtime 返回的时间数字是一个实型数,无须进行取整操作。

3、$finish,退出仿真器

4、$stop 是把EDA工具(例如仿真器)置成暂停模式

5、$readmemb和$readmemh,并用来从文件中读取数据到存储器中。这两个系统任务可以在仿真的任何时刻被执行使用。

  1. initial
  2. readmemh("mem.data",mem); //装数据到起始地址为1的存储器单元中
  3. initial
  4. readmemh("mem.data",mem,16); //装数据到起始地址为16的存储器单元中,一直到地址是256的单元为止
  5. initial
  6. readmemh("mem.data",mem,128,1); //装数据到起始地址为128的存储器单元中,一直到地址是1的单元为止

6、$random 当函数被调用时返回一个32位的随机数。

$random一般的用法是:$ramdom%b,其中b>0。它给出了一个范围在(-b+1):

(b - 1)中的随机数。下面给出一个产生随机数的例子:

reg [23:0] rand:

rand = $random % 60;

上面的例子给出了一个范围在 -59 ~ 59之间的随机数,下面的例子通过位拼接操作产生

一个值在0一59之间的数。

reg【23:0】rand;

rand= { $random} % 60;

7、编译预处理

`define

  1. `define signal string
  2. module
  3. `define WORDSIZE 8
  4. wire[3:0] data;
  5. assign data = (`WORDSIZE);
  6. endmodule

`include 文件包含 `include "a.v"

`timescale <时间单位> /<时间精度>

timescale命令用来说明跟在该命令后的模块的时间单位和时间精度。

  1. timescale 1ns/1ps:
  2. //在这个命令之后,模块中所有的时间值都表示是1ns的整数倍。这是因为在timescale命令中,定义了时间单位是1ns。模块中的延迟时间可表达为带3位小数的实型数,因为timescale命令定义时间精度为1ps。
  3. //例
  4. timescale 10 ns/1 ns
  5. module test;
  6. reg set;
  7. parameter d=1.55:
  8. initial
  9. begin
  10. #d set=0: //因为是整数倍,精度为1ns,所以是16ns #d set=l; //也是16ns
  11. end
  12. endmodule

条件编译 `ifdef `else `endif

  1. `ifdef 宏名(标识符)
  2. 程序1
  3. `else
  4. 程序2
  5. `endif
  6. //例
  7. `ifdef TEST //当程序中`define TEST 调用
  8.     module a
  9. endmodule
  10. `elsemodule b
  11. endmodule
  12. `endif

条件执行 $test $plusargs

if($test$plusargs ("AAA”))   //需要`define AAA 才触发

可以使用系统任务关键字$value$plusargs来进一步控制条件执行。该系统任务用于

测试调用选项的参数值。如果没有找到匹配的调用选项,那么$value$plusargs返回0:如果

找到匹配的选项,那么$value$plusargs返回非0值。

  1. if($value $pluargs("test = %s", test_string))
  2. elseif($value $pluargs("clk_t = %d", clk_priod))
  3. else//用test = "test1.vcc" clk_t = 10 来启动

第8章 语法概念总复习练习

1、定义4位的输入矢量可这么定义:

input [3:0] P, Q, R; // P,Q,R都是4位

2、b = 8'bZ0 =8'bZZZZ_ZZZ0;

3、integer 定义的整数可为负数

4、

编辑

5、位拼接运算符必须指明位数,若不指明则隐含着为32位的二进制数,

例{1, 0} = 64'h00000001_00000000

第二部分 设计和验证部分

第9章 Verilog HDL模型的不同抽象级别

1、分为行为模块和结构模块

2、5种不同描述方法:

(1)系统级(system); (行为级)

(2)算法级(algorithmic).;(行为级)

(3)RTL(Register-Transfer-Level);(行为级)

(4)门级(gate-level); (结构级)

(5)开关级(switch-level)

3、and 与门;

nand 与非门;

nor 或非门;

or 或门

xor 异或门;

xnor 异或非门;

buf 缓冲器;

not 非门。

4、所谓逻辑综合就其实质而言是设计流程中的一个阶段,在这一阶段中将较高级抽象层次

的描述自动地转换成较低层次描述。就现在达到的水平而言,所谓逻辑综合就是通过综合器

HDL程序转换成标准的门级结构网表,而并非真实具体的门级电路。真实的电路需要布局布线。

5、用户定义的原语UDP(user defined primitives)

  1. //定义UDP的语法
  2. primitive 元件名 (输出端口名, 输入端口名, 输入端口名2...)
  3. output reg 输出端口名;
  4. input 输入端口名1, 输入端口名2...
  5. initial
  6. begin
  7. end
  8. table
  9. endtable
  10. endprimitive

(1)UDP只能有一个输出端,而且必定是端口说明列表的第一项。

(2)UDP可以有多个输入端,最多允许有10个输入端。

(3)UDP所有端口变量必须是标量,也就是必须是1位的。

(4)在UDP的真值表项中,只允许出现0,1,X的3种逻辑值,高阻值状态Z是不允许出

现的。

(5)只有输出端才可以被定义为寄存器类型变量。

(6)initial语句用于为时序电路内部寄存器赋初值,只允许赋0,1,X的3种逻辑值,默认值

为X

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

1、用Verilog HDL来描述加法器

  1. module add4(X,Y,sum,C);
  2. input [3 :0]X,Y;
  3. output [3:0]sum;
  4. output C;
  5. assign {C,Sum} = X + Y;
  6. endmodule

2、乘法器

两个4位2进制数X 和 Y相乘的延时时间

2.1 逐位进位乘法器

编辑

逐位进位乘法器所需时间: 俩个4位的二进制数,结果是8位, 4 X 8 + 1 =33个门的传输延时。

2.2 超前进位加法器

需要1个与门 + 4个全加器 + 3位超前进位加法器的传输延时

3、总线: 总线是运算部件之间数据流通的公共通道, 各运算部件和数据寄存器组可以通过带控制端的三态门与总线的连接。通过对控制端电平的控制来确定在某一时间片段内,总线归哪两个或哪几个部件使用。

4、流水线

所谓流水线设计实际上是把规模较大、层次较多的组合逻辑电路分为几个级,在每一级插

入寄存器组并暂存中间数据。K级的流水线就是从组合逻辑的输入到输出恰好有K个寄存

器组(分为K级,每一级都有一个寄存器组),上一级的输出是下一级的输入而又无反馈的

电路。

优点:能提高吞吐量

流水线加法器(或乘法器)与组合逻辑加法器(或乘法器)的比较:

采用流水线技术可以在相同的半导体工艺的前提下通过电路结构的改进来大幅度地提高

重复多次使用的复杂组合逻辑计算电路的吞吐量。下面是一个位全加器的例子。为实现该加法功能需要3级电路:

(1)加法器输入的数据产生器和传送器;

(2)数据产生器和传送器的超前进位部分,

(3)数据产生、传送功能和超前进位三者求和电路。

6*10流水线乘法器原理图

流水线操作(面积换取速度):

流水线处理是提高组合逻辑设计的处理速度和吞吐量的最常用手段。如果某个组合逻辑

设计的处理流程可以分为若干个步骤,而且整个数据处理过程是“单流向”的,即没有反馈或者

迭代运算,前一个步骤的输出是下一个步骤的输入,则可以考虑采用流水线设计方法提高系统

的数据处理频率,即吞吐量。

第11章 复杂数字系统的构成

1、数字逻辑种类

组合逻辑: 输出只是当前输人逻辑电平的函数(有延时),与电路的原始状态无关的逻辑电路.

时序逻辑:输出不只是当前输入的逻辑电平的函数,还与电路目前所处的状态有关的逻辑电路

2、在verilog 中启用同步时序逻辑

用Verilog HDL设计的可综合模块,必须避免使用异步时序逻辑,

利用上一个时钟为下一个时钟创造触发条件:确定下一个状态所使用的组合电路的延迟与时钟到各触发器的差值必须小于一个时钟周期的宽度。采用的措施:

(1)全局时钟网络布线时尽量使各分支的时钟一致。

(2)采用平衡树结构,在每一级加入缓冲器,使到达每个触发器时钟端的时钟同步。

3、跨时钟域处理

为了避免由异步时钟域产生的错误,经常使用双口RAM(DPRAM),FIFO缓存的方法完

成异步时钟域之间的数据传送

第12章:同步状态机的原理、结构和设计

mealy 状态机 :如果时序逻辑的输出不但取决于状态还取决于输入。

moore 状态机: 有些时序逻辑电路的输出只取决于当前状态

独热编码: 1000 0100 0010 0001

格雷编码: 00 01 10 11

第13章 设计可综合的状态机的指导原则

综合的一般原则

通常,综合的一般原则为:

(1)综合之前一定要进行仿真,这是因为仿真会暴露逻辑错误,所以建议大家这样做。如

果不做仿真,没有发现的逻辑错误会进人综合器,使综合的结果产生同样的逻辑错误。

(2)每一次布局布线之后都要进行仿真,在器件编程或流片之前要做最后的仿真。

(3)用Verilog HDL描述的异步状态机是不能综合的,因此应该避免用综合器来设计:如

果一定要设计异步状态机,则可用电路图输人的方法来设计。

(4)如果要为电平敏感的锁存器建模,使用连续赋值语句是最简单的方法。

always块可以表示时序逻辑或者组合逻辑,也可以用always块既表示电平敏感的透

明锁存器又同时表示组合逻辑,但是不推荐使用这种描述方法,因为这容易产生错误和多余的

电平敏感的透明锁存器。

(I)对一个寄存器型(reg)和整型(integer)变量给定位的赋值,只允许在一个always块内

进行,如在另一always块中也对其赋值,这是非法的。

(2)把某一信号值赋为‘bx,综合器就把它解释成无关状态,因而综合器为其生成的硬件

电路最简洁。

(3)带有posedge或negedge关键字的事件表达式表示沿触发的时序逻辑,没有posedge

或negedge关键字的表示组合逻辑或电平敏感的锁存器,或者两种都表示。

4)每个在always块中赋值的信号都必须定义成reg型或整型。整型变量默认为32位,

使用Verilog操作符可对其进行二进制求补的算术运算。综合器还支持整型变量的范围说

状态机的异步置位与复位

异步置位与复位是与时钟无关的

  1. //带异步、高电平有效的置位与复位
  2. always @ (posedge clk or posedge set or posedge reset)
  3.     if(reset)
  4.    
  5.     else
  6.         if(set)
  7.        
  8.         else

同步置位与复位

同步置位与复位是指只有在时钟的有效跳变沿时刻置位或复位,信号才能使触发器置位

或复位(即,使触发器的输出分别转变为逻辑1或0)。因此不要把set和reset信号名列入always

  1. //正沿触发
  2. always @(posedge clk)
  3. //负沿触发
  4. always @ (negedge clk)
  5. //同步的具有高电平有效的置位与复位端的always块
  6. always@ (posedge clk)
  7.     if(reset)
  8.     else
  9.         if(set)
  10.         else

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

在描述组合逻辑的always块中用阻塞赋值,则综合成组合逻辑的电路结构;

在描述时序逻辑的always块中用非阻塞赋值,则综合成时序逻辑的电路结构。

冒险和竞争

若有两条或两条以上语句准备在同一时刻执行,但由于语句的排列顺序不同(而这种排列顺序

的不同是IEEE Verilog标准所允许的),却产生了不同的输出结果。这就是造成Verilog模块

冒险和竞争现象的原因。

阻塞赋值

阻塞赋值的执行可以认为是只有一个步骤的操作,即计算RHS(等式右边)并更新LHS(等式左边)。

阻塞赋值产生的竞争冒险

  1. //由阻塞赋值引起的竞争冒险
  2. module fbosc1
  3. (
  4.     input wire clk,
  5.     input wire rst,
  6.     output reg y1;
  7.     output reg y2;
  8. );
  9. always@ (posedge clk or posedge rst)
  10.     if(rst)
  11.         y1 = 0;
  12.     else
  13.         y1 = y2;
  14. always@ (posedge clk or posedge rst)
  15.     if(rst)
  16.         y2 = 1;
  17.     else
  18.         y2 = y1;
  19. endmodule

非阻塞赋值

非阻塞赋值操作符用小于等于号(即<=)表示。

在赋值操作时刻开始时计算非阻塞赋值符的RHS表达式,赋值操作结束时刻才更新LHS在计算非阻塞赋值的RHS表达式和更新LHS期间,其他的Verilog语句,包括其他的语句可以访问和更新等式的两边。

非阻塞赋值看做2个步骤

1:在赋值开始时刻,计算非阻塞赋值RHS表达式;

2,在赋值结束时刻,更新非阻塞赋值LHS表达式,

非阻塞赋值语句不仅可以用于时序逻辑,也可以用于组合逻辑的描述。

在同一个always块中,可对某同一变量进行多次非阻塞赋值,但在多次赋值中,只有最后一次赋值对该变量起作用。

编程要点

(1)时序电路建模时,用非阻塞赋值。

(2)锁存器电路建模时,用非阻塞赋值。

(3)用always块建立组合逻辑模型时,用阻塞赋值。

(4)在同一个always块中建立时序和组合逻辑电路时,用非阻塞赋值。

(5)在同一个always块中不要既用非阻塞赋值又用阻塞赋值。

(6)不要在一个以上的always块中为同一个变量赋值。

(7)用$strobe系统任务来显示用非阻塞赋值的变量值。

(8)在赋值时不要使用#0延迟。

层次化事件队列:用于调度仿真事件的不同的verilog 事件队列,层次化队列是被看作一个概念模型。

包括:

  1. 动态事件队列

阻塞赋值;计算非阻塞赋值语句右边的表达式;连续赋值;执行$display命令;计算原语的输入和输出的变化。

  1. 停止运行的事件队列:#0延时阻塞赋值

  1. 非阻塞事件队列:更新非阻塞赋值语句等式左边的值

  1. 监控事件队列

  1. 其他指定的PLI命令队列,其他PLI命令

移位寄存器模型

阻塞赋值实现:

  1. always@ (posedge clk)
  2.     begin
  3.         q3 = q2;
  4.         q2 = q1;
  5.         q1 = d;
  6.     end

非阻塞赋值实现:

  1. //第一种
  2. always@ (posedge clk)
  3.     begin
  4.         q3 <= q2;
  5.         q2 <= q1;
  6.         q1 <= d;
  7.     end
  8. //第2种
  9. always@ (posedge clk)
  10. begin
  11.  q1 <= d;
  12. q2 <= q1;
  13. q3 <= q2;
  14. end

原则:

原则1 时序电路建模时,用非阻塞赋值

原则2 锁存器电路建模时,用非阻塞赋值

原则3 用always块描述组合逻辑时,应采用阻塞赋值语句。

原则4在同一个always块中描述时序和组合逻辑混合电路时,用非阻塞赋值,

原则5 不要在对同一个always块中同时使用阻塞和非阻塞赋值

原则6 严禁在多个always块中对同一个变量赋值

7 用$strobe系统任务来显示, 应该使用非阻塞赋值的变量值

8 在赋值时不要使用#0 延迟

$monitor, $display, $strobe, #0显示的排序

1 $display (执行排在非阻塞赋值数据更新事件之前)

2 #0 (将赋值事件强制接入停止运行事件队列中)

3 $monitor

4 $strobe

第15章 较复杂时序逻辑电路设计实践

序列检测器

输入一串序列如:110010010000100

检测出10010

写出状态转换

第十六章 复杂时序逻辑电路设计实践

I2C串行EEPROM电路

I2C(Inter Integrated Circuit)双向二线制串行总线协议定义为:只有在总线处于“非忙”

状态时,数据传输才能开始。在数据传输期间,只要时钟线为高电平,数据线都必须保持稳定,

否则数据线上的任何变化都被当作“启动”或“停止”信号。

  1. 总线非忙状态:sda 和 scl 保持高电平

  1. 启动数据传输:当时钟线(scl)为高电平,数据线(sda)由高到低的下降沿,视为启动信号

  1. 传输数据:在启动信号出现后,scl为高电平,数据线是稳定的,数据的变化必须在时钟线的低电平期间完成。

  1. 停止数据传输:当时钟线(SCL)为高电平,数据线sda由低电平到高电平的上升沿被认为是停止信号。

  1. 应答信号:每个正在接收/发出数据的EEPROM在接收/发出一个字节的数据后,要发出/接收一个应答信号,因此主机在发送/接收一个字节时要产生额外一个脉冲。

第17章 简化的RISC_CPU设计

RISC:精简指令集计算机

CPU具有的基本功能:

  1. 取指令

  1. 分析指令

  1. 执行指令

CPU必须含有以下部件:

  1. 算术逻辑运算部件

  1. 累加器

  1. 程序计数器

  1. 指令寄存器和译码器

  1. 时序和控制部件

把RISC_CPU分成8个基本部件

(1)时钟发生器(CLKGEN);

(2)指令寄存器(REGISTER);

(3)累加器(ACCUMULATOR);

(4)算术逻辑运算单元(ALU);

(5)数据控制器(DATACTL);

(6)状态控制器(MACHINE);

(7)程序计数器(COUNTER);

(8)地址多路器(ADDR)。

实践:还不会,先略过

第18章 虚拟器件/接口、 IP和基于平台的设计方法及其在大型数字系统设计中的作用

设计IP:即虚拟组件/芯片(Virtual Chips)可以是用软核/硬核构成的器件,即用RTL/Netlist级

Verilog或VHDL语言描述的电路模型。通过参数配置可以将该模型转换成系列化的具体电路组件。

验证IP:验证IP则是用系统级Verilog或VHDL语言描述的常用大规模集成电路

(如ROM和RAM)、总线接口和CPU的行为模型等,往往是不可综合的,也没有必要综合。

综合

就是把.v文件送到综合器处理,在选定实现器件和选取生成Verilog网表的前提下,启动综合器的编译。综合器会自动生成一系列文件,向操作者报告综合的结果。其中生成的Verilog Netlist文件(扩展名为,vm),表示自动生成的门级逻辑结构网表,仍然用Verilog语句表示,但比输人的源文件更具体。

布局布线

就是把综合后生成的另一种文件(EDIF),在布线工具控制下进行处理,启动布线工具的编译。布局布线工具会自动生成一系列文件,向操作者报告布局布线的结果。其中生成的Verilog Netlist文件(扩展名为.vo),表示自动生成的具体基本门级结构和连接的延迟,库中的基本部件比综合后的更加具体

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/533869
推荐阅读
相关标签
  

闽ICP备14008679号