[牛客网刷题][基础篇]6-10

目录

6.多功能数据处理器

7.求两个数的差值

8.使用generate...for语句简化代码

 9.使用子模块实现三输入数的大小比较

10.使用函数实现数据大小端转换


6.多功能数据处理器

  •  第一点:多功能数据处理器其实就是一个时序逻辑电路中的多路选择器,通过sel来对输出通道进行选择,实现功能,整体比较简单,写即可。
`timescale 1ns/1ns
module data_select(
	input clk,
	input rst_n,
	input signed[7:0]a,
	input signed[7:0]b,
	input [1:0]select,
	output reg signed [8:0]c
);
    always@(posedge clk or negedge rst_n)begin
        if(rst_n == 1'b0)
            c <= 9'd0;
        else
            case(select)
                2'd0:    c    <=    a;
                2'd1:    c    <=    b;
                2'd2:    c    <=    a + b;
                2'd3:    c    <=    a - b;
            endcase
    end  
endmodule

7.求两个数的差值

  • 就是对于两个数字进行判断,采用a > b,a < b,综合即可。相对来说比较简单
`timescale 1ns/1ns
module data_minus(
	input clk,
	input rst_n,
	input [7:0]a,
	input [7:0]b,

	output  reg [8:0]c
);
    always@(posedge clk or negedge rst_n)begin
        if(rst_n == 1'b0)
            c    <=    9'd0;
        else    if(a > b)
            c    <=    a - b;
        else
            c    <=    b - a;
    end
    
endmodule

8.使用generate...for语句简化代码

  • 第一点:数据替换,即将将首位数据进行颠倒;
  • 第二点:采用generate...for语法,需要采用genvar来生成循环条件i,然后采用for循环语句进行循环,采用assign data_out[i] = data_in[7-i];即可,也比较简单,但是要熟练掌握,generate...for语法和语句,更利于提升效率。
`timescale 1ns/1ns
module gen_for_module( 
    input [7:0] data_in,
    output [7:0] data_out
);
    genvar i;
    generate
        for(i = 0;i < 8;i = i + 1)
        begin
            assign data_out[i] = data_in[7-i];
        end
    endgenerate
 
endmodule

 9.使用子模块实现三输入数的大小比较

  •  第一点:采用子模块的方式实现,所以要先生成compare的子模块,并且声明各个端口。
  • 第二点:进行例化,该题的重点也是在这里,很多人采用软件思维的方式只会例化2次子模块,是将a,b比较之后的结果min_ab与c进行比较,进而得到最终的最小值。
  • 但是这样是存在误区的,采用min_ab与c进行比较时,是上一时刻的a,b的最小值与此时的c的值进行比较,也就是拍数上是差一拍的,因此做不到比较同一拍下的a,b,c。
`timescale 1ns/1ns
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] min_1,min_2;
    
    compare compare_1(clk,rst_n,a,b,min_1);
    compare compare_2(clk,rst_n,a,c,min_2);
    compare compare_3(clk,rst_n,min_1,min_2,d);
endmodule


module compare(input clk,input rst_n,input [7:0] data_a,input [7:0] data_b,output reg [7:0] min);
    always@(posedge clk or negedge rst_n)begin
        if(rst_n == 1'b0)
            min    <=    8'd0;
        else    if(data_a > data_b)
            min    <=    data_b;
        else
            min    <=    data_a;
    end
endmodule

10.使用函数实现数据大小端转换

  •  可以采用function的方式,生成一个函数;也可以采用generate的方式,进行处理;也可以采用assign语句,多次进行处理,多次练习,融会贯通。
`timescale 1ns/1ns
module function_mod(
    input clk,
    input rst_n,
    
	input [3:0]a,
	input [3:0]b,
	
	output [3:0]c,
	output [3:0]d
);
    assign c = data_rev(a);
    assign d = data_rev(b);

    function [3:0] data_rev;
        input [3:0] data_in;
        begin
            data_rev[0] = data_in[3];
            data_rev[1] = data_in[2];
            data_rev[2] = data_in[1];
            data_rev[3] = data_in[0];
        end
    endfunction
endmodule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值