njithjw的个人空间 https://blog.eetop.cn/505866 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

选择器mux的一种优化方式

已有 1860 次阅读| 2011-12-25 22:23 |个人分类:FPGA_Verilog

下面的例子是一个16选1的多路选择器代码1给出的是直接选择的方式;代码2给出了多一级流水线的代码时序的方式。代码2相比代码1资源会多一些,但时序方面的性能会更好。

module mux16t1_a
    (
    input                   rst,
    input                   clk,

    input           [3:0]   sel,
    input           [7:0]   datain0,
    input           [7:0]   datain1,
    input           [7:0]   datain2,
    input           [7:0]   datain3,
    input           [7:0]   datain4,
    input           [7:0]   datain5,
    input           [7:0]   datain6,
    input           [7:0]   datain7,
    input           [7:0]   datain8,
    input           [7:0]   datain9,
    input           [7:0]   datain10,
    input           [7:0]   datain11,
    input           [7:0]   datain12,
    input           [7:0]   datain13,
    input           [7:0]   datain14,
    input           [7:0]   datain15,

    output  reg     [7:0]   dataout

    );

always @ (posedge clk or posedge rst)
begin
    if (rst == 1'b1)
        dataout <= 8'd0;
    else
    begin
        case (sel)
            4'd0: dataout <= datain0;
            4'd1: dataout <= datain1;
            4'd2: dataout <= datain2;
            4'd3: dataout <= datain3;
            4'd4: dataout <= datain4;
            4'd5: dataout <= datain5;
            4'd6: dataout <= datain6;
            4'd7: dataout <= datain7;
            4'd8: dataout <= datain8;
            4'd9: dataout <= datain9;
            4'd10: dataout <= datain10;
            4'd11: dataout <= datain11;
            4'd12: dataout <= datain12;
            4'd13: dataout <= datain13;
            4'd14: dataout <= datain14;
            4'd15: dataout <= datain15;
            default: dataout <= datain0;
        endcase
    end
end

endmodule

///////////////////////////////////////////////////////////////////////////////////////////////

module mux16t1_b
    (
    input                   rst,
    input                   clk,

    input           [3:0]   sel,
    input           [7:0]   datain0,
    input           [7:0]   datain1,
    input           [7:0]   datain2,
    input           [7:0]   datain3,
    input           [7:0]   datain4,
    input           [7:0]   datain5,
    input           [7:0]   datain6,
    input           [7:0]   datain7,
    input           [7:0]   datain8,
    input           [7:0]   datain9,
    input           [7:0]   datain10,
    input           [7:0]   datain11,
    input           [7:0]   datain12,
    input           [7:0]   datain13,
    input           [7:0]   datain14,
    input           [7:0]   datain15,

    output  reg     [7:0]   dataout

    );

reg     [7:0]   dataout_pre0;
reg     [7:0]   dataout_pre1;
reg     [7:0]   dataout_pre2;
reg     [7:0]   dataout_pre3;

always @ (posedge clk or posedge rst)
begin
    if (rst == 1'b1)
        dataout_pre0 <= 8'd0;
    else
    begin
        case (sel[1:0])
            2'd0: dataout_pre0 <= datain0;
            2'd1: dataout_pre0 <= datain1;
            2'd2: dataout_pre0 <= datain2;
            2'd3: dataout_pre0 <= datain3;
            default: dataout_pre0 <= datain0;
        endcase
    end
end

always @ (posedge clk or posedge rst)
begin
    if (rst == 1'b1)
        dataout_pre1 <= 8'd0;
    else
    begin
        case (sel[1:0])
            2'd0: dataout_pre1 <= datain4;
            2'd1: dataout_pre1 <= datain5;
            2'd2: dataout_pre1 <= datain6;
            2'd3: dataout_pre1 <= datain7;
            default: dataout_pre1 <= datain4;
        endcase
    end
end

always @ (posedge clk or posedge rst)
begin
    if (rst == 1'b1)
        dataout_pre2 <= 8'd0;
    else
    begin
        case (sel[1:0])
            2'd0: dataout_pre2 <= datain8;
            2'd1: dataout_pre2 <= datain9;
            2'd2: dataout_pre2 <= datain10;
            2'd3: dataout_pre2 <= datain11;
            default: dataout_pre2 <= datain8;
        endcase
    end
end

always @ (posedge clk or posedge rst)
begin
    if (rst == 1'b1)
        dataout_pre3 <= 8'd0;
    else
    begin
        case (sel[1:0])
            2'd0: dataout_pre3 <= datain12;
            2'd1: dataout_pre3 <= datain13;
            2'd2: dataout_pre3 <= datain14;
            2'd3: dataout_pre3 <= datain15;
            default: dataout_pre3 <= datain12;
        endcase
    end
end

always @ (posedge clk or posedge rst)
begin
    if (rst == 1'b1)
        dataout <= 8'd0;
    else
    begin
        case (sel[3:2])
            2'd0: dataout <= dataout_pre0;
            2'd1: dataout <= dataout_pre1;
            2'd2: dataout <= dataout_pre2;
            2'd3: dataout <= dataout_pre3;
            default: dataout <= dataout_pre0;
        endcase
    end
end

endmodule


点赞

发表评论 评论 (3 个评论)

回复 shiyinjita 2011-12-26 15:18
:victory: 楼主第二种方法很经典,但是我有一个疑问,如果在ASIC中,肯定第二种比第一种要好,但是在FPG中,因为输入是4-LUT,这就本身有16种情况,可以用一个LUT实现,根本没有延迟的,第一种的写法甚至要比第二种要好,这是我的理解,请问楼主,您觉得呢?
回复 njithjw 2011-12-26 23:35
FPGA中的LUT是4输入的,但是如果要选择的数据位宽却不一定是1bit的。
回复 shiyinjita 2011-12-27 12:50
原帖由njithjw于2011-12-26 23:35:57发表 FPGA中的LUT是4输入的,但是如果要选择的数据位宽却不一定是1bit的。
OK,如果不是一位,那么楼主的方法很经典。呵呵,谢谢楼主哦

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 2

    粉丝
  • 0

    好友
  • 0

    获赞
  • 17

    评论
  • 3512

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-27 21:53 , Processed in 0.019396 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部