当前位置:   article > 正文

FPGA面试笔试专题——一些基础电路设计_fpga基本电路设计

fpga基本电路设计

 

1、全加器设计

全加器考虑进位输入与进位输出,以4位全加器为例:

  1. module full_add(
  2. input rst_n,
  3. input clk,
  4. input [3:0]a,
  5. input [3:0]b,
  6. input cin,
  7. output reg [3:0]sum,
  8. output reg cout
  9. );
  10. always@(posedge clk or negedge rst_n)
  11. begin
  12. if(!rst_n)
  13. begin
  14. {cout,sum} <= 5'b0;
  15. end
  16. else
  17. begin
  18. {cout,sum} <= a+b+cin;
  19. end
  20. end
  21. endmodule

2、4选1数据选择器

按照组合逻辑实现,可以使用case语句(应注意case的语法):

  1. module choose41(
  2. input a1,
  3. input a2,
  4. input a3,
  5. input a4,
  6. input [1:0]sel,
  7. output reg c
  8. );
  9. always@(*)
  10. begin
  11. case(sel)
  12. 2'b00:begin
  13. c = a1;
  14. end
  15. 2'b01:begin
  16. c = a2;
  17. end
  18. 2'b10:begin
  19. c = a3;
  20. end
  21. 2'b11:begin
  22. c = a4;
  23. end
  24. default:begin
  25. c = a1;
  26. end
  27. end

3 、译码器

译码器将输入编码转换为对应输出,以3_8译码器为例:

  1. module decode3_8(
  2. input en,
  3. input [2:0]code,
  4. output reg[7:0]state,
  5. );
  6. always@(*)
  7. begin
  8. if(!en)
  9. begin
  10. state <= 8'd0;
  11. end
  12. else
  13. begin
  14. case(code)
  15. 3'b000:begin
  16. state = 8'b0000_0001;
  17. end
  18. 3'b001:begin
  19. state = 8'b0000_0010;
  20. end
  21. 3'b010:begin
  22. state = 8'b0000_0100;
  23. end
  24. 3'b011:begin
  25. state = 8'b0000_1000;
  26. end
  27. 3'b100:begin
  28. state = 8'b0001_0000;
  29. end
  30. 3'b101:begin
  31. state = 8'b0010_0000;
  32. end
  33. 3'b110:begin
  34. state = 8'b0100_0000;
  35. end
  36. 3'b111:begin
  37. state = 8'b1000_0000;
  38. end
  39. default:begin
  40. state = 8'b0000_0000;
  41. end
  42. endcase
  43. end
  44. end
  45. endmodule

4、计数器

计数器比较简单,此处重点在于回顾parameter的使用;设计一个模值任意的计数器;

  1. module cnt
  2. #(parameter W = 4,C = 2<<(W-1))
  3. (
  4. input clk,
  5. input rst_n,
  6. output reg[C-1:0]cnt
  7. );
  8. always@(posedge clk or negedge rst_n)
  9. begin
  10. if(!rst_n)
  11. begin
  12. cnt <= W'd0;
  13. end
  14. else
  15. begin
  16. if(cnt==C-1)
  17. begin
  18. cnt <= W'd0;
  19. end
  20. else
  21. begin
  22. cnt <= cnt+1'b1;
  23. end
  24. end
  25. end
  26. endmodule

5、模为60的BCD码计数器

