第三节:多路选择器

发布于:2024-04-30 ⋅ 阅读:(96) ⋅ 点赞:(0)

1.二选一数据选择器,要求如下:

【注】 always语句块里赋值的变量需要是reg型

module fn_sw(a,b,sel,y);
input a,b,sel;
output y;
assign y = (sel==0)?(a&b):(a^b);
endmodule
`timescale 1ns/10ps
module fn_sw_tb;
reg a,b,sel;
wire y;

fn_sw fn_sw(
  .a(a),
  .b(b),
  .sel(sel),
  .y(y)
);


initial begin
a<=0;b<=0;sel<=0;
#10
a<=1;b<=1;sel<=0;
#10
a<=0;b<=1;sel<=1;
#10
a<=1;b<=0;sel<=1;
#10
a<=0;b<=0;sel<=0;
#10
$stop;
end

endmodule

【注】 我们在上述代码中使用了assign,其实也可以尝试使用一下always

即将下面代码

assign y = (sel==0)?(a&b):(a^b);

更换为

reg y;//因为下面要改变y了,所以声明reg y;

always @(a or b or sel)//敏感列表(即括号中任意值改变,则执行下述代码)

begin

        if(sel==0)

                 begin

                        y<=(a&b);

                end

        else if(sel==1)

                begin

                        y<=(a^b);

                end//如果只有一个语句,就不用begin end块,为了养成良好习惯,还是写上;

end

显然,这个题使用assign相当于always更简单,但是有些题用assign是实现不了的,比如下一题; 

2. 四选一选择器

module fn_sw(a,b,sel,y);
input a,b;
input[1:0] sel;
output y;
reg y;
always @(a or b or sel)begin
case(sel)
2'b00: begin y<=a&b;end
2'b01: begin y<=a|b;end
2'b10: begin y<=a^b;end
2'b11: begin y<=~(a^b);end
endcase
end
endmodule
`timescale 1ns/10ps
module fn_sw_tb;
reg a,b;
reg[1:0] sel;
wire y;

fn_sw fn_sw(
  .a(a),
  .b(b),
  .sel(sel),
  .y(y)
);


initial begin
  a <= 0; b <= 0; sel <= 2'b00; // 初始化为00
  #10
  a <= 1; b <= 1; sel <= 2'b00; // 然后变为00
  #10
  a <= 0; b <= 1; sel <= 2'b01; // 然后变为01
  #10
  a <= 1; b <= 0; sel <= 2'b01; // 再次变为01
  #10
  a <= 0; b <= 0; sel <= 2'b00; // 最后回到00
  #10
  $stop; // 停止仿真
end

endmodule

 这其实是2位的sel来选择四种状态,所以是一个四选一选择器;

参考链接:精准空降 


网站公告

今日签到

点亮在社区的每一天
去签到