用户自定义基元UDP_ZT

用户自定义基元UDP
通过它来实现门级基元的扩展,可模拟2种行为:
·组合行为,由UDP的组合基元来模拟;
·时序行为,由UDP的时序基元来模拟;
一个UDP可以有多个输入,但只能有一个标量输出,输出可有3种状态:0、1、x,不支持高阻态z,但输入的z态往往被当成x态。
1.定义
UDP的定义与模块无关,与模块属同一层次。
规则:
·只允许有一个输出端口的声明,且必须定义在输入端口的定义之前;
·不准有inout端口,不能定义成向量的形式;
·在时序UDP中,输出端口必须定义成寄存器型,而在组合UDP中输出端口却不能定义成寄存器型;
·逻辑实现主体全部在状态表格table中,每一行所对应的输入激励的顺序都与前面输入端口定义的次序一样,且与端口的实际定义内容无关。在table中每个输入/输出端口都有一个域,输入域和输出域之间用冒号隔开,每一行定义了输入信号所产生的特定组合输出。在时序UDP中,还在输入域和输出域之间加入另一个域,指明UDP目前的状态,可认为是目前UDP的实际输出。没有列出的输入组合所对应的输出都为x。
格式:
primitive 名(接口信号表);
output;

//端口声明;
input;
table       //状态表格描述;
endtable
endprimitive

UDP状态表格
符号

解释           注释
0     逻辑0
1     逻辑1
x     未知逻辑
?     逻辑0、1或x    不能用于输出
b     逻辑0或1       不能用于输出
-     不变化         只用于时序基元
(vw)  从v到w         可以是0、1、x或?
*     同(??)         输入的任何变化
r     同(01)         输入上升沿
f     同(10)         输入下降沿
p     同(01)、(0x)、(x1)  含x的上升沿
n     同(10)、(1x)、(x0)  含x的下降沿

2.组合UDP
例,定义一个组合UDP并例化,
primitive mult(mux,control,data1,data2);
output mux;
input control,data1,data2;
//control data1 data2:mux
0 1 0:1;
0 1 1:1;
0 1 x:1;
0 0 ?:0; //?表示0、1、x三种情况,可简化描述表
1 ? 1:1;
1 ? 0:0;
x 0 0:0;
x 1 1:1;
endtable
endprimitive
该多路选择器例化如下,
module ex1(in1,in2,in3,out1);
input in1,in2,in3;
output out1;
wire out1;
mult mult1(out1,in1,in2,in3);
endmodule

3.时序UDP
将有一个存储元素来存储当前状态。分电平和边沿敏感2种。
(1)电平敏感的时序UDP:比组合型多了一个寄存器,主要用来保存当前的状态,也可以当成是当前的输出。当前的输入和状态确定下一个输出,例:
primitive udp_latch(q1,data,clk);
output q1;
input data,clk;
reg q1;
initial
q1=0; //初始化输出信号为0
table
//data clk : q1(current) q1(next state)
0 0 : ? : -;
0 1 : ? : 0;
1 0 : ? : -; //其中?表示并不关心当前状态
1 1 : ? : 1; //它可以是0、1或x
endtable
endprimitive

(2)边沿敏感的时序UDP:某输入的跳变触发输出的改变,表格中每一行只能有一个输入的跳变,D触发器例如:
primitive d_edge(q1,data,clk);
output q1;
input data,clk;
reg q1;
initial
q1=0;
table
//data clk : q1(current) q1(next)
0 (01) : ? : 0;//选通,上升沿
1 (01) : ? : 1;
//no change in output values
0 (0x) : ? : -;//不选通,没有上升沿
1 (0x) : ? : -;
//no change for negedge
? (?0) : ? : -;//不选通,可能是下降沿
//no change for change in data
(??) ? : ? : -;//输入的变化不影响输出
endtable
endprimitive

例2,T触发器,
primitive T_FF(q1,clk,clear);
output q1;
input clk,clear;
reg q1;
table
//clk clear : q1(current) q1(next)
?

1 : ? : 0;
? (10) : ? : -;//忽略clear的下降沿
(10) 0 : 1 : 0;//下降沿触发翻转
(10) 0 : 0 : 1;
(0?) 0 : ? : -;//忽略时钟的上升沿
endtable
endprimitive

构成4位循环计数器:
module counter4(Q,clk,clear);
//IO ports
output [3:0] Q;
input clk,clear;
T_FF tff0(Q[0],clk,clear);
T_FF tff1(Q[1],Q[0],clear);
T_FF tff0(Q[2],Q[1],clear);
T_FF tff0(Q[3],Q[2],clear);
endmodule

(3)混合时序UDP:允许同时定义2中表,当输入变化时,优先处理边沿触发事件,再处理电平事件;若某激励同时触发2种事件则输出结果以电平事件为准(可理解为后修改的结果)。
JK触发器描述的混合时序UDP:
primitive jk_edge(q,clk,j,k,preset,clear);
output q;
input clk,j,k,preset,clear;
reg q;
table
//clk j k preset clear : q(state) q(output)
? ? ? 0 1 : ? : 1;//preset
? ? ? * 1 : 1 : 1;
? ? ? 1 0 : ? : 0;//clear
? ? ? 1 * : 0 : 0;
r 0 0 0 0 : 0 : 1;//normal clocking case
r 0 0 1 1 : ? : -;
r 0 1 1 1 : ? : 0;
r 1 0 1 1 : ? : 1;
r 1 1 1 1 : 0 : 1;
r 1 1 1 1 : 1 : 0;
f ? ? ? ? : ? : -;
b * ? ? ? : ? : -;
b ? * ? ? : ? : -;
endtable
endprimitive

