实验四 数据选择器

一、实验设计目标

(1)使用case语句设计实现自定义数据位宽的4选1数据选择器。

(2)通过此实验初步掌握case语句的使用方法。

(3)通过此实验初步掌握参数(parameter)型常数的定义方法和使用方法。

二、实验设计思路

数据选择器又称多路转换器或称多路开关,其功能是根据地址码的不同,从多个输入数据流中选择一个送往公共的输出端。根据数据输入端的个数的不同,可分为16选1、8选1、4选1等数据选择器。

本实验设计使用case语句实现4选1数据选择器功能,包含4个数据输入端D3D0,2个地址输入端A1A0,一个输入使能控制端CSn和一个数据输出端Y。当CSn为低电平时允许数据选择器工作;每组输入信号(D3~D0)的数据位宽是可自定义的,因按键开关个数限制,在验证实验时将其位宽定为1位。表4.1给出了对应的真值表。

4.1 41数据选择器真值表

地址 使能 输入 输出1
img img img img img img img img
X X 1 0
0 0 0 img
0 1 0 img
1 0 0 img
1 1 0 img

三、功能模块图与输入输出引脚说明

数据选择器工程包含顶层模块mux41与底层模块mux41_module,图4.1是整个工程的模块功能图。下面介绍一下各主要引脚的功能:

img

4.1 数据选择器模块功能图

​ (1)Width:数据位宽,在程序中定义,不属于输入输出信号。实验时,将width定为1,即每组输入信号和输出端信号的位宽都为1位。

(2)CSn:输入使能控制信号,低电平有效,连接在SW_In[2]。当CSn=0时,允许数据选择器工作;当CSn=1时,禁止数据选择器工作。

(3)SW_In[1:0]:拨动开关输入,共有两位。SW_In[1:0]分别连接“数据选择器”的地址输入信号A1~A0,用于地址选择。

(4)Data_In[3:0]:“数据选择器”的数据输入信号D[3:0],连接到拨动开关SW_In[7:4]。

(5)LED_Out:输出到LED灯,共有八位。LED_Out0连接“数据选择器”的数据输出端Y,通过LED灯的亮灭情况来显示结果。LED_Out[7:1]输出恒定低电平。

四、程序设计

​ 图4.2是截取自底层模块mux41_module的部分代码:

img

4.2 数据选择器实验核心代码

5-8:输入输出信号声明。

​ 12:敏感事件程序清单中的*号将自动包含always块中的语句或条件表达式中的所有信号,也可直接写always @ ( A or CSn )。

​ 15-20:使用case语句实现数据选择,选择方式请参考真值表4.4。

​ 21:当使能控制信号CSn=1时,数据选择器不工作,输出恒为0。

五、FPGA管脚配置

​ 以下是Anlogic FPGA的IO Constraint,输入控制使能信号CSn与Anlogic_FPGA开发板上SW2相连;SW_In[1:0] 分别与开发板上的SW1SW0相连;Data_In0 Data_In3分别与开发板上的SW4~SW7相连;LED_Out[0]与开发板上的LED0相连。

set_pin_assignment { CSn } { LOCATION = B10; IOSTANDARD = LVCMOS33; }

set_pin_assignment { Data_In0 } { LOCATION = A12; IOSTANDARD = LVCMOS33; }

set_pin_assignment { Data_In1 } { LOCATION = B12; IOSTANDARD = LVCMOS33; }

set_pin_assignment { Data_In2 } { LOCATION = A13; IOSTANDARD = LVCMOS33; }

set_pin_assignment { Data_In3 } { LOCATION = A14; IOSTANDARD = LVCMOS33; }

set_pin_assignment { LED_Out[0] } { LOCATION = B14; IOSTANDARD = LVCMOS33; }

set_pin_assignment { LED_Out[1] } { LOCATION = B15; IOSTANDARD = LVCMOS33; }

set_pin_assignment { LED_Out[2] } { LOCATION = B16; IOSTANDARD = LVCMOS33; }

set_pin_assignment { LED_Out[3] } { LOCATION = C15; IOSTANDARD = LVCMOS33; }

set_pin_assignment { LED_Out[4] } { LOCATION = C16; IOSTANDARD = LVCMOS33; }

set_pin_assignment { LED_Out[5] } { LOCATION = E13; IOSTANDARD = LVCMOS33; }

set_pin_assignment { LED_Out[6] } { LOCATION = E16; IOSTANDARD = LVCMOS33; }

set_pin_assignment { LED_Out[7] } { LOCATION = F16; IOSTANDARD = LVCMOS33; }

set_pin_assignment { Sw_In[0] } { LOCATION = A9; IOSTANDARD = LVCMOS33; }

set_pin_assignment { Sw_In[1] } { LOCATION = A10; IOSTANDARD = LVCMOS33; }

4.3 数据选择器IO Constraint

六、实验结果

当拨动开关SW2拨至“DOWN”,且SW1~SW0均拨至“UP”,选中输入SW7,此时LED0输出SW7的状态,当拨下SW7时,LED0灭,反之则亮。具体实验现象请参照真值表4.1自行验证。

七、实验小结

(1)if语句必须包含在一个always块中,always块中的语句按它们出现的顺序执行。

(2)用parameter来定义一个标识符代表一个常量,称为符号常量,即标识符形式的常量,采用符号常量可提高程序的可读性和可维护性。