译码器实验

实验目的

(1) 掌握七段译码器的HDL描述;

(2) 掌握HDL模块层次化设计方法。

参考设计:2-4译码器

例 1给出了一个2-4译码器的设计。虚拟面板如图 1所示。

image
图 1. 2-4译码器的虚拟面板
例 1. 2-4译码器的设计代码
module Decode2_4 (
   input  wire  iEn,
   input  wire  [1:0] iA,
   output logic [3:0] oY
);

always_comb
begin
   if (iEn)
      case (iA)
         2'b00 : oY=4'h1;
         2'b01 : oY=4'h2;
         2'b10 : oY=4'h4;
         2'b11 : oY=4'h8;	
         default:oY=4'bx;	
      endcase
   else
      oY=4'b0;
end

endmodule

例 2给出了实例化2-4译码器的VirtualBoard模块的主要代码。为节省篇幅,省略了模块的端口声明以及内部信号与端口的连接。完整代码可从开源项目托管网站下载,下载方法见下载实验材料

例 2. 2-4译码器的实例化代码
wire [3:0] out;
Decode2_4 decoder1(.iEn(en), .iA(in), .oY(out));

实验任务:七段译码器

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

module SevenSegDecode(
    input  wire  [3:0] iData,
    output logic [7:0] oSeg
);

输入是4位二进制数,输出是与输入数值相对应的数码管段码,要求包含小数点但小数点不亮,0~F共16个数据的显示效果如图 2。编写完成后保存文件,文件名与模块名相同,即SevenSegDecode.sv。

七段数码管字形
图 2. 七段数码管字形
由于“9”、“1”等数字可能有多种字形表示,为便于机器考核,请按照图 2所示字形编写译码器。

(2)实例化七段译码器模块。

打开第一个实验的VirtualBoard.sv模板文件,将实例化七段译码器的代码添加到该模块内,并按照图 3所示虚拟面板连接端口。

七段译码器面板
图 3. 七段译码器面板

图中数码管等虚拟元件的序号可通过实验系统查看,为节省查对时间,例 3给出了与虚拟面板一致的端口连接代码。标记①的位置需要完成实例化七段译码器。

例 3. 七段译码器虚拟面板对应的端口连接
/****** Replace input ports with internal signals *******/
wire [3:0] hex = S[11:8];

/************* The logic of this experiment *************/
wire [7:0] sd;
//七段译码器模块实例化 (1)

/***** Internal signals assignment to output ports ******/
assign SD1      = sd;   //连接数码管1
assign L[7:0]   = sd;   //用LED显示7段电平值

例 3使用内部变量如 hexsd 替换了输入输出端口,这些变量应在实例化七段译码器时映射到七段译码器模块的端口,最终的效果是4个拨动开关S11~S8连接到七段译码器模块的输入端口iData,七段译码输出oSeg连接到数码管SD1,同时用LED指示灯显示每个段的驱动电平。 在自己的设计中,内部变量的名称不必与示例相同。

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

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