当前位置:   article > 正文

IC/FPGA笔试/面试题分析(八)近期IC/FPGA笔试面试讨论群题目汇总解析_fpga工程师社招笔试

fpga工程师社招笔试

背景:IC前端设计/FPGA笔(面)试交流群,欢迎同行加入

自从开始邀请同行加入笔试面试交流群之后,目前已经有40多位同行加入,大家踊跃发言,各抒己见,让各自受益匪浅。

今天的这篇博文是将近期部分题目做一次总结,我觉得有意思有意义的题目,当然之前也做了很多总结,但都是专题型的,这篇则不限专题。

后面还会有一篇关于FIFO专题的介绍,有时间在写。

如有路过的同行,想加入群,可以加我微信(ljs521615),备注csdn等,我拉你进群。


1.分析电路功能:

分析:看这个电路图,下面四个触发器和上面1个触发器构成,下面四个触发器的连接关系好像是分频器的连接,我们要分析这个电路的功能,就要画出每一个触发器的波形图,触发器的默认复位输出是0,当然Q反为1。

下面随手画了一个复位A时间够长的波形图:

用这张图给大家留一个初始印象,Q4的输出,可见是一个八分频输出,当然这不重要。

重要的是Y,当A为高电平的时候够长,我就能检测到A的高电平。

但大家请思考,如果A的高电平时间不够长,那么还没等到Q4的上升沿出现就变为低电平了,那么Y是永远也检测不到A的高电平的,那这个够长是多长呢?

数一下,是要大于等于7个时钟周期。

A的高电平时间必须大于等于7个时钟周期,否则,当成毛刺过滤掉。那么我不禁想这个电路到底什么功能呢?滤波电路!对于A的高电平时候小于7个时钟,我们就当做毛刺滤掉了。

好了,本想讨论到这里,但还是想通过仿真来实现一下,毕竟手画波形有点费劲。

我们先描述出这个电路:

  1. module freq_div(
  2. input clk,
  3. input A,
  4. output reg Y
  5. );
  6. wire A1;
  7. assign A1 = A;
  8. reg Q1_n, Q2_n ,Q3_n, Q4;
  9. always@(posedge clk or negedge A) begin
  10. if(~A) begin
  11. Q1_n <= 1'b1;
  12. end
  13. else begin
  14. Q1_n <= ~Q1_n;
  15. end
  16. end
  17. always@(posedge Q1_n or negedge A) begin
  18. if(~A) Q2_n <= 1'b1;
  19. else Q2_n <= ~Q2_n;
  20. end
  21. always@(posedge Q2_n or negedge A) begin
  22. if(~A) Q3_n <= 1'b1;
  23. else Q3_n <= ~Q3_n;
  24. end
  25. always@(posedge Q3_n or negedge A) begin
  26. if(~A) Q4 <= 1'b0;
  27. else Q4 <= ~Q4;
  28. end
  29. always@(posedge Q4 or negedge A) begin
  30. if(~A) Y <= 1'b0;
  31. else Y <= A1;
  32. end
  33. endmodule

然后看看原理图是不是和题目差不多,如下,是一样的功能。

寄存器传输级电路:

仿真文件:

  1. module sim_freq(
  2. );
  3. reg A;
  4. reg clk;
  5. wire Y;
  6. initial begin
  7. clk = 0;
  8. forever
  9. #2 clk = ~clk;
  10. end
  11. initial begin
  12. A = 0;
  13. #3
  14. A = 1;
  15. #14
  16. A = 0;
  17. #20
  18. A = 1;
  19. #38
  20. A = 0;
  21. end
  22. freq_div inst_freq(
  23. .clk(clk),
  24. .A(A),
  25. .Y(Y)
  26. );
  27. endmodule

仿真波形:

从这个仿真图中可以看出,A的高电平持续时间不够7个时钟时候,就被滤除了。反之,能够检测到。

由于没有标准答案,所以,只能这么胡说。

欢迎给出评论!



2.

