verilog基础,连续赋值之组合逻辑

2023-12-13 17:45:37

连续赋值语句可以完成任意组合逻辑,本节对基本的逻辑电路进行测试分析,主要包含一下内容:

1. 反相器

2. 与门

3.与非门

4.或门

5.或非门

6.异或门

7.同或门

verilog实现逻辑操作的算符如下

//    ~ .... Invert a single-bit signal or each bit in a bus
//    & .... AND two single bits or each bit between two buses
//    | .... OR two single bits or each bit between two buses
//    ^ .... XOR two single bits or each bit between two buses
//    ~^ ... XNOR two single bits or each bit between two buses
			

1. 反相器

反相器是简单的数字电路。他的功能是实现高低电平的反转。

反相器可以通过~符号可以实现。与c语言一样,都是左边赋值。assign是连续赋值语句的关键字(保留字),等式左边是输出语句,后边的逻辑表达式。反相器的输入有事一个,符号为a,通过~算符运算后,赋值给坐标的y值。y=~a,语句描述了一个反相器电路。一个完成的反相器模块实现如下。

module assign1(
	input a,
	output  y
    );

assign y = ~a;

endmodule

使用xilinx ise14.7进行综合后,得到RTL原理图以及技术原理图如下图,其中RTL原理图主要显示了反相器的逻辑功能。技术原理图中自动增加了ibuf和obuf原语,使用缓冲级把内部逻辑器件与外部信号线隔离起来。

2. 与门

与门的输入可以是2-n输入,以下演示2-5输入与门电路。

module assign1(
	input a5,
	input a1,
	input a2,
	input a3,
	input a4,
	output  y2,
	output  y3,
	output  y4,
	output  y5
    );

assign y2 = a2&a1;
assign y3 = a3&a2&a1;
assign y4 = a4&a3&a2&a1;
assign y5 = a5&a4&a3&a2&a1;

endmodule

RTL原理图如下,寄存器传输级的原理图与预期的一致。多输入与门模块

XST综合后的技术原理图如下,FPGA使用lut4查找表来实现组合逻辑。4个与门有4个输出,使用了4个lut来实现。双击lut可以查看lut具体实现的组合逻辑功能,

双击lut4得到如下结果

3.与非门

module assign1(
	input a5,
	input a1,
	input a2,
	input a3,
	input a4,
	output  y2,
	output  y3,
	output  y4,
	output  y5
    );

assign y2 = ~(a2&a1);
assign y3 = ~(a3&a2&a1);
assign y4 = ~(a4&a3&a2&a1);
assign y5 = ~(a5&a4&a3&a2&a1);

endmodule

RTL原理图

技术原理图,由技术原理图可知,2-4输入与非门,使用Lut查找表即可实现,而5输入与非门需要一个与非门与一个mux二选一选择器时间。

双击lut4-y51得到内部逻辑结构如下

等效增值表

等效方程

小结:

选择器是fpga的基本结构,他可以与lut结合起来实现组合逻辑。

4. 或门

代码

module assign1(
	input a5,
	input a1,
	input a2,
	input a3,
	input a4,
	output  y2,
	output  y3,
	output  y4,
	output  y5
    );

assign y2 = (a2|a1);
assign y3 = (a3|a2|a1);
assign y4 = (a4|a3|a2|a1);
assign y5 = (a5|a4|a3|a2|a1);

endmodule

RTL结构图

技术原理图,总共由4个lut实现组合逻辑,其中lut2+lut4/ y21+y5一起实现了5输入或门

y5的lut表

y5等效方程

6. 或非门

代码

module assign1(
	input a5,
	input a1,
	input a2,
	input a3,
	input a4,
	output  y2,
	output  y3,
	output  y4,
	output  y5
    );

assign y2 = ~(a2|a1);
assign y3 = ~(a3|a2|a1);
assign y4 = ~(a4|a3|a2|a1);
assign y5 = ~(a5|a4|a3|a2|a1);

endmodule

RTL结构图

技术原理图,或非门电路就是在或门电路后面增加一级反相器来实现。

7. 异或门

module assign1(
	input a5,
	input a1,
	input a2,
	input a3,
	input a4,
	output  y2,
	output  y3,
	output  y4,
	output  y5
    );

assign y2 = (a2^a1);
assign y3 = (a3^a2^a1);
assign y4 = (a4^a3^a2^a1);
assign y5 = (a5^a4^a3^a2^a1);

endmodule

RTL结构图

技术原理图,异或门采用Lut查找表来实现,超过5输入的异或门采用两个Lut查找表来实现。

双击y5的lut

8. 同或门

代码

module assign1(
	input a5,
	input a1,
	input a2,
	input a3,
	input a4,
	output  y2,
	output  y3,
	output  y4,
	output  y5
    );

assign y2 = (a2~^a1);
assign y3 = (a3~^a2~^a1);
assign y4 = (a4~^a3~^a2~^a1);
assign y5 = (a5~^a4~^a3~^a2~^a1);

endmodule

RTL结构图,同或门的结构让人眼花缭乱,不用担心,它的本质还是使用lut实现。

技术原理图,使用查找表实现的同或门如下,不管组合逻辑有多么复杂,完全可以使用查找表实现。这不仅简化了逻辑电路的实现,还可以实现逻辑电路编程。这是FPGA使用ram来制作查表来替代门电路的原因。

双击一下y51-lut查找表,内部实现的逻辑功能还是很复杂的。

总结

1. verilog的基本组合逻辑运算可以用assign语句实现,通过基本逻辑算符如~、&、|、^、~^来实现具体的组合逻辑功能。

2. FPGA的反相器使用反相器电路实现,与门,与非门,或门,或非门,同或,异或等多输入组合逻辑均采用lut查找表实现。另外部分组合逻辑可以使用Lut查找表+mux选择器来实现。主要的目的就是简化FPGA资源的使用

3. 逻辑功能的实现都是通过综合工具自动设计的。verilog将功能与具体的逻辑门设计隔离开来,极大的增加了开发效率,是目前verilog商用化的主要原因。另外他也存在缺点,使用verilog语言,让我们对门电路的认识不足,不利于查找电路问题以及进行电路优化,对于高性能的研究还是需要使用VHDL语言。幸运的是,使用verilog基本就满足大多数场景的应用了。

文章来源:https://blog.csdn.net/q511951451/article/details/134972647
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。