实验三 译码器 编码器 3.2 实现8-3优先编码器

一、实验设计目标

(1)使用for循环语句设计实现8-3优先编码器。

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

二、实验设计思路

编码器就是译码器的反向器件,有2n个输入和n个输出。编码器常用来告知计算机当前请求中断的外部设备是哪个,当有多个外部中断请求时,计算机将响应优先级高的那个中断。本实验设计实现一个8-3优先编码器,假定输入信号中不会出现高阻态或不定值,如果编码器的多个输入同时为高电平,它将选择优先级高的那个输入。表3.2给出了对应的真值表。

3.2 8-3 优先编码器真值表

img img img img img img img img img img img
0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 X 0 0 1
0 0 0 0 0 1 X X 0 1 0
0 0 0 0 1 X X X 0 1 1
0 0 0 1 X X X X 1 0 0
0 0 1 X X X X X 1 0 1
0 1 X X X X X X 1 1 0
1 X X X X X X X 1 1 1

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

编码器工程包含顶层模块pencode83和底层模块pencode_module,图3.4是整个工程的模块功能图。下面介绍一下顶层模块各引脚的功能:

img

3.4 编码器模块功能图

(1)CLK:50MHz的系统基准时钟输入。用CLK的上升沿作为always模块的触发信号。

(2)SW_In:拨动开关输入,共有八位。SW_In[7:0]分别连接“编码器”的输入信号x7~x0,用于模拟二进制输入。

(3)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]具有最高优先级。

img

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]输入信号分别与开发板上的SW7SW0相连;LED_Out[2:0]输出信号分别与LED2LED0相连;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; }

六、实验结果

当SW7SW0均拨至DOWN时,LED2LED0全灭,且此时LED3灯灭,表明无有效输入;当SW7SW1均拨至DOWN,SW0拨至UP时,LED2LED0全灭,且此时LED3灯亮,表明存在有效输入SW_In[7:0]=8’b00000001。

当SW6,SW2,SW0均拨至UP时,因为SW6具有最高优先级,编码器输出LED_Out[2:0]=3’b110,即LED2、LED1亮,LED0灭,且此时LED3亮。

七、思考与拓展

(1)使用逻辑方程能更简单的实现不带优先编码功能的8-3编码器,请自行建立工程,实现其功能。

(2)请解释图3.9中第十行代码的含义;如果将i定义为reg型,预编译能通过吗?程序功能能实现吗?

八、实验小结

在定义信号类型时,一般有reg型与wire型。reg型即寄存器型信号,always模块的输出信号均必须定义为reg型;wire可以想象为电路内部连线,若不说明信号类型,则默认为wire型。