题解 | #位拆分与运算#

位拆分与运算

https://www.nowcoder.com/practice/1649582a755a4fabb9763d07e62a9752

1.题目

输入一个包含了四个数据[3:0][7:4][11:8][15:12] 16位数据,

根据sel选择输出四个数据的相加结果,并输出valid_out信号(不输出时拉低)

0: 不输出且只有此时的输入有效 (即只有当sel=0时,输入的d才是有效的)

1:输出[3:0]+[7:4]

2:输出[3:0]+[11:8]

3:输出[3:0]+[15:12]

sel

输出out[4:0]

Valid_out

00

不输出,并且此时的d有效

拉低

01

d[3:0]+d[7:4]

拉高

10

d[3:0]+d[11:8]

拉高

11

d[3:0]+d[15:12]

拉高

2.模块图

3.参考波形图



4.解题思路

       使用时序逻辑,在sel=0时,对输入d进行锁存,这样保证了在sel=0时更新dsel0时保持锁存的值不变;sel=1/2/3时,通过使用锁存的d分别输出不同outvalid_out即可

5.绘制波形

但是有一点要注意的是: 如果sel使用阻塞赋值"="产生激励,那么得到的结果如下面第一张图, 但是如果sel采用非阻塞“<=”产生,则得到的波形图如下面图2

6.仿真代码和结果

    initial

        begin

            rst = 1'b0;

            d = 16'b0000_0000_0000_0000;

            sel = 2'd0;

            #30;

            rst = 1'b1;

            #10;

            d = 16'b1000_0100_0010_0001;

            #20;

            sel = 2'd2;

            #60;

            sel = 2'd1;

            d = 16'b1000_0100_0010_0011;

            #60;

            sel = 2'd0;

            #20;

            sel = 2'd3;

            #20;

            d = 16'b1000_0100_0010_0111;

            #100;

            $stop;

        end


    initial

        begin

            rst = 1'b0;

            d = 16'b0000_0000_0000_0000;

            sel = 2'd0;

            #30;

            rst = 1'b1;

            #10;

            d = 16'b1000_0100_0010_0001;

            #20;

            sel <= 2'd2;

            #60;

            sel = 2'd1;

            d = 16'b1000_0100_0010_0011;

            #60;

            sel = 2'd0;

            #20;

            sel = 2'd3;

            #20;

            d = 16'b1000_0100_0010_0111;

            #100;

            $stop;

        end


全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务