实验四 数据选择器
一、实验设计目标
(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 4选1数据选择器真值表
地址 | 使能 | 输入 | 输出1 | ||||
---|---|---|---|---|---|---|---|
X | X | 1 | 0 | ||||
0 | 0 | 0 | |||||
0 | 1 | 0 | |||||
1 | 0 | 0 | |||||
1 | 1 | 0 |
三、功能模块图与输入输出引脚说明
数据选择器工程包含顶层模块mux41与底层模块mux41_module,图4.1是整个工程的模块功能图。下面介绍一下各主要引脚的功能:
图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的部分代码:
图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来定义一个标识符代表一个常量,称为符号常量,即标识符形式的常量,采用符号常量可提高程序的可读性和可维护性。