FPGA学习02—实现简单的组合逻辑电路

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

  

2.2.1 多路选择器

① 多路选择器的设计思路是两个按键输入(这里命名为in_1和in_2),再设一个按键为选择选择按键(sel),输出设为led灯(out)。绘制的波形图如下2-2-1所示:

FPGA学习02—实现简单的组合逻辑电路

图2-2-1

 

    ② 代码编写

module      mux2_1

    input  wire   [0:0]   in_1,

    input  wire          in_2,

    input  wire          sel,

 

    output     reg    out

);

 

[email protected](*)

    if(sel == 1’b1)

       out = in_1;

    else

       out = in_2;

endmodule

 

//这里使用了always语句,以及选择条件语句(if…else…),always语句中的*号表示检测该模块中的信号变化情况,当出现了信号跳变时,满足条件,执行该条件语句。

 

附:三种常用的组合逻辑的赋值方式如下图2-2-2:

FPGA学习02—实现简单的组合逻辑电路

图2-2-2

 

    ③ 仿真文件编写以及文件仿真,仿真结果如图2-2-3所示

`timescale 1ns/1ns

module tb_mux2_1();

 

reg  in_1;

reg  in_2;

reg  sel ;

 

wire       out ;

 

initial

    begini

        in_1       <=  1’b0;

       in_2       <=  1’b0;

       sel    <=  1’b0;

    end

 

always #10 in_1 <= {$random} %2;

always #10 in_2 <= {$random} %2;

always #sel <= {$random} %2;

 

initial

    begin

       $timeformat(-9,0,”ns”,6);

       $monitor(“@time %t:in_1=%b in_2=%b out=%b”,$time,in_1,in_2,sel,out;)

    end

 

mux2_1      mux2_1_inst

    .in_1(in_1),

    in_2(in_2),

    .sel(sel),

 

.out(out)

);

endmodule

   FPGA学习02—实现简单的组合逻辑电路

图2-2-3

 

    ④ 仿真结束后进行管脚绑定、综合和上板验证,如图2-2-4和图2-2-5所示,上板验证通过。

FPGA学习02—实现简单的组合逻辑电路

图2-2-4

 

FPGA学习02—实现简单的组合逻辑电路

图2-2-5

 

2.2.2 3-8译码器

    译码器是一类多输入多输出组合逻辑电路器件,其可以分为:变量和显示译码两类。设计思路为使用三个按键为输入,8个led灯为输出。(该开发板中没有8个led灯,因此不做上板验证)

    ① 真值表、波形图以及代码编写(如图2-2-6),代码如下:

module  decoder3_8

(

    input   wire            in1 ,   //输入信号in1

    input   wire            in2 ,   //输入信号in2

    input   wire            in3 ,   //输入信号in2

 

    output  reg     [7:0]   out     //输出信号out

);

 

[email protected](*)

    case({in1, in2, in3})

        3'b000 : out = 8'b0000_0001;        //输入与输出的8种译码对应关系

        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

//这里使用了case选择语句

 

FPGA学习02—实现简单的组合逻辑电路

图2-2-6

 

    ② 仿真结果

FPGA学习02—实现简单的组合逻辑电路

图2-2-7 查看rtl视图

 

FPGA学习02—实现简单的组合逻辑电路

图2-2-8 Modelsim仿真

 

2.2.3 半加器

    半加器电路是指对两个输入数据位相加,输出一个结果位和进位,没有进位输入的加法器电路。是实现两个一位二进制数的加法运算电路。设计思路是使用两个按键作为输入的二进制数据,相加的和分别表示为sum和高位的count(使用key按键和led灯实现。)

 

    ① 波形图和真值表

FPGA学习02—实现简单的组合逻辑电路

图2-2-9 真值表、波形图绘制

 

    ② 代码编写

module     half_adder

(

    input      wire          int_1,

    input      wire          int_2,

 

    outout     wire           sum,

    output     wire          count

);

 

assign     {count,sum} = in_1 + im_2;

endmodule

//使用了assign语句做并位的加法,高位为count,低位为sum

 

    ③ 仿真结果

FPGA学习02—实现简单的组合逻辑电路

图2-2-10

 

2.2.4 全加器

全加器是在半加器的基础上的升级版,除了加数和被加数加的和外还要加上上一级传进来的进位信号。设计思路是使用两个半加器,再加上一个逻辑器件,如图2-2-11所示。

因为在全加器中要调用半加器的模块,使用半加器的模块实例化,因此要在工程中添加半加器的模块文件。(学习层次化的设计)

FPGA学习02—实现简单的组合逻辑电路

图2-2-11

 

代码编写

module  full_adder

(

    input   wire    in1 ,   //加数1

    input   wire    in2 ,   //加数2

    input   wire    cin ,   //上一级的进位

 

    output  wire    sum ,   //两个数的加和

    output  wire    cout    //加和后的进位

);

 

wire    h0_sum;     

wire    h0_cout;   

wire    h1_cout;    /

 

half_adder  half_adder_inst0

(                    

    .in1    (in1    ), 

    .in2    (in2    ), 

 

    .sum    (h0_sum ),

    .cout   (h0_cout) 

);

 

half_adder  half_adder_inst1

(                   

    .in1    (h0_sum ),

    .in2    (cin    ),

 

    .sum    (sum    ), 

    .cout   (h1_cout) ut

);

 

//cout:总的进位信号

assign  cout = h0_cout | h1_cout;

 

endmodule

//因为实例化后需要说明线路的信号,这里在第一个半加器的cout输出中使用了h0_cout表示,sum使用了h0_sum表示;第二个半加器中的cout使用了h1_cout表示,sum不变。h0_cout 和h1_cout使用assign语句表示。

 

综合后的结果如图2-2-12

FPGA学习02—实现简单的组合逻辑电路

图2-2-12