前言:
本专栏旨在记录高频笔面试手撕代码题,以备数字前端秋招,本专栏所有文章提供原理分析、代码及波形,所有代码均经过本人验证。
目录如下:
10.数字IC手撕代码-数据位宽转换器(宽-窄,窄-宽转换)
13.数字IC手撕代码-流水握手(利用握手解决流水线断流、反压问题)
18.数字IC手撕代码-双端口RAM(dual-port-RAM)
...持续更新
更多手撕代码题可以前往 数字IC手撕代码--题库
目录
已知一段数据流 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
- 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手撕代码--题库