数字IC手撕代码-XX公司笔试真题(数据流最大值)

  前言:

        本专栏旨在记录高频笔面试手撕代码题,以备数字前端秋招,本专栏所有文章提供原理分析、代码及波形,所有代码均经过本人验证。

目录如下:

1.数字IC手撕代码-分频器(任意偶数分频)

2.数字IC手撕代码-分频器(任意奇数分频)

3.数字IC手撕代码-分频器(任意小数分频)

4.数字IC手撕代码-异步复位同步释放

5.数字IC手撕代码-边沿检测(上升沿、下降沿、双边沿)

6.数字IC手撕代码-序列检测(状态机写法)

7.数字IC手撕代码-序列检测(移位寄存器写法)

8.数字IC手撕代码-半加器、全加器

9.数字IC手撕代码-串转并、并转串

10.数字IC手撕代码-数据位宽转换器(宽-窄,窄-宽转换)

11.数字IC手撕代码-有限状态机FSM-饮料机

12.数字IC手撕代码-握手信号(READY-VALID)

13.数字IC手撕代码-流水握手(利用握手解决流水线断流、反压问题)

14.数字IC手撕代码-泰凌微笔试真题

15.数字IC手撕代码-平头哥技术终面手撕真题

16.数字IC手撕代码-兆易创新笔试真题

17.数字IC手撕代码-乐鑫科技笔试真题(4倍频)

18.数字IC手撕代码-双端口RAM(dual-port-RAM)

        ...持续更新

 更多手撕代码题可以前往 数字IC手撕代码--题库


目录

题目描述

解题思路

代码

testbench

波形


题目描述

        已知一段数据流 data 输入,在 datain_ena 为高时有效时,请将这段数据流的最大次大值 选出,在一段 datain_ena 结束之后给出相应的结果 max,submax 和结果使能 dataout_ena。

Input clk; 
Input [4:0] datain; 
Input datain_ena; 
Output [4:0] max; 
Output [4:0] submax; 
Output dataout_ena;

解题思路

        这道题比较简单,比较大小,要注意的就两个点:

        ① 当输入的datain不超过两个时,dataout_ena不能拉高,只有输入至少两个数时,才有max和submax均有意义。

        ② 考虑所有可能情况,输入的数据比max大时,将max替换为datain,submax替换为max即可;当输入数据等于max时,将submax数据替换为datain,这样有max=submax(看题意理解,可以可以不这么做);当输入数据小于max但大于等于submax时,将submax替换为datain;当输入数据小于submax时,什么都不做。

代码

module find_max(
    input               clk         ,
    input    [4:0]      datain      ,
    input               datain_ena  ,
    input               rstn        ,

    output  reg [4:0]   max         ,  
    output  reg [4:0]   submax      ,
    output              dataout_ena
);

always @(posedge clk)begin
    if(!rstn)begin
        max <= 5'd0;
        submax <= 5'd0;
    end
    else if(datain_ena == 1'b1)begin
        if(datain > max)begin
            max <= datain;
            submax <= max;
        end
        else if(datain == max)begin
            submax <= datain;
        end
        else if(datain >=submax && datain < max)begin
            submax <= datain;
        end
    end
end

reg [1:0] count;
always @(posedge clk)begin
    if(!rstn)begin
       count <= 2'd0; 
    end
    else if(datain_ena && count < 2'd3)begin
        count <= count + 1'b1;
    end
end

assign dataout_ena = (count >= 2) ? 1:0;  //if input number >= 2 , dataout_ena = 1

endmodule

testbench

module find_max_tb();

reg clk,rstn;
reg [4:0] datain;
reg datain_ena;

wire [4:0] max,submax;
wire dataout_ena;

always #5 clk <= ~clk;

initial begin
    clk <= 1'b0;
    rstn <= 1'b0;
    datain_ena <= 1'b0;
    #16
    rstn <= 1'b1;
    #20
    datain_ena <= 1'b1;
    datain <= 5'd2; 
    #10
    datain <= 5'd3;
    #10
    datain <= 5'd7;
    #10
    datain <= 5'd4;
    #10
    datain <= 5'd9;
    #20
    datain_ena <= 1'b0;
    #200
    $finish();
end

//dump fsdb
initial begin
    $fsdbDumpfile("find_max.fsdb");
    $fsdbDumpvars(0);
end

find_max u_find_max(
    .clk        (clk)           ,
    .rstn       (rstn)          , 
    .datain     (datain)        ,
    .datain_ena (datain_ena)    ,
    
    .max        (max)           ,
    .submax     (submax)        ,
    .dataout_ena(dataout_ena)
);

endmodule

波形

 从波形可以看到,输入两个datain之后dataout_ena才会拉高。满足所有考虑的情况。


 更多手撕代码题可以前往 数字IC手撕代码--题库

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃葱的酸菜鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值