时间: 2024-08-09 10:42:58

用户自定义基元UDP_ZT的相关文章

C#中的基元类型、值类型和引用类型

C# 中的基元类型.值类型和引用类型 1. 基元类型(Primitive Type) 编译器直接支持的类型称为基元类型.基元类型可以直接映射到 FCL 中存在的类型.例如,int a = 10 中的 int 就是基元类型,其对应着 FCL 中的 System.Int32,上面的代码你完全可以写作System.Int32 a = 10,编译器将生成完全形同的 IL,也可以理解为 C# 编译器为源代码文件中添加了 using int = System.Int32. 1.1 基元类型的算术运算的溢出检

[.net]基元线程同步构造

1 /* 基元线程同步构造 2 用户模式构造: 3 易变构造(Volatile Construct) 4 互锁构造(Interlocked Construct):自旋锁(Spinlock) 乐观锁(Optimistic Concurrency Control,乐观并发控制) 5 内核模式构造: 6 事件构造(Event) 7 信号量构造(Semaphore) 8 互斥体构造(Mutex) 9 */ 10 11 //易变构造,Volatile.Write()之前的所有字段写入操作,必须再该方法调用

C#基元类型取值范围对照表

byte   无符号 8 为整数,值为0-255; sbyte   有符号8位整数,-128~127; short   有符号16位整数,范围在-32768~32767 ushort   无符号16位整数 0--32767 int   有符号 32 位整数,-2147483648~2147483647 uint   无符号32位整数,范围在0--2147483647 long   有符号 64位整数,-922372036854775808~~922372036854775807 ulong  

.NET 中,编译器直接支持的数据类型称为基元类型(primitive type).基元类型和.NET框架类型(FCL)中的类型有直接的映射关系.

.NET 中,编译器直接支持的数据类型称为基元类型(primitive type).基元类型和.NET框架类型(FCL)中的类型有直接的映射关系. The primitive types are Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double, and Single. https://msdn.microsoft.com/zh-cn/library/s

5.基元类型、引用类型和值类型

5.1 基远类型 编译器直接支持的数据类型称为基远类型(primitive type). 以下4行到吗生成完全相同的IL int a = 0; //最方便的语法 System.Int32 b = 0; //方便的语法 int c = new int(); //不方便的语法 System.Int32 d = new System.Int32(); //最不方便的语法 C#基元类型与对应的FCL类型 C#中的基元类型 FCL类型 是否与CLS兼容 描述 sbyte System.SByte N 有符

CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段

编程语言的基元类型 某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32();  // a = 0 a = 1; 等价于: int a = 1; 这种语法不仅增强了代码的可读性,其生成的IL代码与使用System.Int32时生成的IL代码是完全一致的. 编译器直接支持的数据类型称为基元类型(primitive type).基元类型直接映射到Framework类库(FCL)中存在的类型.如C#中,int直接映射

CLR VIA C#: 基元类型、 引用类型 和 值类型

一.基元类型 . 引用类型 和 值类型的区别: 1.基元类型(primitive type):编译器直接支持的数据类型: 基元类型 直接映射到 FCL 中存在的类型. C# 小写是基元类型,例如:string ,  大写是FCL类型,例如String,  基元类型直接映射到FCL类型,所以这两者之间没有区别,一模一样,不用纠结使用哪种方式了. 支持 直接使用FCL类型, 不使用基元类型, Float 对应 Single FCL类型: dynamic 对应  System.Object FCL类型

[C#]CLR via C#研习系列:动态基元类型和动态的C#

今天读到了<CLR via C#>中动态基元类型的章节,恰好刚刚在候选区看到了一篇<为什么可以说Java语言是准动态语言?>的文章,其文中说Java依赖反射可以称为'准动态语言',而C#是静态语言. 我先不说结论,先来看一下什么是动态语言. 引用互动百科的词条: 动态语言,准确地说,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化.比如众所周知的ECMAScript(JavaScript)便是一个动态语言.除此之外如Ruby.Python等也

【C#进阶系列】28 基元线程同步构造

多个线程同时访问共享数据时,线程同步能防止数据损坏.之所以要强调同时,是因为线程同步问题实际上就是计时问题. 不需要线程同步是最理想的情况,因为线程同步一般很繁琐,涉及到线程同步锁的获取和释放,容易遗漏,而且锁会损耗性能,获取和释放锁都需要时间,最后锁的玩法就在于一次只能让一个线程访问数据,那么就会阻塞线程,阻塞线程就会让额外的线程产生,阻塞越多,线程越多,线程过多的坏处就不谈了. 所以可以避免线程同步的话就应该去避免,尽量不要去使用静态字段这样的共享数据. 类库和线程安全 .net类库保证了所