基本组合逻辑电路
实验原理
本项目包含3个基本的组合逻辑实验。
三态门
实验原理图如图 1,3个三态缓冲器实现DATA0、DATA1、DATA2对BUS总线的分时共享,OE0、OE1、OE2分别是3个三态缓冲器的输出使能,OUT是三态门的输出,即总线的状态。
Verilog HDL源代码见清单 1。输入端口PB[19:0]对应20个按键,输入端口S[35:0]对应36个拨动开关,输出端口L[35:0]对应36个指示灯,输出端口SD7[7:0]~SD0[7:0]对应8个七段数码管。输入端口和输出端口使用和图 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。
省略了模块端口声明的主体代码见清单 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;
实验任务
-
理解三态门的特性和正确用法。
特别地,考虑以下问题。
(1)如果有2个或2个以上的三态门同时打开,会有什么问题?
(2)三态门全都关闭时,输出LED显示是什么?和你的设想是否一样?
-
理解多路选择器的用法
(1)分析与三态门的实验结果有什么不同。
(2)在实际应用中哪些情况可以用多路器的方案代替三态门?
-
设计七段译码器
(1)用HDL设计七段译码器模块,按照清单 3端口声明编写。
清单 3. 七段译码器模块端口声明module SevenSegDecode( input logic [3:0] iData, output logic [7:0] oSeg );输入是4位二进制数,输出是与输入数值相对应的数码管段码,要求包含小数点但小数点不亮,0~F共16个数据的显示效果如图。
(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十六个编码要与基本任务要求一致。