多路选择器与多路分解器文档格式.docx

上传人:b****3 文档编号:15070531 上传时间:2022-10-27 格式:DOCX 页数:17 大小:171.33KB
下载 相关 举报
多路选择器与多路分解器文档格式.docx_第1页
第1页 / 共17页
多路选择器与多路分解器文档格式.docx_第2页
第2页 / 共17页
多路选择器与多路分解器文档格式.docx_第3页
第3页 / 共17页
多路选择器与多路分解器文档格式.docx_第4页
第4页 / 共17页
多路选择器与多路分解器文档格式.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

多路选择器与多路分解器文档格式.docx

《多路选择器与多路分解器文档格式.docx》由会员分享,可在线阅读,更多相关《多路选择器与多路分解器文档格式.docx(17页珍藏版)》请在冰豆网上搜索。

多路选择器与多路分解器文档格式.docx

inputiD,

input[1:

0]iSel,

outputregoQ

);

always@(*)

case(iSel)

2'

b00:

oQ=iA;

b01:

oQ=iB;

b10:

oQ=iC;

b11:

oQ=iD;

endcase

endmodule

第10~16行,使用case语句来实现4选1多路选择器。

因为是2^n个case选项,所以此处没有使用default语句。

下面我会使用一个3选1的多路选择器来说明default的作用。

图1.14选1多路选择器的RTL视图

由图1.1所示,在2^n个case选项时,没有加上default语句,其综合的结果为并行的MUX。

代码1.24选1多路选择器testbench(不可综合,仅用于仿真)

modulemultiplexer_tb;

regi_a,i_b,i_c,i_d;

reg[1:

0]i_sel;

wireo_q;

initialbegin

i_a=1;

i_b=0;

i_c=0;

i_d=0;

#20i_a=1;

i_c=1;

i_d=1;

#20i_a=0;

i_b=1;

end

i_sel=2'

b00;

#20i_sel=2'

b01;

b10;

b11;

#20$stop;

multiplexermultiplexer_inst(

.iA(i_a),

.iB(i_b),

.iC(i_c),

.iD(i_d),

.iSel(i_sel),

.oQ(o_q)

第3~5行声明了一些变量,使用的标准为:

映射为所需测试模块的输入信号,即需要使用initial或always来给出激励,因此多声明为reg类型;

而映射为所需测试模块的输出信号,不需要激励,声明为wire类型即可。

第21行,$stop表示仿真在此时刻终止。

更多$打头的函数,请参考Verilog语法书。

#20$stop;

图1.2 

4选1多路选择器的功能仿真波形

图1.3 

4选1多路选择器的门级仿真波形

由图1.2和图1.3所示,在2^n个case选项时,没有加上default语句,其功能仿真和门级仿真保持一致。

1.1.2怎么多出个锁存器?

此处以3选1多路选择器为例。

代码1.33选1多路选择器1(可综合)

图1.43选1多路选择器1的RTL视图

如图1.4所示,综合出来了锁存器。

下面我们讨论如何消除这个锁存器。

方法1加(*full_case*)修饰

代码1.43选1多路选择器2(可综合)

(*full_case*)case(iSel)

第10行,加(*full_case*)修饰,强制综合成fullcase。

(*full_case*)case(iSel)

图1.53选1多路选择器2的RTL视图

方法2使用default语句

代码1.53选1多路选择器3(可综合)

default:

oQ=1'

b0;

第14行,加上default语句,来描述缺省动作。

图1.63选1多路选择器3的RTL视图

方法3在敏感列表后,赋初值

代码1.63选1多路选择器4(可综合)

always@(*)

begin

end

注意第9~17,在代码1.3的基础上,于敏感列表之后,加入oQ的初值。

图1.73选1多路选择器4的RTL视图

方法123的比较

代码1.73选1多路选择器的testbench(不可综合,仅用于仿真)

regi_a,i_b,i_c;

i_a=0;

#20i_a=1'

bx;

i_b=1'

i_c=1'

bxx;

图1.8方法1的功能仿真波形

图1.9方法1的门级仿真波形

由图1.8和图1.9所示,虽然方法1加了(*full_case*)修饰后,3选1多路选择器的综合结果没有产生锁存器,但是其功能仿真波形却当作锁存器来处理,而其门级仿真波形则是当作无关项来处理。

即方法1,其前后仿真结果是不一致的。

至于其他的特点,本文暂不讨论。

想要了解更多fullcase的信息,请阅读参考2。

图1.10方法2的功能仿真波形

图1.11方法2的门级仿真波形

如图1.10和1.11所示,方法2使用了default语句,其前后仿真和综合的RTL视图一致。

萧鸿森大哥提醒我们:

正确的做法是,default指定输出0或者某个选项。

图1.12方法3的功能仿真波形

图1.13方法3的门级仿真波形

如图1.12和1.13所示,方法3在敏感列表后,赋初值也可以很好解决锁存器的问题。

1.1.3结论

虽然方法123都可以解决锁存器的问题,但是:

方法1的前后仿真结果不同;

方法3的其他特点暂时没有研究。

因此此处只推荐大家使用方法2,即要实现并行的mux,当case选项不是2^n个的时候,加上default指定输出0或某个选项是最安全的(虽然Verilog语法没有强制加入default)。

1.2带优先级的多路选择器

1.2.1使用if-else-if描述

代码1.8使用if-else-if描述的3选1多路选择器(可综合)

if(iSel==2'

b0)

elseif(iSel==2'

b01)

else

第9~15行,使用if-else-if描述带优先级的多路选择器。

有人看到我的代码会有一点小疑问?

为什么always块没有加begin-end的。

其实呢这个begin-end就相当于C语言里面的{},与C语言类似,当后面的语句条数为1时,可以省略begin-end。

而if-else-if恰好为一个完整的语句。

图1.14使用if-else-if描述的3选1多路选择器的RTL视图

1.2.2使用“:

?

”描述

既然使用if-else-if可以描述带优先级的多路选择器,那么使用“:

”当然也是可行的。

代码1.9

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 可爱清新

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1