写在前面
牛客网中有各类题库,其中就有 FPGA/IC 的 Verilog 题库,通过刷题可以巩固基础。
牛客网 Verilog 题库包括基础、进阶以及企业笔试真题,并且全部免费!
本系列持续更新自己的刷题历程。
牛客网刷题直达链接
目录
题目描述
题目分析
Verilog 代码
testbench 代码
仿真结果
制作一个四选一的多路选择器,要求输出定义上为线网类型
状态转换:
d0 |
11 |
d1 |
10 |
d2 |
01 |
d3 |
00 |
信号示意图:
波形示意图:
多路选择器又称数据选择器,常用的有 2 选 1、4 选 1、8 选 1、16 选 1 等。当输入数据更多时则可以由上述选择器扩大功能而得,如 32 选1、64 选 1 等。在数据选择器中,通常用地址输入信号来完成挑选数据的任务。如一个 4 选 1 的数据选择器,应有 2 个地址输入端,它共有 4 种不同的组合,每一种组合可选择对应的一路输入数据输出。同理,对一个 8 选 1 的数据选择器,应有 3 个地址输入端。
图所示的是四选一数据选择器的原理图。图中的D0、D1、D2、D3是四个数据输入端,Y为输出端,A1、A0是地址输入端。从表中可见,利用指定A1A0的代码,能够从D0、D1、D2、D3这四个输入数据中选出任何一个并送到输出端。因此,用数据选择器可以实现数据的多路分时传送。
此外,数据选择器还广泛用于产生任意一种组合逻辑函数。在图示电路中,若将Y看成是A0、A1及D0、D1、D2、D3的函数,则可写成
如果把A1、A0视为两个输入逻辑变量,同时把D0、D1、D2和D3取为第三个输入逻辑变量A2的不同状态(即A2、/A2、1或0),便可产生所需要的任何一种三变量A2、A1、A0的组合逻辑函数。可见,利用具有n位地址输入的数据选择器可以产生任何一种输入变量数不大于n +1的组合逻辑函数。
生成一个四选一的多路选择器,并且输出为wire类型,可以用 assign 语句、case 语句、if 语句进行描述,这里选用 assign 语句。
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
// Engineer : Linest-5
// File : mux4_1.v
// Create : 2022-09-27 19:42:13
// Revise : 2022-09-27 19:42:13
// Module Name : mux4_1
// Description : 四选一多路器
// Editor : sublime text3, tab size (4)
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
`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 == 2'b00) ? d3 : ((sel == 2'b01) ? d2 : ((sel == 2'b10) ? d1 : d0));
//*************code***********//
endmodule
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
// Engineer : Linest-5
// File : tb_mux4_1.v
// Create : 2022-09-27 19:55:06
// Revise : 2022-09-27 21:02:02
// Module Name :
// Description :
// Editor : sublime text3, tab size (4)
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
`timescale 1ns/1ns
module tb_mux4_1();
// reg clk=0;
// always #5 clk = ~clk; // Create clock with period=10
// A testbench
reg [1:0] d1,d2,d3,d0,sel;
wire [1:0] mux_out;
initial begin
d1 = 2'd0;
d2 = 2'd1;
d3 = 2'd2;
d0 = 2'd3;
sel = 2'd0;
#10
sel = 2'd1;
#10
sel = 2'd2;
#10
sel = 2'd3;
#10
sel = 2'd2;
#10
sel = 2'd0;
#10
sel = 2'd1;
#10
sel = 2'd3;
end
mux4_1 mux4_1_inst(
.d1(d1),
.d2(d2),
.d3(d3),
.d0(d0),
.sel(sel),
.mux_out(mux_out)
);
//verdi
initial begin
$fsdbDumpfile("tb_mux4_1.fsdb");
$fsdbDumpvars(0);
end
endmodule
电路结构
仿真波形
可以看到下图的波形输出逻辑和题目要求一致,验证成功。