一、题目描述
制作一个四选一的多路选择器,要求输出定义上为线网类型
状态转换:
d0 | 11 |
d1 | 10 |
d2 | 01 |
d3 | 00 |
信号示意图:
波形示意图:
输入描述:
输入信号 d1,d2,d3,d4 sel 类型 wire
输出描述:
输出信号 mux_out 类型 wire
二、实现思路
1、由波形可以确定出是组合逻辑(输入与输出在同一时刻)。组合逻辑的特点是
任意时刻的输出仅仅取决于该时刻的输入
,与电路原本的状态无关,逻辑中不牵涉跳变沿信号的处理。
组合逻辑的verilog描述方式有两种:
(1)always @(电平敏感信号列表)或者always @ (*)
always模块的敏感列表为所有判断条件信号和输入信号,但一定要注意敏感列表的完整性。
always 模块中的信号必须定义为reg 型,在组合逻辑的always模块用阻塞赋值=,这种电路结构只与输入电平有关。
(2)assign描述的赋值语句
信号只能被定义为wire型;
2、由于输出定义的是线网类型(wire),所以不能使用 always 组合逻辑块,只能使用连续赋值语句assign来进行赋值;
若要使用 always 语句块则需要另外定义一个 reg 型的变量来存储结果,并在输出时使用 assign 语句来赋值
。
三、代码展示
思路一:在 always 语句块内赋值,使用 case 语句或者 if…else 语句
case
`timescale 1ns/1ns
module mux4_1(
input [1:0]d1,d2,d3,d0,
input [1:0]sel,
output[1:0]mux_out
);
//*************code***********//
reg [1:0] reg_temp;
always @(*)
begin
case(sel)
2'b00:reg_temp=d3;
2'b01:reg_temp=d2;
2'b10:reg_temp=d1;
2'b11:reg_temp=d0;
default:reg_temp=d0;
endcase
end
assign mux_out=reg_temp;
//*************code***********//
endmodule
if…else
`timescale 1ns/1ns
module mux4_1(
input [1:0]d1,d2,d3,d0,
input [1:0]sel,
output[1:0]mux_out
);
//*************code***********//
reg [1:0] reg_temp;
always @(*)
begin
if(sel==2'b00)
reg_temp=d3;
else if(sel==2'b01)
reg_temp=d2;
else if(sel==2'b10)
reg_temp=d1;
else
reg_temp=d0;
end
assign mux_out=reg_temp;
//*************code***********//
endmodule
思路二:直接使用 assign 语句赋值,使用三目运算符(条件运算符)( ? : )
`timescale 1ns/1ns
module mux4_1(
input [1:0]d1,d2,d3,d0,
input [1:0]sel,
output[1:0]mux_out
);
//*************code***********//
assign mux_out=sel[1]?(sel[0]?d0:d1):(sel[0]?d2:d3);//先判断地位,再判断高位
//assign mux_out=sel[0]?(sel[1]?d0:d2):(sel[1]?d1:d3);//先判断高位,再判断低位
//*************code***********//
endmodule