首页 理论教育 FPGA技术基础实践:多路选择器实现

FPGA技术基础实践:多路选择器实现

时间:2023-10-28 理论教育 版权反馈
【摘要】:表3.34 选1 多路选择器图3.204 选1 多路选择器2. 设计代码4 选1 多路选择器设计方法是采用if_else 语句实现的4 选1 多路选择器的Verilog 代码。图3.214 选1 多路选择器RTL 电路结构3. 阻塞和非阻塞赋值语句在的always 过程语句中,使用了两种赋值符号,分别是“=”和“<=”,它们分别对应了两种赋值方式,即阻塞式赋值和非阻塞式赋值。

FPGA技术基础实践:多路选择器实现

在数字系统设计中,经常需要把多个不同通道的信号选送到公共的信号通道上,即“多输入一输出”“千军万马过独木桥”的电路特点,此时可设置选通条件决定哪个通道信号被输出,这样的电路可以使用多路选择器实现。常使用case 语句或if_else 语句实现。本小节以4 选1 多路选择器为例,旨在介绍多路选择器的Verilog 设计实现方法。

1. 4 选1 多路选择器功能简介

4 选1 多路选择器的功能如表3.3 所示,电路设计模型或设计实体外观如图3.20 所示。图中,A、B、C、D 是4 个输入端口,S1、S0 为通道选择控制信号端,Y 为输出端。当S1 和S0 取值分别为00、01、10、11 时,输出端Y 将分别输出来自输入端口A、B、C、D的数据。

表3.3 4 选1 多路选择器

图3.20 4 选1 多路选择器

2. 设计代码

【代码3.8】4 选1 多路选择器设计方法

【代码3.8】是采用if_else 语句实现的4 选1 多路选择器的Verilog 代码。此代码基本含义是,当always 过程语句的敏感信号有变化时,开始执行“begin_end”块语句代码,而在该块语句内部首先将S0 和S1 拼接成为2 位位宽的数据赋值给寄存器变量SEL,然后用if 条件语句对SEL 取值进行判断,当“SEL==0”条件为真时,输出A 的值;否则如果“SEL==1”条件为真时,输出B 的值;否则如果“SEL==2”条件为真时,输出C的值;上述条件都不成立时,输出D 的值。通过Vivado 对【代码3.8】进行综合实现后,可查看RTL 电路结果,如图3.21 所示。

图3.21 4 选1 多路选择器RTL 电路结构

3. 阻塞和非阻塞赋值语句

在【代码3.8】的always 过程语句中,使用了两种赋值符号,分别是“=”和“<=”,它们分别对应了两种赋值方式,即阻塞式赋值和非阻塞式赋值。

(1)阻塞式赋值。

Verilog 中,使用普通等号“=”作为赋值符号的赋值语句称为阻塞式赋值,如“SEL= {S1,S0};”。其赋值特点是,一旦执行完赋值操作,赋值目标变量的值立即发生改变,即“=”左边的目标变量立即获得右边表达式的值。

所谓“阻塞”可以理解为阻止顺序语句块中其他语句的执行。例如,在一个块语句中,如果含有多条阻塞式赋值语句,当执行到其中某条语句时,如果该语句没有执行完,那么其后面的语句将处于等待中,不会被执行,好像都被阻塞了一样,即其他语句不可能被同时执行。

(2)非阻塞式赋值。

使用“<=”作为赋值符号的赋值语句称为非阻塞式赋值,如“Y<=A;”。其赋值特点是:所有过程语句中的非阻塞赋值语句,必须在块语句执行结束时才会整体完成赋值更新。

所谓“非阻塞”的含义可以理解为对顺序语句块中的其他语句的执行,一律不加限制、影响和阻塞。即在“begin_end”块语句中的所有赋值语句都可以并行运行。

(1)assign 赋值语句中只能使用“=”,且等号左边的目标对象只能是wire 型。(www.xing528.com)

(2)always 语句中,两种赋值符号都可使用,但等号左边的目标对象只能是reg 型变量。

(3)有时,在always 过程语句中,两种赋值符号可以互换,但在大多时候,不同的赋值符号将导致不同的电路结构和逻辑功能。

(4)对同一变量,阻塞和非阻塞赋值语句不能混合使用。

为了更好理解阻塞和非阻塞区别,请看下面两段分别是使用阻塞语句和非阻塞语句代码示例。

例8 使用阻塞赋值代码示例

例9 使用非阻塞赋值代码示例

图3.22 是例8 综合后的RTL 电路结构图,图3.23 是例9 综合后的RTL 电路结构图。从两幅RTL 电路结构图中不难发现,阻塞表达描述电路最后只使用了一个D 触发器,而非阻塞表达电路最后使用了4 个D 触发器。也就是从data 的输入端数据如果要传输到输出端y,如果采用例8 阻塞的表达方式则只需一个clk 时钟时间,如果采用例9 非阻塞的表达方式则需要4 个时钟才能完成信号的传递输出。因此,两种表达综合电路后的结果是截然不同的。

图3.22 使用阻塞表达的RTL 结构

图3.23 使用非阻塞表达的RTL 结构

4. 逻辑操作符

在【代码3.8】的if 语句条件表达式中使用了“==”操作符,称为等值操作符,在Verilog 中常见操作符见表3.4 所示。

表3.4 常见操作符

其中等值操作符主要包含4 种:“==”“!=”“===”“!==”,往往用来对两个操作数进行比较,判断是否相等。而相等操作符“==”与全等操作符“===”的区别是,使用相等“==”时,必须两个操作数逐位相等,其比较结果的值才为1(真),如果某些位是不定值或高阻态,其比较结果为不定值;当使用全等“===”时,对不定值或高阻状态位也进行比较,当两个操作数完全一致时,其结果才为1(真),否则为0(假)。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