BCD码计数器与普通2进制计数器不同,

  1. module cntBCD_60(
  2. input clk,
  3. input rst_n,
  4. output reg [7:0]cnt
  5. );
  6. always@(posedge clk or negedge rst_n)
  7. begin
  8. if(!rst_n)
  9. begin
  10. cnt <= 8'd0;
  11. end
  12. else
  13. begin
  14. if(cnt[3:0]==4'd9)
  15. begin
  16. cnt[3:0] <= 4'd0;
  17. if(cnt[7:4]==4'd5)
  18. begin
  19. cnt[7:4] <= 4'd0;
  20. end
  21. else
  22. begin
  23. cnt[7:4] <= cnt[7:4]+1'b1;
  24. end
  25. end
  26. else
  27. begin
  28. cnt[3:0] <= cnt[3:0]+1'b1;
  29. end
  30. end
  31. end
  32. endmodule

6、两数乘法

乘法的本质就是移位,因此可以通过循环移位与求和实现,以8位数相乘为例:

  1. module multy(
  2. input [7:0]a,
  3. input [7:0]b,
  4. output [15:0]c
  5. );
  6. integer i;
  7. always@(*)
  8. begin
  9. c = 16'd0;
  10. for(i=0;i<8;i=i+1)
  11. begin
  12. if(a[i]) c = c + (a<<i);
  13. end
  14. end
  15. endmodule

应注意:

  • 输出的位宽为输入之和
  • for循环必须在always块中
  • for()中为;而不是,

用repeat应该也能实现相同功能:

  1. module multy(
  2. input [7:0]a,
  3. input [7:0]b,
  4. output [15:0]c
  5. );
  6. integer i;
  7. always@(*)
  8. begin
  9. c = 16'd0;
  10. i = 0;
  11. repeat(8)
  12. begin
  13. if(a[i]) c = c + (a<<i);
  14. i = i+1;
  15. end
  16. end
  17. endmodule

7、调用门元件实现4选1 MUX

调用门原件实现电路,实际上就是结构化描述电路(数据流、行为级抽象层次更高,不关心具体电路实现)

  1. module Mux4_1(
  2. input a,
  3. input b,
  4. input c,
  5. input d,
  6. input sel1,
  7. input sel0,
  8. output out
  9. );
  10. wire a1,b1,c1,d1;
  11. wire sel1_n,sel0_n;
  12. NOT (sel1_n,sel1);
  13. NOT (sel0_n,sel0);
  14. AND (a1,sel1_n,sel0_n,a);
  15. AND (b1,sel1_n,sel0,b);
  16. AND (c1,sel1,sel0_n,c);
  17. AND (d1,sel1,sel0,d);
  18. OR (out,a1,b1,c1,d1);
  19. endmodule

其行为级描述为:

 assign out = (a & ~cont1 & ~cont2)| (b & ~cont1 & cont2)| (c & cont1 & ~cont2)| (d & cont1 & cont2);  

8、环形计数器

环形计数器实际就是循环右移寄存器,因此N位环形计数器有N个状态(N位计数);

以8位环形计数器为例:

  1. module hcnt(
  2. input rst_n,
  3. input clk,
  4. output reg [7:0]out
  5. );
  6. always@(posedge clk or negedge rst_n)
  7. begin
  8. if(!rst_n)
  9. out <= 8'd0;
  10. else
  11. out <= {out[0],out[7:1]};
  12. end
  13. endmodule

9、扭环形计数器

环形计数器也是由循环右移寄存器构成,与环形计数器不同的是最低位取反后移到最高位,因此N位环形计数器有2N个状态(2N位计数);

以8位扭环形计数器为例:

  1. module ncnt(
  2. input rst_n,
  3. input clk,
  4. output reg [7:0]out
  5. );
  6. always@(posedge clk or negedge rst_n)
  7. begin
  8. if(!rst_n)
  9. out <= 8'd0;
  10. else
  11. out <= {~out[0],out[7:1]};
  12. end
  13. endmodule

10、使用一个二选一MUX和一个INV实现异或

由异或逻辑可以知道,out = ~a&b + a&~b;

即:a=0时,out = b;

a=1时,out = ~b;

因此电路可以设计为:

assign out = a?~b:b;

其中,a作为MUX的选择信号,b与~b(INV实现)作为MUX输入。

11、利用4选1实现F(x,y,z)=xz+yz'  

从真值表入手:

 xy=00xy=01xy=10xy=11
z=00101
z=10011

进一步化简:

 xy=00xy=01xy=10xy=11
out0~zz

1

可以看出4选1实现逻辑:

  1. always@(*)
  2. begin
  3. case({x,y})
  4. 2'b00:begin
  5. out = 1'b0;
  6. end
  7. 2'b01:begin
  8. out = ~z;
  9. end
  10. 2'b10:begin
  11. out = z;
  12. end
  13. 2'b11:begin
  14. out = 1'b1;
  15. end
  16. default:begin
  17. out = 1'b0;
  18. end
  19. endcase
  20. end

12、利用D触发器实现2分频

 

 

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

闽ICP备14008679号