Verilog之4bit加减法器的设计并实现
目录
1 设计内容
2 设计思路
2.1设计的原理以及注意事项
2.2设计方案
3 代码实现
4 仿真结果
5 实物结果
6 总结
1 设计内容
设计一个加减法器,根据运算选择开关,对两个4比特数进行加法或减法运算,结果用十进制
方式显示在在数码管上。编写代码仿真实现以及在完成下载,在硬件操作实现。
2 设计思路
2.1设计的原理以及注意事项
(1)时序逻辑电路:
数字电路根据逻辑功能的不同特点,可以分成两大类,一类叫组合逻辑电路,简称组合电路,
另一类叫做时序逻辑电路,简称时序电路。组合逻辑电路在逻辑功能上的特点是任意时刻的输出仅
仅取决于该时刻的输入,与电路原来的状态无关。而时序逻辑电路在逻辑功能上的特点是任意时刻
的输出不仅取决于当时的输入信号,而且还取决于电路原来的状态,或者说,还与以前的输入有
关。常见的时序逻辑电路有触发器、计数器、寄存器等。
(2) 三种逻辑器件
(a)计数器
一般来说,计数器主要由触发器组成,用以统计输入计数脉冲CP的个数,计数器的输出通常为现在
状态的函数。
(b)寄存器
寄存器是存放数码、运算结果或指令的电路,移位寄存器不但可存放数码,而且在移位脉冲作用
下,寄存器中的数码可根据需要向左或向右移位。寄存器和移位寄存器是数字系统和计算机中常用
的基本逻辑部件,应用很广。
(c) 顺序脉冲发生器,
顺序脉冲是指在每个循环周期内,在时间上按一定先后顺序排列的脉冲信号。产生顺序脉冲信号
的电路称为顺序脉冲发生器。在数字系统中,常用以控制某些设备按照事先规定的顺序进行运算或
操作。
(3)设计的注意事项
(a)区分同步复位和异步复位;
(b) 避免对时钟进行逻辑操作后作为触发信号 不建议使用门控时钟和组合逻辑时钟,易产生毛
刺, 发生误动作,建议使用触发器的使能端,不增加资源。
(c)慎重对计数器进行译码和避免多驱动问题
(d)多时钟的同步化。
(4)数码管显示
按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光
二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接
到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平
时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极的数码管,
共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平
时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。本次实验,使用的是共阳
数码管。
(5)开发平台
FPGA:Xilinx公司的 Spartan-3 DSP系列 XC3SD1800A ,接口众多,与本课程相关的接口
有:8个拨档开关 、8个按键开关、8个LED灯以及8个七段数码管等,这是本次实验的硬件设施。
2.2设计方案
(1)输入方面
本次实验,由于是两个4比特数进行加法或减法运算,则需要8个拨挡开关;另外还需要一个选
项开关,用来作为加减法的选择;另外还需要一个时钟,用来实现计数的作用,方便后续实验操
作;
(2)输出方面
本次实验,需要把运算的结果显示在数码管上,则就需要位选数码管和段选数码管。
输入输出的定义r如下:
(3)模块划分
本次实验的代码实现,总共包括四个模块:时钟计数、选择位选数码管、数码管与十位和个
位对应以及数码管显示模块;
(a) 时钟计数模块
本人在这个模块,主要是实现脉冲计数功能(上升沿计数),计数的作用可以用来实现选择
位选数码管;另外,在这个模块,本人还实现了数据的加法或者减法运算(如果选择开关有
效,进行减法运算,否则,进行加法运算),并且得到了十位与个位的数字,方便后续的显
示操作;
计数与减法操作如下:
加法操作如下:
(b)选择位选数码管模块
由于本次实验的输出只需要两位,因此本人把计数的最后两位用来实现选择位选数码管;
(c)数码管与十位和个位对应模块
第二个模块得到了位选数码管,接下来需要把模块一中得到的十位和个位数字与位选数码管
对应。
(d)数码管显示模块
最后,在数码管上显示数字即可;
3 代码实现
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 15:57:17 12/03/2021
// Design Name:
// Module Name: add_3
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module add_jian_4(a1,a2,y,s,choose,clk //a3);
input [3:0] a1;//输入
input [3:0] a2;//输入
input choose;//选择开关
input clk;
output [7:0] y;//段选,个位输出
output [7:0]s;//位选//output [5:0] a3;//仿真是时使用reg [7:0] y;
reg [7:0] s;
reg [4:0]ge;
reg [4:0]shi;
reg [4:0]data;
reg [15:0] cnt_scan;//扫频计数器
//reg [4:0] a3;//仿真是时使用
//parameter Time=26'd500;仿真是时使用,较少时间
//第一个模块,扫频计数和获取结果的十位和个位
always @ (posedge clk)begin// if(cnt_scan<Time)仿真时使用cnt_scan<=cnt_scan+1'b1;//else//cnt_scan<=0;if(choose)//做减法beginif(a1-a2>=10)//如果两个数的差值大于10beginge=a1-a2-10;shi=1;//a3=a1-a2;endelse //两个数的差值小于10beginge=a1-a2;shi=0;//a3=a1-a2;endend else//做加法beginif(a1+a2>=30)//如果两个数之和大于或者等于30beginge=a1+a2-30;shi=3;//a3=a1+a2;endelse if(a1+a2>=20)//如果两个数之和大于或者等于20beginge=a1+a2-20;shi=2;//a3=a1+a2;endelse if(a1+a2>=10) //如果两个数之和大于或者等于10beginge=a1+a2-10;shi=1;//a3=a1+a2;end else //如果两个数之和小于10beginge=a1+a2;shi=0;//a3=a1+a2;end endend
//第二个模块,获取位选数码管always @(cnt_scan)begincase(cnt_scan[15:14])2'b00:s=8'b1111_1110;//位选数码管选择最后一位,后面用来显示个位2'b01:s=8'b1111_1101;//位选数码管选择倒数第二位,后面用来显示十位;default:s=8'b1111_1111;//出错,不显示endcaseend//第三个模块,位选数码管与十位和个位对应always @ (s)begincase(s)8'b1111_1101:data=shi;//位选数码管下选择倒数第二位,显示十位数字8'b1111_1110:data=ge;//位选数码管下选择倒数第一位,显示个位数字default:data=0;//endcaseend//第四个模块,结果显示在数码管上always @(data)begincase(data)0:y=8'b0000_0011;//01:y=8'b1111_0011;//12:y=8'b0010_0101;3:y=8'b0000_1101;4:y=8'b1001_1001;5:y=8'b0100_1001;6:y=8'b0100_0001;7:y=8'b0001_1111;8:y=8'b0000_0001;9:y=8'b0000_1001;//9default: y=8'b1111_1111;//出错,不显示endcaseendendmodule
仿真代码:
`timescale 1ns / 1ps// Company:
// Engineer:
//
// Create Date: 16:55:43 12/25/2021
// Design Name: add_jian_4
// Module Name: C:/Users/Admin_April/Desktop/123/my_verilog_program/mytask/add_jian_4bit/test_4bit.v
// Project Name: add_jian_4bit
// Target Device:
// Tool versions:
// Description:
//
// Verilog Test Fixture created by ISE for module: add_jian_4
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// module test_4bit;// Inputsreg [3:0] a1;reg [3:0] a2;reg choose;reg clk;// Outputswire [7:0] y;wire [7:0] s;wire [4:0] a3;// Instantiate the Unit Under Test (UUT)add_jian_4 uut (.a1(a1), .a2(a2), .y(y), .s(s), .choose(choose), .clk(clk), .a3(a3));
always #10 clk=~clk;initial begin// Initialize Inputs//12+1=13a1 = 1;a2 = 12;choose = 0;clk = 0;#1000;// Wait 100 ns for global reset to finish//12+12=24a1 = 12;a2 = 12;choose = 0;clk = 0;#1000;// Wait 100 ns for global reset to finish//12-1=11a1 = 12;a2 = 1;choose = 1;#1000;// Wait 100 ns for global reset to finish//12-10=2a1 = 12;a2 = 10;choose = 1;#1000;// Wait 100 ns for global reset to finish//15+15=30a1 = 15;a2 = 15;choose = 0;#1000;// Wait 100 ns for global reset to finish//15-10=5a1 = 15;a2 = 10;choose = 1;endendmodule
管脚约束:
#位选数码管
NET"s[0]"LOC="AC19";
NET"s[1]"LOC="AD20";
NET"s[2]"LOC="AD17";
NET"s[3]"LOC="AF25";
NET"s[4]"LOC="Y17";
NET"s[5]"LOC="V17";
NET"s[6]"LOC="V16";
NET"s[7]"LOC="AA18";#段选数码管
NET"y[7]"LOC="AE21";
NET"y[6]"LOC="AC21";
NET"y[5]"LOC="AD22";
NET"y[4]"LOC="AA17";
NET"y[3]"LOC="AB18";
NET"y[2]"LOC="AD21";
NET"y[1]"LOC="AC20";
NET"y[0]"LOC="AE25";#第一个数
NET"a1[3]"LOC="AC17";
NET"a1[2]"LOC="AF15";
NET"a1[1]"LOC="AF17";
NET"a1[0]"LOC="AC18";#第二个数
NET"a2[3]"LOC="Y11";
NET"a2[2]"LOC="AD9";
NET"a2[1]"LOC="AD10";
NET"a2[0]"LOC="AC10";#clk
NET"clk"LOC="P23";#choose
NET"choose"LOC="B26";
4 仿真结果
(1)12+1=13
(2)12+12=24
(3)12-1=11
(4)12-10=2
(5)15+15=30
(6)15-10=5
5 实物结果
(1)12+1=13
(2)12+12=24
(3)12-1=10
(4)15+15=30
(5)15-10=5
6 总结
通过本次实验,完成了实验的预期要求,设计实现了一个加减法器,根据运算选择开关,对两
个4比特数进行加法或减法运算,结果用十进制方式显示在在数码管上。
Verilog之4bit加减法器的设计并实现相关推荐
- (100)Verilog HDL:UART波特率设计
(100)Verilog HDL:UART波特率设计 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL:UART波特率设计 5)结语 1.2 FPG ...
- (99)Verilog HDL:呼吸灯设计
(99)Verilog HDL:呼吸灯设计 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL:呼吸灯设计 5)结语 1.2 FPGA简介 FPGA( ...
- (98)Verilog HDL:流水灯设计
(98)Verilog HDL:流水灯设计 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL:流水灯设计 5)结语 1.2 FPGA简介 FPGA( ...
- (97)Verilog HDL:秒灯设计
(97)Verilog HDL:秒灯设计 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL:秒灯设计 5)结语 1.2 FPGA简介 FPGA(Fi ...
- (87)Verilog HDL:七分频设计
(87)Verilog HDL:七分频设计 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL:七分频设计 5)结语 1.2 FPGA简介 FPGA( ...
- (86)Verilog HDL:三分频设计
(86)Verilog HDL:三分频设计 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL:三分频设计 5)结语 1.2 FPGA简介 FPGA( ...
- (55)Verilog HDL双沿采样设计
(55)Verilog HDL双沿采样设计 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL双沿采样设计 5)结语 1.2 FPGA简介 FPGA( ...
- (42)Verilog HDL 打两拍设计
(42)Verilog HDL 打两拍设计 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL 打两拍设计 5)结语 1.2 FPGA简介 FPGA( ...
- Verilog时序逻辑硬件建模设计(四)移位寄存器
Verilog时序逻辑硬件建模设计(四)移位寄存器 -Shift Register 没有任何寄存器逻辑,RTL设计是不完整的.RTL是寄存器传输级或逻辑,用于描述依赖于当前输入和过去输出的数字逻辑. ...
最新文章
- Java volatile 的测试(Java代码实战-004)
- ios cpu指令架构
- 【Java面试题】39 Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?...
- python requests 10041报错_Python-Requests1-批量登录获取uid
- HTML--注册页面案例
- template might not exist or might not be accessible by any of the configured
- select 设置发送超时发送注意事项
- CSDN Markdown编辑器帮助文档
- python绘制四边形_python shapely.geometry.polygon任意两个四边形的IOU计算实例
- ENS与Cloudflare合作推出改进的ETH.LINK服务
- SpringSecurity-1-前言,登录原理
- 90 行代码,15 个元素教你如何实现无限滚动!
- C++中this指针小记
- matlab java mac_macOS Mojave上Matlab 2018a与Java的联合编程
- ios 团购信息客户端demo(二)
- c语言指针详解pdf下载,C语言指针详解.pdf
- nginx location正则匹配规则
- 安装ubuntu20.04无法连接wifi问题
- 帝国cms没有标题图片就显示默认图片
- net start mysql提示服务没有响应控制功能——解决办法