Verilog学习之四选一多路器设计


前言


在前面我们对 Verilog 的基础语法知识进行了学习,对 Verilog也有了一定的了解,接下来的一段时间我们就开始在牛客网上进行刷题,巩固我们的基础知识,熟悉用 Verilog 去写代码。 今天我们做的是第一道题——四选一多路器,并附上牛客网刷题的网址:四选一多路器


一、题目描述

制作一个四选一的多路选择器,要求输出为线网类型
状态转换:
d0 11
d1 10
d2 01
d3 00
信号示意图:
在这里插入图片描述

波形示意图:
在这里插入图片描述

输入描述:
输入信号 d1,d2,d3,d4,sel
类型 wire

输出描述:
输出信号 mux_out
类型 wire

二、实现思路

1.由题可以看出输入与输出的位宽都是2bit
2.然后由波形可以确定出是组合逻辑(输入与输出在同一时刻)
3.并且因为输出定义的是线网类型(wire),所以不能使用 always 组合逻辑块,只能使用连续赋值语句assign来进行赋值;若要使用 always 语句块则需要另外定义一个 reg 型的变量来存储结果,并在输出时使用 assign 语句来赋值。
4.理清对应关系
在这里插入图片描述

三、代码展示

解法一

在 always 语句块内赋值,使用 case 语句或者 if…else 语句
1. case 语句

 `timescale 1ns/1ns
module mux4_1(
input [1:0]d1,d2,d3,d0,
input [1:0]sel,
output[1:0]mux_out
);
reg [1:0] mux_reg;
always @(*) begin
      case(sel)
           2'b00: mux_reg <= d0;
           2'b01: mux_reg <= d1;
           2'b10: mux_reg <= d2;
           2'b11: mux_reg <= d3;
           default:;
      endcase
    end
assign mux_out = mux_reg;
endmodule

2. if…else语句

 `timescale 1ns/1ns
module mux4_1(
input [1:0]d1,d2,d3,d0,
input [1:0]sel,
output[1:0]mux_out
);
reg [1:0] mux_out_t;
always @(*) begin
    if(sel == 2'b00)
        mux_out_t = d0;
    else if(sel == 2'b01)
        mux_out_t = d1;
    else if(sel == 2'b10)
        mux_out_t = d2;
    else
        mux_out_t = d3;
end
assign mux_out = mux_out_t;
endmodule

解法二

直接使用 assign 语句赋值,使用条件运算符( ? : )

`timescale 1ns/1ns
module mux4_1(
input [1:0]d1,d2,d3,d0,
input [1:0]sel,
output[1:0]mux_out
);
assign mux_out = sel[0]?(sel[1]?d0:d2):(sel[1]?d1:d3);
endmodule


总结

这是我想到的实现四选一多路器设计的三种不同形式,如果还有更多更好的解法,欢迎读到这篇文章的朋友们在评论区告诉我,共同进步嘛。

  • 13
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个默默无闻的小程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值