实验3.1 实现3-8译码器
实验设计目标
在FPGA中使用行为描述语句实现3-8译码器。
实验设计思路
译码器电路有n个输入和2n个输出,每个输出都对应着一个可能的二进制输入。本实验设计实现一个3-8译码器,表3.1给出了该译码器的真值表。从真值表可以写出
(3.1)
表3.1 3-8译码器真值表
功能模块图与输入输出引脚说明
译码器工程包含顶层模块decode38与底层模块decode_module,图3.1是整个工程的模块功能图。下面介绍一下顶层模块各引脚的功能:
图3.1 译码器模块功能图
SW_In:拨动开关输入,共有三位。SW_In[2:0]分别连接“3-8译码器”的输入“a2、a1、a0”。
LED_Out:输出到LED灯,共有八位。LED_Out[7:0]分别连接“3-8译码器”的输出“y7~y0”,通过8个LED灯的亮灭情况来判断二进制输入。
程序设计
图3.2是截取自底层模块decode_module的部分代码:
5-6:输入输出信号声明。
8-15:使用连续赋值语句assign实现y7~y0的逻辑表达式,见公式(3.1)。
图3.2 逻辑门实验核心代码
FPGA管脚配置
以下是Anlogic FPGA的IO Constraint,SW_In[2:0]输入信号分别与开发板上的SW2~SW0相连;LED_Out[7:0]输出信号分别与开发板上的LED7~LED0相连。
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; }
set_pin_assignment { Sw_In[2] } { LOCATION = B10; IOSTANDARD = LVCMOS33; }
译码器实验IO Constraint
实验结果
当输入信号“a2、a1、a0”分别为“1、0、0”时,根据表3.1,输出信号中y4为“1”,其余全为“0”。即LED4亮,其余全灭。因篇幅有限,其他情况请自行验证。
思考与拓展
自行建立工程,使用case语句实现3—8译码器。
实验3.2 实现8-3优先编码器
实验设计目标
使用for循环语句设计实现8-3优先编码器。
通过此实验初步掌握for语句的使用方法。
实验设计思路
编码器就是译码器的反向器件,有2n个输入和n个输出。编码器常用来告知计算机当前请求中断的外部设备是哪个,当有多个外部中断请求时,计算机将响应优先级高的那个中断。本实验设计实现一个8-3优先编码器,假定输入信号中不会出现高阻态或不定值,如果编码器的多个输入同时为高电平,它将选择优先级高的那个输入。表3.2给出了对应的真值表。
表3.2 8-3 优先编码器真值表
功能模块图与输入输出引脚说明
编码器工程包含顶层模块pencode83和底层模块pencode_module,图3.4是整个工程的模块功能图。下面介绍一下顶层模块各引脚的功能:
图3.4 编码器模块功能图
CLK:50MHz的系统基准时钟输入。用CLK的上升沿作为always模块的触发信号。
SW_In:拨动开关输入,共有八位。SW_In[7:0]分别连接“编码器”的输入信号x7~x0,用于模拟二进制输入。
LED_Out:输出到LED灯。LED_Out[2:0]分别连接“编码器”的输出信号y2~y0,通过LED灯的点亮或熄灭来表示编码器的二进制输出。LED_Out3连接Valid,输出有效标志位,用于表明编码器的输出是否有效。只要输入的8个元素中有一个为1,输出Valid的值就为1,否则为0。LED_Out[7:4]一直输出低电平,熄灭LED7-LED4。
程序设计
图3.5是截取自底层模块pencode_module的部分代码:
5-8:输入输出信号声明,always块的输出信号均必须定义为reg型。
14-15:在always块中,将y和Valid的值初始化为“0”,这样它们就总是被赋予一定值的,否则,可能会生成一个锁存器。
16-21:使用for循环实现优先编码器功能。因为for循环是从0到7的,判断x[i]是否等于1,这将把最终i的值赋给y,因此,x[7]具有最高优先级。
图3.5 编码器实验核心代码
20:当x[7:0]!=8’b0,Valid=1’b1,此时的编码输出才是在有输入时的有效输出。如果输出y[2:0]为“000”且Valid的值为1,那么就意味着x[7:0]的输入为“0000_0001”;如果输出y[2:0]为“000”且Valid的值为0,那么就意味着x[7:0]的输入为“0000_0000”,即没有有效输入。
FPGA管脚配置
以下是Anlogic FPGA的IO Constraint,CLK时钟输入信号与Anlogic_FPGA开发板上的50MHz的晶振时钟相连;SW_In[7:0]输入信号分别与开发板上的SW7~SW0相连;LED_Out[2:0]输出信号分别与LED2~LED0相连;Valid输出信号与LED3相连。
set_pin_assignment { CLK } { LOCATION = R7; 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; }
set_pin_assignment { Sw_In[2] } { LOCATION = B10; IOSTANDARD = LVCMOS33; }
set_pin_assignment { Sw_In[3] } { LOCATION = A11; IOSTANDARD = LVCMOS33; }
set_pin_assignment { Sw_In[4] } { LOCATION = A12; IOSTANDARD = LVCMOS33; }
set_pin_assignment { Sw_In[5] } { LOCATION = B12; IOSTANDARD = LVCMOS33; }
set_pin_assignment { Sw_In[6] } { LOCATION = A13; IOSTANDARD = LVCMOS33; }
set_pin_assignment { Sw_In[7] } { LOCATION = A14; IOSTANDARD = LVCMOS33; }
实验结果
当SW7~SW0均拨至DOWN时,LED2~LED0全灭,且此时LED3灯灭,表明无有效输入;当SW7~SW1均拨至DOWN,SW0拨至UP时,LED2~LED0全灭,且此时LED3灯亮,表明存在有效输入SW_In[7:0]=8’b00000001。
当SW6,SW2,SW0均拨至UP时,因为SW6具有最高优先级,编码器输出LED_Out[2:0]=3’b110,即LED2、LED1亮,LED0灭,且此时LED3亮。
思考与拓展
使用逻辑方程能更简单的实现不带优先编码功能的8-3编码器,请自行建立工程,实现其功能。
请解释图3.9中第十行代码的含义;如果将i定义为reg型,预编译能通过吗?程序功能能实现吗?
实验小结
在定义信号类型时,一般有reg型与wire型。reg型即寄存器型信号,always模块的输出信号均必须定义为reg型;wire可以想象为电路内部连线,若不说明信号类型,则默认为wire型。
END
文章来源:https://www.yuque.com/yingmuketang/01/ifm1b6
推荐内容
- 【安路 EG4S20 版本】基础板卡信息及使用教程:芯片和板卡简介
- 【安路 EG4S20 版本】基础板卡信息及使用教程:第一工程
- 【安路 EG4S20 版本】基础板卡信息及使用教程:使用ChipWatcher
- 【安路 EG4S20 版本】基础板卡信息及使用教程:使用Modelsim
- 【安路 EG4S20 版本】基础实验设计与实现:实验1 流水灯
- 【安路 EG4S20 版本】基础实验设计与实现:实验2 集成逻辑门及其基本应用
更多内容请关注走进FPGA专栏