前言
在前面我们对 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
总结
这是我想到的实现四选一多路器设计的三种不同形式,如果还有更多更好的解法,欢迎读到这篇文章的朋友们在评论区告诉我,共同进步嘛。