02.组合逻辑

1.组合逻辑

组合逻辑:

组合逻辑是VerilogHDL设计中一个重要的组成部分.从电路本质上讲, 组合逻辑的电路特点就是输出信号只是当时时刻输入信号的函数,与其他时刻的输入状态无关,无存储电路,也没有反馈电路.

2.简单组合逻辑

2.1 简单逻辑组合–多路选择器

多路选择器:

多路选择器是数据选择器的别称,在多路数据传送过程中,能够根据需要将其中任意一路选出来的电路,叫做数据选择器,也称多路选择器或多路开关.

设计并实现一个"二选一"多路选择器,使用按键1,2,表示key_in,按键3表示slec选择信号,信号灯表示输出信号:

module mux2_1
(
    input wire [0:0] in_1, //输入信号 类型 位宽(位不用书写) 输入信号名,
    input wire [0:0] in_2,
    input wire [0:0] sel,

    output reg [0:0] out

);


//方法一:使用组合逻辑对输出信号进行赋值
always@(*) //*,通配符,表示任何一种敏感信号发生变化都要执行该语句
    /*if ()
        begin
        
        end
    else if()
        begin
        
        end
    else
        begin
        
        end
    */
    if (sel == 1'b1)
        out = in_1;
    else
        out = in_2;
// 方法二:使用case语句
/*always@(*)

    case(sle)
        1'b1 :out = in_1;
        1'b0 :out = in_2;
        
        default: out = in_1; //注意:如果不能列举出所有情况一定要加上default.因为此处sel的情况已经列举完了,所以default可以省略
    endcase


//方法三:使用assign语句

assign out = (sel == 1'b1) ?in_1:in_2;

*/
endmodule
2.2 简单逻辑组合–译码器

译码是编码的逆过程,在编码时,每一种二进制代码,都赋予了特定的含义,即都表示了一个确定的信号或者对象。把代码状态特定含义翻译出来的过程叫做译码,实现译码操作的电路称为译码器。或者说,译码器是可以将输入二进制代码的状态翻译成输出信号,以表示其原来含义的电路。

译码器(decoder)是一类多输入多输出组合逻辑电路器件,其可以分为:变量译码和显示译码两类。常见的有: n − 2 n n-2^n n2n译码器

使用always,initial语句赋值就是reg型,使用assign赋值就是wire型

经典3-8译码器:

//输入输出列表
module decoder
(
    input wire [0:0] in_1,
    input wire [0:0] in_2,
    input wire [0:0] in_3,
     
    output reg [7:0] out

);


//赋值

//方法一:使用条件分支语句
/* always@(*)
    if({in_1,in_2,in_3} == 3'b000)
        out = 8'b0000_0001;
    else if ({in_1,in_2,in_3} == 3'b001)
        out = 8'b0000_0010;
    else if ({in_1,in_2,in_3} == 3'b010)
        out = 8'b0000_0100;
    else if ({in_1,in_2,in_3} == 3'b011)
        out = 8'b0000_1000;
    else if ({in_1,in_2,in_3} == 3'b100)
        out = 8'b0001_0000;
    else if ({in_1,in_2,in_3} == 3'b101)
        out = 8'b0010_0000;
    else if ({in_1,in_2,in_3} == 3'b110)
        out = 8'b0100_0000;
    else if ({in_1,in_2,in_3} == 3'b111)
        out = 8'b1000_0000;
    else
        out = 8'b0000_0001;//避免lantch */


//方法二:使用case编写
always@(*)
    case({in_1,in_2,in_3})
       3'b000: 
        out = 8'b0000_0001;
       3'b001: 
        out = 8'b0000_0010;
       3'b010: 
        out = 8'b0000_0100;
       3'b011: 
        out = 8'b0000_1000;
       3'b100: 
        out = 8'b0001_0000;
       3'b101: 
        out = 8'b0010_0000;
       3'b110: 
        out = 8'b0100_0000;
       3'b111: 
        out = 8'b1000_0000;
       default:
        out = 8'b0000_0001;
    endcase
endmodule
2.3简单逻辑组合–半加器

加法器是数字电路中经常用到的一种基本器件, 主要用于两个数或者多个数的加和,加法器又分为半加器(half adder)和全加器(full adder).

半加器电路是指对两个输入数据位相加, 输出一个结果位和进位,没有进位输入的加法器电路.是实现两个一位二进制数的加法运算电路.

全加器是在半加器的基础上的升级版, 除了加数和被加数加和外,还要加上上一级传进来的进位信号.

module half_add(
//端口列表
    input wire [0:0] in_1,
    input wire [0:0] in_2,
    
    output wire [0:0] sum,
    output wire [0:0] count
);

//赋值

assign {count,sum} = in_1 + in_2;


endmodule

3.层次化设计思想

​ 数字电路中根据模块层次不同有两种基本的结构设计方法:

​ 自底向上(Bottom-Up)和自顶向下(Top-Down)的设计方法.

3.1自底向上(Bottom-Up)

自底向上的设计是一种传统的设计方法,对设计进行逐次划分的过程是从存在的基本单元出发的,由基本单元构建高层单元,依次向上,直至构建系统.

3.2 自上而下(Top-Down)

从系统级开始,把系统分为基本单元,然后再把每个单元划分为下一层次的基本单元,一直这样细分做下去,直至直接可以使用EDA元件库中的元件来实现为止.

3.3 混合使用
3.4避免Latch的产生

Latch就是锁存器,是一种在异步电路中,对输入信号 电平敏感的单元,用来存储信息.

锁存器在 数据未锁存时,输出端的信号随输入信号变化,就像信号通过一个缓冲器,一旦锁存信号有效,则数据被锁存,输入信号就不起作用.因此,锁存器也被称为透明锁存器,指的是不锁存时输入对于输入时透明的.

异步电路与同步电路:

异步电路:异步电路主要是组合逻辑电路,用于产生FIFO或RAM的读写控制信号脉冲,但它同时也用在时序电路中,此时它没有统一的时钟,状态变化的时刻是不稳定的, 通常输入信号只有在电路处于稳定状态时才发生变化.

同步电路:同步电路是有时序电路(寄存器和各种触发器)和组合逻辑电路构成的电路, 其所有操作都是在严格的时钟控制下完成的. 这些时序电路共享同一个时钟 CLK,而所有的状态变化都是在时钟的上升沿(或下降沿)完成的.

Latch的缺陷:

  • 对毛刺敏感
  • 占用更多的逻辑资源
  • 不能异步复位
  • 额外的延时
  • 复杂的静态时序分析

几种产生Latch的情况:

  • 组合逻辑中if-else条件分支语句缺少else语句
  • 组合逻辑case条件分支语句条件未列举完,同时缺失了default语句
  • 组合逻辑中输出变量赋值给自己
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值