当前位置:   article > 正文

【FPGA】Verilog:模块化组合逻辑电路设计 | 半加器 | 全加器 | 串行加法器 | 子模块 | 主模块_模块化电路

模块化电路

前言:本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载

示例:加法器

 

  • 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片 
  • 配置方式:USB-JTAG/SPI Flash
  • 高达100MHz 的内部时钟速度 
  • 存储器:2Mbit SRAM   N25Q064A SPI Flash(样图旧款为N25Q032A)
  • 通用IO:Switch :x8LED:x16Button:x5DIP:x8   通用扩展IO:32pin
  • 音视频/显示: 7段数码管:x8 VGA视频输出接口 Audio音频接口 
  • 通信接口:UART:USB转UART   Bluetooth:蓝牙模块 
  • 模拟接口: DAC:8-bit分辨率   XADC:2路12bit 1Msps ADC

目录

Ⅰ.前置知识

 0x00 半加器

 0x01 全加器

Ⅱ. Verilog实现 

 0x00 注意事项

 0x01 一位全加器

 0x02 串行加法器


Ⅰ.前置知识

 0x00 半加器

能对两个1位二进制数进行相加求和及进位的逻辑电路称为半加器。或:只考虑两个一位二进制数的相加,而不考虑来自低位进位数运算电路,称为半加器。

下图为半加器的方框图:     

其中:In1、In2分别为被加数与加数,作为电路的输入端;S为两数相加产生的本位和,它和两数相加产生的向高位的进位C一起作为电路的输出。

根据二进制数相加的原则,得到半加器的真值表如下表:

信号输入

信号输出

In1In2

S

C

0

0

0

0

0

1

1

0

1

0

1

0

1

1

0

1

 0x01 全加器

全加器其实就是考虑到进位的加法器。

全加器输入 

全加器输出 

A

B

Cin

BCDout

Cout

0

0

0

0

0

0

0

1

0

1

0

1

0

0

1

0

1

1

1

0

1

0

0

0

1

1

0

1

1

0

1

1

0

1

0

1

1

1

1

1

真值表:

逻辑表达式:

在这里插入图片描述

 由于两个半加器可以构成一个全加器,所以在这里进位Ci还可以表示为: 

在这里插入图片描述

Ⅱ. Verilog实现 

 0x00 注意事项

本次实验中,涉及到了子模块主模块的编写。

在主模块中(顶层文件),对子模块进行调用,从而满足设计

下面以加法器为示例,介绍子模块和主模块的编写和调用:

1、设计子模块

参考程序:

程序文件一: 

  1. module FA1(input A,input B,input Cin,output reg Cout,output reg S);
  2. always @(A or B or Cin)begin
  3. {Cout,S}=A+B+Cin;
  4. end
  5. endmodule

程序文件二:(选用,自定义)

  1. module UserAND(a,b,z);
  2. input a,b;
  3. output z;
  4. assign z=a&b;
  5. endmodule

以上程序也可自行进行设计修改;

2、设计主模块: (顶层文件)

  1. module EX5_Top(input [1:0] IA,input [1:0] IB,output [1:0] sum,output C );
  2. wire ct;
  3. //子模块的调用,例如其中FA1为子模块名称,FD0FD1为在顶层文件中引用的名称。
  4. FA1 FD0 (.A(IA[0]),.B(IB[0]),.Cin(0),.Cout(ct),.S(sum[0]));
  5. FA1 FD1 (.A(IA[1]),.B(IB[1]),.Cin(ct),.Cout(C),.S(sum[1]));
  6. Endmodule

3、编译文件并查看RTL视图(如图参考)

 0x01 一位全加器

 设计代码:

  1. module ADD_Top(input [1:0] IA,input [1:0] IB,output [1:0] sum,output C );
  2. wire ct;
  3. ADD FD0 (.A(IA[0]),.B(IB[0]),.Cin(0),.Cout(ct),.S(sum[0]));
  4. ADD FD1 (.A(IA[1]),.B(IB[1]),.Cin(ct),.Cout(C),.S(sum[1]));
  5. endmodule
  6. module ADD(input A,input B,input Cin,output reg Cout,output reg S);
  7. always @(A or B or Cin)begin
  8. {Cout,S}=A+B+Cin;
  9. end
  10. endmodule

仿真设计代码:

  1. module sim_ADD_Top( );
  2. reg [1:0] IA;
  3. reg [1:0] IB;
  4. wire [1:0] sum;
  5. wire ct;
  6. ADD_Top uu1(IA,IB,sum,ct);
  7. initial {IA,IB}=4'b0000;
  8. always
  9. #100{IA,IB}={IA,IB}+1;
  10. endmodule

点击Vivado的“Run Simulation”菜单,进入仿真调试模式,可以在仿真输出窗口看到仿真时序波形

波形图:

 0x02 串行加法器

在理解了半加器与全加器的基础上,采用模块化的设计方法,我们可以通过四个全加器来实现四位串行加法器的设计

设计代码:

  1. `timescale 1ns / 1ps
  2. module M_4bit_adder(S,C3,A,B,C_1);
  3. input [3:0] A,B;
  4. input C_1;
  5. output [3:0] S;
  6. output C3;
  7. wire C0,C1,C2;
  8. fulladder u0(S[0],C0,A[0],B[0],C_1);
  9. fulladder u1(S[1],C1,A[1],B[1],C0);
  10. fulladder u2(S[2],C2,A[2],B[2],C1);
  11. fulladder u3(S[3],C3,A[3],B[3],C2);
  12. endmodule
  13. module halfadder(S,C,A,B);
  14. input A,B;
  15. output S,C;
  16. xor(S,A,B);
  17. and(C,A,B);
  18. endmodule
  19. module fulladder(S,C,A,B,Cin);
  20. input A,B,Cin;
  21. output S,C;
  22. wire S1,D1,D2;
  23. halfadder HA1(.S(S1),.C(D1),.A(A),.B(B));
  24. halfadder HA2(.S(S),.C(D2),.A(S1),.B(Cin));
  25. or g1(C,D2,D1);
  26. endmodule

仿真设计代码:

  1. module sim_ADD();
  2. reg [3:0] A,B;
  3. wire [3:0] S;
  4. wire C3;
  5. M_4bit_adder uu1(S,C3,A,B,0);
  6. initial {A,B}=8'b0000_0000;
  7. always
  8. #100 {A,B}={A,B}+1;
  9. endmodule

波形图:

添加硬件约束并连接实验电路板,

参考管脚分配如下:

程序中管脚名 

实际管脚 

说明 

A(0

N4

拨动开关 SW1

A(1

M4

拨动开关 SW2

B(0

R2

拨动开关 SW3

B(1

P2

拨动开关 SW4

SUM(0) 

K2

LED 0

SUM(1) 

J2

LED 1

C

J3

LED 2

实验电路板实现:

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

闽ICP备14008679号