cpld的verilog学习(3)

2019-09-02 19:04

用数据流描述方式对一个设计建模的最基本的机制就是使用连续赋值语句。在连续赋值语句中,某个值被指派给线网变量。 连续赋值语句的语法为:

assign [delay] LHS_net = RHS_ expression;

右边表达式使用的操作数无论何时发生变化, 右边表达式都重新计算, 并且在指定的时延后变化值被赋予左边表达式的线网变量。时延定义了右边表达式操作数变化与赋值给左边表达式之间的持续时间。如果没有定义时延值, 缺省时延为0。

下面的例子显示了使用数据流描述方式对2-4解码器电路的建模的实例模型。 `timescale 1ns/ 1ns

module Decoder2x4 (A, B, EN, Z); input A, B, EN; output [ 0 :3] Z; wire Abar, Bbar;

assign #1 Abar = ~ A; / / 语句 1。 assign #1 Bbar = ~ B; / / 语句 2。

assign #2 Z[0] = ~ (Abar & Bbar & EN) ; / / 语句 3。 assign #2 Z[1] = ~ (Abar & B & EN) ; / / 语句 4。 assign #2 Z[2] = ~ (A & Bbar & EN) ; / / 语句 5。 assign #2 Z[3] = ~ (A & B & EN) ; / / 语句 6。 endmodule

以反引号“ ` ”开始的第一条语句是编译器指令, 编译器指令`timescale 将模块中所有时延的单位设置为1 ns,时间精度为1 ns。例如,在连续赋值语句中时延值#1和#2分别对应时延1 ns和2 ns。

模块Decoder2x4有3个输入端口和1个4位输出端口。线网类型说明了两个连线型变量Abar和Bbar (连线类型是线网类型的一种)。此外,模块包含6个连续赋值语句。

当EN在第5 ns变化时,语句3、4、5和6执行。这是因为EN是这些连续赋值语句中右边表达式的操作数。Z[0]在第7 ns时被赋予新值0。当A在第15 ns变化时, 语句1、5和6执行。执行语句5和6不影响Z[0]和Z[1]的取值。执行语句5导致Z[2]值在第17 ns变为0。执行语句1导致Abar在第16 ns被重新赋值。由于Abar的改变,反过来又导致Z[0]值在第18 ns变为1。

请注意连续赋值语句是如何对电路的数据流行为建模的;这种建模方式

是隐式而非显式的建模方式。此外,连续赋值语句是并发执行的,也就是说各语句的执行顺序与其在描述中出现的顺序无关。 2.4 行为描述方式

设计的行为功能使用下述过程语句结构描述: 1) initial语句:此语句只执行一次。

2) always语句:此语句总是循环执行, 或者说此语句重复执行。 只有寄存器类型数据能够在这两种语句中被赋值。寄存器类型数据在被赋新值前保持原有值不变。所有的初始化语句和always语句在0时刻并发执行。

下例为always语句对1位全加器电路建模的示例。 module FA_Seq (A, B, Cin, Sum, Cout); input A, B, Cin; output Sum, Cout; reg Sum, Cout; reg T1, T2, T3; always

@ ( A or B or Cin ) begin Sum = (A ^ B) ^ Cin; T1 = A & Cin; T2 = B & Cin; T3 = A & B; Cout = (T1 T2) T3; end endmodule

模块FA_Seq 有三个输入和两个输出。由于Sum、Cout、T1、T2和T3在always 语句中被赋值,它们被说明为 reg 类型(reg 是寄存器数据类型的一种)。always 语句中有一个与事件控制(紧跟在字符@ 后面的表达式)。相关联的顺序过程(begin-end对)。这意味着只要A、B或Cin 上发生事件,即A、B或Cin之一的值发生变化,顺序过程就执行。在顺序过程中的语句顺序执行,并且在顺序过程执行结束后被挂起。顺序过程执行完成后,always 语句再次等待A、B或Cin上发生的事件。

在顺序过程中出现的语句是过程赋值模块化的实例。模块化过程赋值在下一条语句执行前完成执行。过程赋值可以有一个可选的时延。 时延可以细分为两种类型:

1) 语句间时延: 这是时延语句执行的时延。

2) 语句内时延: 这是右边表达式数值计算与左边表达式赋值间的时延。 下面是语句间时延的示例: Sum = (A ^ B) ^ Cin; #4 T1 = A & Cin;

在第二条语句中的时延规定赋值延迟4个时间单位执行。就是说,在第一条语句执行后等待4个时间单位,然后执行第二条语句。下面是语句内时延的示例。

Sum = #3 (A^ B) ^ Cin;

这个赋值中的时延意味着首先计算右边表达式的值, 等待3个时间单位,然后赋值给Sum。

如果在过程赋值中未定义时延,缺省值为0时延,也就是说,赋值立即发生。这种形式以及在always 语句中指定语句的其他形式将在第8章中详细讨论。

下面是initial语句的示例: `timescale 1ns / 1ns module Test (Pop, Pid); output Pop, Pid; reg Pop, Pid; initial begin

