VL1-四选一多路选择器

一、题目描述

制作一个四选一的多路选择器,要求输出定义上为线网类型

状态转换:

d0 11
d1 10
d2 01
d3 00

信号示意图:
VL1-四选一多路选择器_第1张图片

波形示意图:
VL1-四选一多路选择器_第2张图片

输入描述:
输入信号 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

你可能感兴趣的:(Verilog刷题,fpga开发)