HDLBits从零开始——第61题到第70题答案

目录

第61题:2-to-1 multiplexer

第62题:2-to-1 bus multiplexer

第63题:9-to-1 multiplexer

第64题:256-to-1 multiplexer

第65题:256-to-1 4-bit multiplexer

第66题:Half adder

第67题:Full adder

第68题:3-bit binary adder

第69题:Adder

第70题:Signed addition overflow


第61题:2-to-1 multiplexer

module top_module
( 
    input   a, b, sel,
    output  out 
); 

assign  out = (sel == 0) ? a : b;

endmodule

第62题:2-to-1 bus multiplexer

module top_module
( 
    input   [99:0]  a, b,
    input           sel ,
    output  [99:0]  out 
);

assign  out = (sel == 0) ? a : b;

endmodule

第63题:9-to-1 multiplexer

module top_module
( 
    input   [15:0]  a, b, c, d, e, f, g, h, i,
    input   [3:0]   sel,
    output  [15:0]  out 
);

always@(*)
    case(sel)
        0 : out = a;
        1 : out = b;
        2 : out = c;
        3 : out = d;
        4 : out = e;
        5 : out = f;
        6 : out = g;
        7 : out = h;
        8 : out = i;
        default : out = 16'hffff;
    endcase

endmodule

第64题:256-to-1 multiplexer

module top_module
( 
    input   [255:0] in  ,
    input   [7:0]   sel ,
    output          out 
);

assign  out = in[sel];

endmodule

第65题:256-to-1 4-bit multiplexer

module top_module
( 
    input   [1023:0]    in,
    input   [7:0]       sel,
    output  [3:0]       out 
);

/*-----方法1-----*/
assign  out = in[(sel*4)+:4];

/*-----方法2-----*/
// integer i;

// always@(*)
    // for(i = 0;i < 4;i = i + 1)
        // begin
            // out[i] = in[sel*4+i];
        // end

endmodule

第66题:Half adder

module top_module
( 
    input   a, b,
    output  cout, sum 
);

assign  {cout,sum} = {a&b,a^b};

endmodule

第67题:Full adder

module top_module
( 
    input   a, b, cin,
    output  cout, sum 
);

assign  cout = (a&b) + ((a^b)&cin);
assign  sum = a^b^cin;

endmodule

第68题:3-bit binary adder

module top_module
( 
    input   [2:0]   a, b,
    input           cin,
    output  [2:0]   cout,
    output  [2:0]   sum 
);

full_adder  full_adder_inst1
( 
    .a(a[0]), .b(b[0]), .cin(cin),
    .cout(cout[0]), .sum(sum[0]) 
);

full_adder  full_adder_inst2
( 
    .a(a[1]), .b(b[1]), .cin(cout[0]),
    .cout(cout[1]), .sum(sum[1]) 
);

full_adder  full_adder_inst3
( 
    .a(a[2]), .b(b[2]), .cin(cout[1]),
    .cout(cout[2]), .sum(sum[2]) 
);

endmodule

module full_adder
( 
    input   a, b, cin,
    output  cout, sum 
);

assign  cout = (a&b) + ((a^b)&cin);
assign  sum = a^b^cin;

endmodule

第69题:Adder

module top_module 
(
    input   [3:0] x     ,
    input   [3:0] y     , 
    output  [4:0] sum
);

wire    [3:0]   cout;

FA FA_inst0
( 
    .a(x[0]), .b(y[0]), .cin(0),
    .cout(cout[0]), .sum(sum[0]) 
);

generate
    genvar i;
    for(i= 1;i < 4;i= i+1)
        begin:adder4_inst
            FA FA_insti
            ( 
                .a(x[i]), .b(y[i]), .cin(cout[i-1]),
                .cout(cout[i]), .sum(sum[i]) 
            );
        end
endgenerate

assign  sum[4] = cout[3];

endmodule

module FA
( 
    input   a, b, cin,
    output  cout, sum 
);

assign  cout = (a&b) + ((a^b)&cin);
assign  sum = a^b^cin;

endmodule

第70题:Signed addition overflow

module top_module 
(
    input   [7:0]   a       ,
    input   [7:0]   b       ,
    output  [7:0]   s       ,
    output          overflow
);

wire [8:0]   a_b;

assign s = a + b;
assign a_b = a + b;
//符号相反不会溢出,则直接输出0,符号相同,如果进位 位 和 和的符号位相反,则溢出,输出1
assign overflow = (a[7] == b[7]) ? (a_b[8] ^ a_b[7]) : 0;

endmodule

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值