《计算机组成与CPU设计实验》1 组合逻辑(一)

本文介绍了计算机组成原理中逻辑电路的基础知识,包括组合逻辑与时序逻辑的区别。重点讲解了Verilog语言如何描述三态门和多路选择器,如2选1多路器和4选1多路器,并展示了对应的逻辑符号、真值表及Verilog代码实现。此外,还提到了位运算符、逻辑运算符的使用以及always语句在描述逻辑电路中的应用,强调了敏感列表完整性和使用logic类型的优势。
摘要由CSDN通过智能技术生成

本篇内容来源于中国大学mooc《计算机组成与CPU设计实验》 (江苏大学)中的课程视频、PPT等相关资料。

本篇内容为《计算机组成与CPU设计实验》——三态门和多路器

参考视频:

计算机组成与CPU设计实验_江苏大学_中国大学MOOC(慕课) (icourse163.org)

逻辑电路的类型

组合逻辑Combinational Logic

  • 没有记忆
  • 输出由当前输入值决定时序逻辑

Sequential Logic

  • 有记忆
  • 输出不仅由当前输入值决定,还和以前的状态有关。

持续赋值语句 Continuous Assignment

assign 语句

assign  A = B;

//等号左边的值始终跟随右边改变

例子:使用Verilog描述与非门

78cc05ca51964b5a97e92ab6b381224d.png

module nand(
	input  wire a,	//	wire可以省略
	input  wire b,
	output wire c
);
assign c = ~(a&b); //等号左边的值始终跟随右边改变
endmodule

 多个assign语句并行执行

 例子:使用Verilog描述下面电路

b95c3748c2f64d2494789116ae9bb1aa.png

module circuit(
	input   a,	
	input   b,
	output  c,
	output  c
	);
	assign c = ~(a&b);
	assign d = a^b ;
endmodule

 位运算符 Bitwise Operators

  • ~   按位取反
  • &  按位与
  • |   按位或
  •  ^ 按位异或

 举例:按位与

d65513a5957b4f59a955da31b018b2a2.png

 注意:逻辑运算符与位运算符的区别

逻辑运算符:

  • && 逻辑与
  • ||    逻辑或
  • !   逻辑非

 举例:逻辑与

a032db23ccac4cb7b4c8e93a0708546e.png

持续赋值语句(assign)例子 

三态门 Tri-state buffer

三态门是什么

        三态门的输出端除了0和1两种状态外,还有第三种状态,称为高阻态(z)。在这种状态下,输出端相当于断开。也称三态缓冲器。

三态门电路的逻辑符号

2145dfef65ab4c91804e690ece05d902.png

 三态门真值表

06838522560146419e8f52f60130b816.png

 三态门使能端EN=1时,才有有效输出

使用Verilog描述三态门

433ef4b02c524a52beb7fbba9a24d3df.png

module tribuffer(
	input   Din,	
	input   En,
	output  Dout,
	);
	assign Dout = En ? Din:1'bz;//z(或者Z)为高阻态
endmodule

//? :为条件运算符

三态门应用

         三态门的用途:输出到总线

        普通逻辑门的输出不能连到一起,三态门通过使能端控制同一时刻只有一个输出

cb51588cbfc2429ca8e6782e3a6f574b.png

 多路选择器 Multiplexer (Mux)

二选一多路选择器

2 选 1多路器的逻辑电路 

4e0d5375355248d6b97c3fd7d7c7929b.png

2 选 1多路器的逻辑符号

55db0dfd869b4d78b315de85c627a34c.png

2 选 1多路器真值表

49a051ef838648d0ba351d929adfd0cf.png

 使用Verilog描述2 选 1多路器

module mux2(
	input   A,
	input   B,
	input   S,
	output  Y
	);
	assign Y = S? B:A;
endmodule

四位加法器

df849a37dccf4a75b4b816a3655de921.png

module ADDER(
	input   [3:0] a,	
	input   [3:0] b,
	input   CI,
	output  [3:0] S ,
	output  CO
	);
//方法1:
  wire[4:0] ADD;
  assign  ADD = a+b+CI;
  assign  S = ADD[3:0];
  assign  CO = ADD[4];

//方法2:直接使用拼接运算符
assign {CO,S[3:0]} = a+b+CI;

endmodule

 拼接运算符

将若干个信号的某些位拼接起来,如:

{CO, S[3:0]}

拼接的每个部分必须有确定的位宽完整域选择可以省略,如:

