牛客网刷题记录(2)基础语法

VL6 多功能数据处理器:根据指示信号select的不同,对输入信号a,b实现不同的运算。输入信号a,b为8bit有符号数,当select信号为0,输出a;当select信号为1,输出b;当select信号为2,输出a+b;当select信号为3,输出a-b.
接口信号图如下:

    always @(posedge clk or negedge rst_n)begin
        if(~rst_n)
            c <= 9'b0;
        else
            case(select)
                2'b00: c <= a;
                2'b01: c <= b;
                2'b10: c <= a+b;
                2'b11: c <= a-b;
                default: c <= 9'b0;
            endcase
    end

位拼接,补齐符号位(当a或b有一个是无符号数使用,或将输入、输出、中间变量全部定义位有符号数)

    always @(posedge clk or negedge rst_n)begin
        if(~rst_n)
            c <= 9'b0;
        else
            case(select)
                2'b00: c <= {a[7],a};
                2'b01: c <= {b[7],b};
                2'b10: c <= {a[7],a}+{b[7],b};
                2'b11: c <= {a[7],a}-{b[7],b};
                default: c <= 9'b0;
            endcase
    end

VL7 求两个数的差值:根据输入信号a,b的大小关系,求解两个数的差值:输入信号a,b为8bit位宽的无符号数。如果a>b,则输出a-b,如果a≤b,则输出b-a。

 

    always @(posedge clk or negedge rst_n)begin
        if(~rst_n)
            c <= 0;
        else if(a>b)
            c <= a-b;
        else
            c <= b-a;
    end

VL8 使用generate…for语句简化代码:在某个module中包含了很多相似的连续赋值语句,请使用generata…for语句编写代码,替代该语句,要求不能改变原module的功能。

 

generate
    genvar gen;
    for(gen = 0; gen <8; gen = gen+1)begin
        assign data_out[7-gen] = data_in[gen];
    end
endgenerate

VL9 使用子模块实现三输入数的大小比较:请编写一个子模块,将输入两个8bit位宽的变量data_a,data_b,并输出data_a,data_b之中较小的数。并在主模块中例化,实现输出三个8bit输入信号的最小值的功能。

 

module main_mod(
    input clk,
    input rst_n,
    input [7:0]a,
    input [7:0]b,
    input [7:0]c,
    
    output [7:0]d
);

    wire [7:0] d1, d2;
        

    add adder1(
        .clk     (clk),
        .rst_n   (rst_n),
        .a       (a),
        .b       (b),
        .c       (d1)
    );
    add adder2(
        .clk     (clk),
        .rst_n   (rst_n),
        .a       (c),
        .b       (b),
        .c       (d2)
    );
    add adder(
        .clk     (clk),
        .rst_n   (rst_n),
        .a       (d1),
        .b       (d2),
        .c       (d)
    );
    
endmodule

module add(
    input clk,
    input rst_n,
    input [7:0] a,
    input [7:0] b,
    
    output reg [7:0] c
    
);
    always @(posedge clk or negedge rst_n)begin
        if(~rst_n)
            c <= 8'b0;
        else if(a > b)
            c <= b;
        else
            c <= a;
    end
    
    
endmodule

VL10 使用函数实现数据大小端转换:请用函数实现一个4bit数据大小端转换的功能。实现对两个不同的输入分别转换并输出。

     function [3:0] rev;
        input [3:0] data_in;
        generate
            genvar gen
            for(gen = 0; gen<4; gen=gen+1) begin
                assign rev[3-gen] = data_in[gen];
            end
        endgenerate
    endfunction
    
    assign c = rev(a);
    assign d = rev(b);//有误?

    function [3:0] rev;
        input [3:0] data_in;
        integer gen;
            for(gen = 0; gen<4; gen=gen+1) begin
                 rev[3-gen] = data_in[gen];
            end
    endfunction
    
    assign c = rev(a);
    assign d = rev(b);//有误?

!自带testbench含有clk,rst_n。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值