这是一个FIFO最小深度计算的题目,关键要算出突发写入数据量。

3.

考察阻塞赋值和非阻塞赋值:

initial内部上半部分是阻塞赋值,所谓阻塞赋值就是要等上一条语句执行完了,在执行下面一条语句,所以打印出来的数据应该是

A = 4, B = 5;

下半部分为非阻塞赋值,所谓非阻塞赋值,和阻塞赋值恰恰相反,没有先后顺序,A的初始值为3,则打印出来的数据应该为:

A = 4, B = 4;

相关的还有今天的汇顶科技的一个题目:

在测试文件里,always是一个循环,就像我们写生成时钟一样,有种写法就是:

  1. initial clk = 0;
  2. always begin
  3. #2 clk = ~clk;
  4. end

https://blog.csdn.net/Reborn_Lee/article/details/82227255

那这里的always同样也是循环语句的作用,内部是阻塞赋值,@(A)以及@(B)相当于触发条件,#2其实也属于这一类,过了2ns执行下面的语句,这里就是A变化了就触发,题目中说A在15ns以及25ns各触发一次,当A在15ns触发一次后,count = 2,然后等待@(B),可是B一直为X态,没有触发,所以就一直阻塞到这里了,再多的时间也没用。所以只能最后count = 2.

 


4、

题目的意思大概是能够检测出D的错误吧,若要D的错误能反应出来(输出),A和B的与要为0,让输出取决于下面的与门,当然C要为1,这样输出就取决于D了,那么D有问题,直接可以反映到输出上。


5、

考察最简单的SDC语法,最Xilinx FPGA的一定了解XDC文件,XDC与SDC的关系是XDC包含SDC,

见博文:Xilinx设计约束(XDC)中时钟约束的表示方法

可知,约束的时钟的频率600MHz,占空比为50%,时钟名字叫GTXCLK;选择ABD吧,时钟源延迟看不出来,这里时钟源都没给,更别提看出来延迟是多少了。


6、

这一题见博客:IC/FPGA笔试/面试题分析(七)建立时间和保持时间类型考题汇总分析


7、

看描述,对于Proc_A,接收到FIFO_A的几乎满信号后,会停止信号输入,但是内部有8级流水线,需要全部流入到FIFO后才能停止写入FIFO_A,由于发出几乎满信号,一定是FIFO内部有数据了(最小为1个数据,就产生afull信号),所以afull之后的突发写数据个数为8,需要8个时钟.而8个时钟bproc已经读出4个数据了,所以fifo的最小深度应该为8-4+1 = 5;

为什么会加1呢?按理说一般计算的套路应该为8-4 = 4就够了。但是我们还要考虑我们考虑的仅仅是afull之后的fifo最小深度,afull之所以为1,是因为fifo_A内部有数据了,而数据最小为1产生了afull信号,所以需要加1构成最终的fifo最小深度。

最后给出讨论群里的其他大佬的答案(第一个给出答案的):

fifo深度应该是1+4为5,前面一个时钟写一个,两个时钟读一个,也就是两个时钟fifo里面会有一个数写进去,实际上a端已经写了两个数了,只不过被读出去了一个,为什么要再加一呢,afull是为了让fifo可以写进去数据,所以afull为1

小伙伴们的讨论让我受益匪浅,真的很感谢了。


8、

最后一个题目,是序列产生器,循环产生如下序列:0010_1101_11.

当然你可以用状态机写,但是更好的办法是:

循环左移,输出高位。

  1. module seq_gen(
  2. input clk,
  3. input rst_n,
  4. output reg q
  5. );
  6. reg q_r;
  7. always@(posedge clk or negedge rst_n) begin
  8. if(~rst_n) begin
  9. q <= 0;
  10. q_r <= 10'b0010_1101_11;
  11. end
  12. else begin
  13. q <= q_r[9];
  14. q_r <= { q_r[8:0], q_r[9] };
  15. end
  16. end
  17. endmodule

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/988974
推荐阅读
相关标签
  

闽ICP备14008679号