基本组合逻辑电路

实验目的

  1. 熟悉虚拟实验软件及其基本操作;熟悉FPGA设计软件的使用方法;

  2. 理解总线的三态传输特性。

实验原理

本项目包含3个基本的组合逻辑实验。

三态门

实验原理图如图 1,3个三态缓冲器实现DATA0、DATA1、DATA2对BUS总线的分时共享,OE0、OE1、OE2分别是3个三态缓冲器的输出使能,OUT是三态门的输出,即总线的状态。

image
图 1. 三态门实验原理图

Verilog HDL源代码见清单 1。输入端口PB[19:0]对应20个按键,输入端口S[35:0]对应36个拨动开关,输出端口L[35:0]对应36个指示灯,输出端口SD7[7:0]~SD0[7:0]对应8个七段数码管。输入端口和输出端口使用和图 1符号一致的变量名替换为内部变量后使用,虽然这不是必须的,但能够使得代码具有更好的可读性。三态门用持续赋值语句和条件表达式描述。

清单 1. 虚拟实验板模块
`default_nettype none 
module VirtualBoard (
    input  wire   CLOCK,      // 10 MHz Input Clock 
    input  wire  [19:0] PB,   // 20 Push Buttons, logical 1 when pressed
    input  wire  [35:0] S,    // 36 Switches
    output logic [35:0] L,    // 36 LEDs, drive logical 1 to light up
    output logic  [7:0] SD7,  // 8 common anode Seven-segment Display
    output logic  [7:0] SD6,
    output logic  [7:0] SD5,
    output logic  [7:0] SD4,
    output logic  [7:0] SD3,
    output logic  [7:0] SD2,
    output logic  [7:0] SD1,
    output logic  [7:0] SD0
); 

/** The input port is replaced with an internal signal **/
wire [2:0]data0  = S[2:0];
wire [2:0]data1  = S[5:3];
wire [2:0]data2  = S[8:6];
wire oe0    = S[9];
wire oe1    = S[10];
wire oe2    = S[11];

/************* The logic of this experiment *************/
wire [2:0]out;
// Logic description of three-state buffer
assign out = oe0 ? data0 : 3'bzzz;
assign out = oe1 ? data1 : 3'bzzz;
assign out = oe2 ? data2 : 3'bzzz;

/****** Internal signal assignment to output port *******/
assign L[2:0]   = out;

endmodule

多路选择器

实验原理图如图 2

image
图 2. 四选一多路选择器实验原理图

省略了模块端口声明的主体代码见清单 2

清单 2. 四选一多路选择器模块
/** The input port is replaced with an internal signal **/
wire [2:0]data0  = S[2:0];
wire [2:0]data1  = S[5:3];
wire [2:0]data2  = S[8:6];
wire [1:0]sel    = S[10:9];

/************* The logic of this experiment *************/
logic [2:0]out;
always_comb 
begin
   case (sel)
      2'b00: out = data0;        
      2'b01: out = data1;
      2'b10: out = data2;
      default: out = {3{1'bx}};
   endcase
end

/****** Internal signal assignment to output port *******/
assign L[2:0]   = out;

七段译码器

虚拟面板如图 3

image
图 3. 七段译码器实验原理图

实验任务

  1. 理解三态门的特性和正确用法。

    特别地,考虑以下问题。

    (1)如果有2个或2个以上的三态门同时打开,会有什么问题?

    (2)三态门全都关闭时,输出LED显示是什么?和你的设想是否一样?

  2. 理解多路选择器的用法

    (1)分析与三态门的实验结果有什么不同。

    (2)在实际应用中哪些情况可以用多路器的方案代替三态门?

  3. 设计七段译码器

    (1)用HDL设计七段译码器模块,按照清单 3端口声明编写。

    清单 3. 七段译码器模块端口声明
    module SevenSegDecode(
        input logic [3:0] iData,
        output logic [7:0] oSeg
    );

    输入是4位二进制数,输出是与输入数值相对应的数码管段码,要求包含小数点但小数点不亮,0~F共16个数据的显示效果如图。

    img 七段数码管字形

    (2)实例化七段译码器模块。
    VirtualBoard.sv模块中,将实例化七段译码器的代码添加到该模块内,见[lst-4]

    清单 4. 实例化七段译码器
    //七段译码器模块实例化 
    SevenSegDecode ssdecode_inst(.iData(S[11:8]), .oSeg(SD1));
    
    //用LED显示7段电平值
    assign L[7:0]   = SD1;

    可以看到,这条语句实例化七段译码器模块,也就是将SevenSegDecode模块的端口与VirtualBoard模块中的信号连接起来;具体说来就是将4个拨动开关S11~S8连接到七段译码器模块的输入端口iData;译码输出oSeg连接到七段数码管SD1。同时用LED指示灯显示每个段的电平值。

    (3)编译成功后在实验平台验证。

    (4)【选做】修改七段译码器模块,使其能显示“P”、“L”等尽可能多的字符。提示:输入改为5位二进制,虚拟面板增加一个开关。所扩充字符的5位编码自己规定,但0~F十六个编码要与基本任务要求一致。