verilog基础,连续赋值之组合逻辑-高级篇

2023-12-13 18:11:41

总线:把同类线捆绑在一起形成总线,比如ADC,DAC的数据输出等。这里容易与通讯的总线相混淆。

总线的组合逻辑操作与基本逻辑操作基本一致,但是还是有一些区别,总线的组合逻辑是单值运算。他任然能够实现基本逻辑运算。

(1)总线拼接

(2)总线拆分

1. 总线与门

2.总线与非门

3.总线或门

4.总线或非门

5.总线异或门

6.总线同或门

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


// The forllowing operators can be used on a bussed signal where all bits in the bus 
// are used to perform the operation and a single bit output is resolved.
// 
//    & .... AND all bits together to make single bit output
//    ~& ... NAND all bits together to make single bit output
//    | .... OR all bits together to make single bit output
//    ~| ... NOR all bits together to make single bit output
//    ^ .... XOR all bits together to make single bit output
//    ~^ ... XNOR all bits together to make single bit output
			

(1)总线拼接

通过bit的拼接形成总线,通过拼接算符{}来实现,坐标时高位,右边是低位。

代码

module assign1(
	input a5,
	input a1,
	input a2,
	input a3,
	input a4,
	output [1:0] y1,
	output [3:0] y2,
	output [5:0] y3
    );

assign y1 = {a2,a1};  
assign y2 = {a4,a3,a2,a1};
assign y3 = {a5,y2};


endmodule

RTL结构图,总图可知,总线

技术原理图

(2)总线拆分

代码,拆分组装是经常遇到的,具体实现如下,这个比较灵活,它的本质就是线的重新排列,不需要消耗资源。

// 15 总线拆分
module assign1(
	input [15:0]a,
	output  y1,
	output [3:0] y2,
	output [5:0] y3,
	output [15:0] y4
    );

assign y1 = a[2];    // 取出某一位
assign y2 = a[4:1];    // 取出部分为
assign y3 = {a[4:0],a[9]};    // 取出部分为
assign y4 = a;         // 全拷贝


endmodule

RTL结构图,这里没有内部了

技术原理图

1. 总线与门

总线的输入不在是单值,二十多值输入,可以看成式一个一维向量(vector)。以下定义了长度为2的总线a1,长度为4的a2以及长度为5的a3。并进行总线与操作。

module assign1(
	input[1:0] a1,
	input[3:0] a2,
	input[4:0] a3,
	output  y1,
	output  y2,
	output  y3
    );

assign y1 = &a1;
assign y2 = &a2;
assign y3 = &a3;

endmodule

RTL结构图,总线与操作就是对总线上的各个位bit进行与运算。

技术原理图,与逻辑运算依然可以通过lut查找表来实现,其中5输入与操作可以通过一个Lut+一个mux选择器来实现。

打开lut查找表,lut实现的功能就是与操作

2. 总线与非门

代码

module assign1(
	input[1:0] a1,
	input[3:0] a2,
	input[4:0] a3,
	output  y1,
	output  y2,
	output  y3
    );

assign y1 = ~&a1;
assign y2 = ~&a2;
assign y3 = ~&a3;

endmodule

RTL结构图,总线与非门就是在总线与门的基础上增加了一个反相器实现。

技术原理图,技术原理图也是在与门的基础上增加以及反相器实现。

3.总线或门

代码

module assign1(
	input[1:0] a1,
	input[3:0] a2,
	input[4:0] a3,
	output  y1,
	output  y2,
	output  y3
    );

assign y1 = |a1;
assign y2 = |a2;
assign y3 = |a3;

endmodule

RTL结构图,总线或门就是对总线上的各个位bit进行或运算。

技术原理图,依然是采用Lut查找表实现或运算。

4.总线或非门

代码

module assign1(
	input[1:0] a1,
	input[3:0] a2,
	input[4:0] a3,
	output  y1,
	output  y2,
	output  y3
    );

assign y1 = ~|a1;
assign y2 = ~|a2;
assign y3 = ~|a3;

endmodule

RTL结构图,在总线或门的基础上增加了一个反相器。

技术原理图,组合逻辑依然是使用Lut查找表实现。

5.总线异或门

代码

module assign1(
	input[1:0] a1,
	input[3:0] a2,
	input[4:0] a3,
	output  y1,
	output  y2,
	output  y3
    );

assign y1 = ^a1;
assign y2 = ^a2;
assign y3 = ^a3;

endmodule

RTL结构图,看上去很很陌生,其实就是对各个位进行异或操作。

技术原理图,总而言之就是对各个位进行异或操作,使用Lut查找表来实现。具体功能可以进行测试。总线异或操作实际上就是数1个的奇偶位,如果为奇数输出1,否则为0。

6.总线同或门

module assign1(
	input[1:0] a1,
	input[3:0] a2,
	input[4:0] a3,
	output  y1,
	output  y2,
	output  y3
    );

assign y1 = ~^a1;
assign y2 = ~^a2;
assign y3 = ~^a3;

endmodule

RTL结构图,在总线异或门之后增加一个反相器实现

技术原理图

总结

1. 总线逻辑运算是单值运算,他对各个位进行同一操作。

2.总线操作用法单一,但是简洁,在特定场合可以降低代码冗余量。

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