Pop = 0; // 语句 1。 Pid = 0; // 语句 2。 Pop = #5 1; // 语句 3。 Pid = #3 1; // 语句 4。 Pop = #6 0; // 语句 5。 Pid = #2 0; // 语句 6。 end endmodule

initial语句包含一个顺序过程。这一顺序过程在0 ns时开始执行,并且在顺序过程中所有语句全部执行完毕后, initial语句永远挂起。这一顺序过程包含带有定义语句内时延的分组过程赋值的实例。语句1和2在0 ns时执行。第三条语句也在0时刻执行,导致Pop 在第5 ns时被赋值。语句4在第5 ns执行,并且Pid 在第8 ns被赋值。同样,Pop在14 ns被赋值0,Pid在第16 ns被赋值0。第6条语句执行后,initial语句永远被挂起。 2.5 结构化描述形式

在Verilog HDL中可使用如下方式描述结构: 1) 内置门原语(在门级); 2) 开关级原语(在晶体管级); 3) 用户定义的原语(在门级); 4) 模块实例 (创建层次结构)。

通过使用线网来相互连接。下面的结构描述形式使用内置门原语描述的全加器电路实例。

module FA_Str (A, B, Cin, Sum, Cout); input A, B, Cin; output Sum, Cout; wire S1, T1, T2, T3; xor

X1 (S1, A, B), X2 (Sum, S1, Cin); and

A1 (T3, A, B), A2 (T2, B, Cin), A3 (T1, A, Cin), or

O1 (Cout, T1, T2, T3); endmodule

在这一实例中,模块包含门的实例语句,也就是说包含内置门xor、and和or 的实例语句。门实例由线网类型变量S1、T1、T2和T3互连。由于没有指定的顺序, 门实例语句可以以任何顺序出现;图中显示了纯结构;xor、and和or是内置门原语;X1、X2、A1等是实例名称。紧跟在每个门后的信号列表是它的互连;列表中的第一个是门输出,余下的是输入。例如,S1与xor 门实例X1的输出连接,而A和B与实例X1的输入连接。 4位全加器可以使用4个1位全加器模块描述。下面是4位全加器的结构描述形式。

module FourBitFA (FA, FB, FCin, FSum, FCout ); parameter SIZE = 4; input [SIZE:1] FA, FB; output [SIZE:1] FSum input FCin; input FCout;

wire [ 1: SIZE-1] FTemp; FA_Str

FA1( .A (FA[1]), .B(FB[1]), .Cin(FCin), .Sum(FSum[1]), .Cout(FTemp[2])),

FA2( .A (FA[2]), .B(FB[2]), .Cin(FTemp[1]), .Sum(FSum[2]), .Cout(FTemp[2])),

FA3(FA[3], FB[3], FTemp[2], FSum[3], FTemp[3], FA4(FA[4], FB[4], FTemp[3], FSum[4], FCout); endmodule

在这一实例中,模块实例用于建模4位全加器。在模块实例语句中,端口可以与名称或位置关联。前两个实例FA1和FA2使用命名关联方式,也就是说,端口的名称和它连接的线网被显式描述(每一个的形式都为“.port_name (net_name))。最后两个实例语句,实例FA3和FA4使用位置关联方式将端口与线网关联。这里关联的顺序很重要,例如,在实例FA4中,第一个FA[4]与FA_Str 的端口A连接,第二个FB[4]与FA_Str 的端口B连接,余下的由此类推。 2.6 混合设计描述方式

在模块中,结构的和行为的结构可以自由混合。也就是说,模块描述中可以包含实例化的门、模块实例化语句、连续赋值语句以及always语句和initial语句的混合。它们之间可以相互包含。来自always语句和initial语句(切记只有寄存器类型数据可以在这两种语句中赋值)的值能够驱动门或开关,而来自于门或连续赋值语句(只能驱动线网)的值能够反过来用于触发always语句和initial语句。

下面是混合设计方式的1位全加器实例。 module FA_Mix (A, B, Cin, Sum, Cout); input A,B, Cin; output Sum, Cout; reg Cout; reg T1, T2, T3; wire S1;

xor X1(S1, A, B); // 门实例语句。 always

@ ( A or B or Cin ) begin // always 语句。 T1 = A & Cin; T2 = B & Cin;


cpld的verilog学习(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:停车设备基础知识培训稿(定稿) - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: