天天看点

011 Verilog原语

原语

是构成设计的最基本单元,通过真值表描述其功能,包括基本逻辑门在内有26个预定义功能模型

n输入逻辑门

011 Verilog原语
原语 描述 使用
and 与门 and(yout, xin1, xin2, xin3)
nand 与非 nand(yout, xin1, xin2, xin3)
or 或门 or(yout, xin1, xin2, xin3)
nor 或非 nor(yout, xin1, xin2, xin3)
xor 异或 xor(yout, xin1, xin2, xin3)
xnor 同或 nxor(yout, xin1, xin2, xin3)

n输出组合门

011 Verilog原语
011 Verilog原语
011 Verilog原语
011 Verilog原语

UDP(User Defined Primitive,用户自定义原语)

符号汇总

符号 意义
0,1,x 逻辑0,1,x为未知值,UDP中没有z
? 无关逻辑,可以是0,1,x
b 逻辑0或1
- 不变化
(xy) 从x变为y,如(01)为上升沿
* 输入信号的任何变化
r 上升沿
f 下降沿
p 含x的上升沿,等同于(01)、(0x)、(x1)
n 含x的下降沿,等同于(10)、(x0)、(1x)

与门

primitive and(y, x1, x2);
	output y;
	input x1, x2;

	table
	// x1 x2 : y
	0 0 : 0;
	0 1 : 0;
	1 0 : 0;
	1 1 : 1;
	endtable
endprimitive
           

2输入多路复用器

输入可以是0,1,x,所以考虑所有情况的2输入多路复用器如下:

primitive mux_two(out, select, a, b);
	output out;
	input select, a, b;
	// y = select ? a : b;

	table
	// select	a	b	:	out
	   0		0	0	:	0;
	   0		0	1	:	0;
	   0		0	x	:	0;
	   0		1	0	:	1;
	   0		1	1	:	1;
	   0		1	x	:	1;

	   1		0	0	:	0;
	   1		1	0	:	0;
	   1		x	0	:	0;
	   1		0	1	:	1;
	   1		1	1	:	1;
	   1		x	1	:	1;

	   x		0	0	:	0;
	   x		1	1	:	1;
	endtable
endprimitive
           

使用助记符?简化,?=0,1,x

primitive mux_two(out, select, a, b);
	output out;
	input select, a, b;
	// y = select ? a : b;

	table
	// select	a	b	:	out
	   0		0	?	:	0;
	   0		1	?	:	1;

	   1		?	0	:	0;
	   1		?	1	:	1;

	   ?		0	0	:	0;
	   ?		1	1	:	1;
	endtable
endprimitive
           

透明锁存器(电平敏感)

其实就是带使能的锁存器

primitive latch_with_enable(q_out, enable, data);
	output q_out;
	input enable, data;
	reg q_out;
	// q_out = enable ? data : q_out;
	// - 表示保持

	table
	// 时序逻辑table格式
	// input1	input2	state 	: 	output/next_state
	// enable	data	state	:	q_out/next_state
	   1		1			?	:	1;
	   1		0			?	:	0;
	   0		?			?	:	-;

	   x		0			0	:	-;
	   x		1			1	:	-;
	endtable
endprimitive
           

D触发器(边沿敏感)

primitive DFF(q_out, clk, data);
	output q_out;
	input clk, data;
	reg q_out;
	// q_out = posedge(clk) ? data : q_out;
	// - 表示保持

	table
	// 时序逻辑table格式
	// input1	input2	state 	: 	output/next_state
	// clk		data	state	:	q_out/next_state
	   (01)		0		?		:	0;
	   (01)		1		?		:	1;
	   (0?)		1		1		:	1;

	   (?0)		?		?		:	-;

	   ?		(??)	?		:	-;
	endtable
endprimitive