本来突发奇想,想建立一个群来召集各路同行加入,共同讨论数字IC以及FPGA方向的笔试,面试题目,效果比想象中的要好,大家气氛很好,踊跃发言,大胆讨论,解决了很多有意思的问题,这里挑出两个题目来记录一下,个人感觉写的很好:

题目是:

IC/FPGA笔试题分析(六)用16bit加法器IP核实现8bit乘法运算(文末彩蛋)_组合逻辑

本身快被遗忘了的一个题目,被大家的讨论掩盖过去了,可是好题终究还是会被发现,这位大哥就单独告诉我并给出了自己的思路,十分感谢,领教了。

IC/FPGA笔试题分析(六)用16bit加法器IP核实现8bit乘法运算(文末彩蛋)_组合逻辑_02

IC/FPGA笔试题分析(六)用16bit加法器IP核实现8bit乘法运算(文末彩蛋)_组合逻辑_03

IC/FPGA笔试题分析(六)用16bit加法器IP核实现8bit乘法运算(文末彩蛋)_组合逻辑_04


module mul8bits(
input clk,
input rst_n,

input [7:0] a,
input [7:0] b,

output reg [15:0] result

);

reg [15:0] areg;
reg [15:0] temp;
reg [3:0] cnt;

always@(posedge clk or negedge rst_n)begin
if(~rst_n) begin
areg <= {8{1'b0}, a};
temp <= 16'd0;
cnt <= 4'd0;
result <= 16'd0;
end
else if(cnt <= 7) begin
cnt <= cnt + 1;
areg <= areg <<1;
if(b[cnt]) begin
temp <= temp + areg;
else temp <= temp;
end
end
else begin
cnt <= cnt;
areg <= {8{1'b0},a};
result <= temp;
end
end


endmodule

上面的Verilog设计中,没有用到IP核,加入有一个IP核的例化模板为:

add16 inst_add16(
.in1(), //16bit
.in2(), //16bit
.sout(), //16bit
.cout() //1bit进位

);

当然还必须要求这个IP核必须在一个时钟内完成,是一个组合逻辑,且组合逻辑延迟不能大于一个时钟周期。

那么我们可以更改设计为:

module mul8bits(
input clk,
input rst_n,

input [7:0] a,
input [7:0] b,

output reg [15:0] result

);

reg [15:0] areg;
reg [15:0] temp;
reg [3:0] cnt;

always@(posedge clk or negedge rst_n)begin
if(~rst_n) begin
areg <= {8{1'b0}, a};
temp <= 16'd0;
cnt <= 4'd0;
result <= 16'd0;
end
else if(cnt <= 7) begin
cnt <= cnt + 1;
areg <= areg <<1;
if(b[cnt]) temp <= temp_w; //调用IP核
else temp <= temp;
end
else begin
cnt <= cnt;
areg <= {8{1'b0},a};
result <= temp;
end
end

wire [15:0] temp_w;

add16 inst_add16(

.in1(temp),
.in2(areg),
.sout(temp_w),
.cout()

);


endmodule

本想,自己写一个超前进位加法器来代替这个IP核的,后面再写吧,很晚了。


再给出一个仿真相关的题目:

IC/FPGA笔试题分析(六)用16bit加法器IP核实现8bit乘法运算(文末彩蛋)_组合逻辑_05

题目翻译过来就是:

在Verilog中设计模块以满足以下要求。

(1)频率为100MHz的时钟

(2)对时钟敏感的4位宽信号,限制该信号在8到15的范围内随机化16次。

之后也是提问者自己给出的答案,真是提问能激发人的思考呀:

IC/FPGA笔试题分析(六)用16bit加法器IP核实现8bit乘法运算(文末彩蛋)_sed_06

我给出完整代码:

`timescale 1ns/1ps
module random1();
reg clk;
reg [3:0] out_rand;

initial begin
clk = 0;
forever
#5 clk = ~clk;
end

//always begin
// #5 clk = ~clk;
//end



integer i;

initial begin

for(i = 0;i < 16; i = i + 1) begin
@(posedge clk) begin
out_rand = 4'b1000+ {$random}%8;
end
end

end
endmodule

IC/FPGA笔试题分析(六)用16bit加法器IP核实现8bit乘法运算(文末彩蛋)_sed_07

OK,谢谢各位。


见链接:

一年一度的校招又来了一段时间了,突然发现,一个人的力量是有限的,面对很多笔试,面试中的很多问题,也许会感到很无助,于是决定建立一个群,专门用来分享,讨论笔试面试题目。 现诚邀路过的同行加入,共同奋斗,互帮互助。