{CO,S} //{CO, S[3:0]},省略S的位宽

常数必须显式指定位宽,例:

{1'b0,S}

复制拼接

{3{a}}//等价于{a, a, a}
{2{a,b}}//等价于 {{a,b}, {a,b}}//等价于 {a,b,a,b}

always过程语句 

过程赋值 Procedural Assignment

过程块中的输出变量必须声明为reg,但并不意味着它是寄存器。

例子:使用always块描述下面电路

6860fe0cf5ca418f890e813870f51967.png

module circuit(
	input  wire  a,
	input  wire b,
	output  reg c ,
	output  reg d
	);
//always(敏感列表(Sensitivity list))
 always(a or b)//或者always(*)  如果a或者b信号发生变化,输出的值c、d就会发生改变 
    begin
       assign  c = ~(a&b);
       assign  d = a^b;
   end
 
endmodule

logic类型代替reg类型 

推荐使用SystemVerilog新的logic类型

为什么建议使用logic类型

reg容易被误解为“寄存器”,大部分场合logic类型可取代wire类型和reg类型

module circuit(
	input  wire  a,
	input  wire b,
	output  logic c ,
	output  logic d
	);
 always(a or b)
    begin
       assign  c = ~(a&b);
       assign  d = a^b;
   end
 
endmodule

敏感列表不完整 

 组合逻辑的敏感列表应包含所有输入

问题:如果敏感列表不完整,会出现什么问题?

例子:与非门

与非门的输入a或者b变化,输出c也跟着变化

496436f43b5d4c5fa55924e38d217b42.png

如果敏感列表里面没有b。

下面代码的逻辑功能是,

  • 当a发生变化的时候,输出c更新,发生变化。
  •  当b发生变化的时候,输出c保持上一次的值,不发生变化。

所以当只有 b发生变化时不会影响输出。代码的逻辑功能和与非门的逻辑功能不一致。

module circuit(
	input  wire  a,	
	input  wire b,
	output  logic c ,
	);
 always(a)//敏感列表里面没有b
    begin
       assign  c = ~(a&b);
   end
 
endmodule

避免敏感列表不完整

使用always(*)

module circuit(
	input  wire  a,
	input  wire b,
	output  logic c 
	);
 always(*)
    begin
       assign  c = ~(a&b);
   end
 
endmodule

 强烈推荐always_comb    (systemVerilog)

module circuit(
	input  wire  a,
	input  wire b,
	output  logic c 
	);
 always_comb
       assign  c = ~(a&b);
endmodule

 分支语句

  • if...else
  • case

 if...else

例子:2选1多路选择器

0e2792d06c1142c79cde711cbc82137d.png

module mux2(
	input   A,
	input   B,
	input   S,
	output  Y
	);
//	assign Y = S? B:A;
    always_comb
      if(S==1)
            Y = B;
       else
            Y = A;
endmodule

 可用于比较的运算符

b2607a04598044758e901b9f7e816c21.png

a07fac76ff33497c93379912a9c800f7.png

 case语句

例子:四选一多路选择器

67ec4674e3014d46b4f3ab4bc516181d.png

module mux4(
	input        In0,In1,In2,In3,
	input [1:0]  Sel,
	output  Out
	);
    always_comb
     case(Sel)
        2'b00:  Out = In0;
        2'b01:  Out = In1;
        2'b10:  Out = In2;
        2'b11:  Out = In3;
        default:Out = 1'bx;
     endcase
endmodule
//Verilog的逻辑值有高电平1、低电平0,高阻态z、不确定值x,四个逻辑值
//所以对于两位的Sel有2^4=16种逻辑值。
//对于其他不需要的逻辑值,需要使用default。否则会综合后的电路会出现latch,
//即,取到其他逻辑值,数据不发生变化来保存

 使用if-else语句写4-1多路选择器

module mux4(
	input        In0,In1,In2,In3,
	input [1:0]  Sel,
	output  Out
	);
    always_comb
    if(Sel==00)
         Out = In0;
      else if(Sel==01)
         Out = In1;
      else if(Sel==10)
         Out = In2;
      else if(Sel==11)
         Out = In3;
       else
          Out = 1'bx;
endmodule

 if-else和case生成的多路选择器的区别

  •  if-else语句生成的电路是串行结构,case语句生成的是并行结构
  •  if-else语句生成的电路延迟大,case语句生成电路等延时

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值