前言:
本专栏旨在记录高频笔面试手撕代码题,以备数字前端秋招,本专栏所有文章提供原理分析、代码及波形,所有代码均经过本人验证。
目录如下:
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
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手撕代码--题库