Mux2to1
要求:描述一个2选1选择器,当选通信号sel=1,输出b,sel=0,输出a。
module top_module(
input a, b, sel,
output out );
assign out = sel ? b : a;
endmodule
Mux2to1v
要求:描述一个输入为2个100位向量的选择器,当选通信号sel=1,输出b,sel=0,输出a。
module top_module(
input [99:0] a, b,
input sel,
output [99:0] out );
assign out = sel ? b : a;
endmodule
Mux9to1v
要求:描述一个9选1选择器,sel=0输出a,sel=1输出b,如此类推,sel=9到15时,输出所有的位为1。
使用case语句,sel=9到15可以归类到default中。
module top_module(
input [15:0] a, b, c, d, e, f, g, h, i,
input [3:0] sel,
output [15:0] out );
always@(*)
begin
case(sel)
4'd0 : out = a;
4'd1 : out = b;
4'd2 : out = c;
4'd3 : out = d;
4'd4 : out = e;
4'd5 : out = f;
4'd6 : out = g;
4'd7 : out = h;
4'd8 : out = i;
default : out = 16'hffff;
endcase
end
endmodule
Mux256to1
要求:描述一个256选1的选择器,sel=0输出in[0],sel=1输出in[1],如此类推。
module top_module(
input [255:0] in,
input [7:0] sel,
output out );
assign out = in[sel];
endmodule
Mux256to1v
描述一个4位宽的256选1的选择器,sel=0输出in[3:0],sel=1输出in[7:4],如此类推。
这里我的第一想法是使用切片:assign out = in[4*sel+3 : 4*sel];
但是编译报错,原因是sel不是常量。
应该是Verilog中切片的上下界不可为变量。
改成使用索引进行位拼接就可以了。
module top_module(
input [1023:0] in,
input [7:0] sel,
output [3:0] out );
assign out = {in[4*sel+3],in[4*sel+2],in[4*sel+1],in[4*sel]};
endmodule
总结:本小节主要是对各种选择器的练习,选择器是很基础也很重要的模块,在很多地方都需要用到,一定要熟练掌握。