模可变计数器(加减可控)的VerilogHDL程序

合集下载

用Verilog HDL语言编写的四位超前进位加法器

用Verilog  HDL语言编写的四位超前进位加法器
四Байду номын сангаас超前进位加法器
——Verilog HDL语言
四位超前进位加法器的进位是并 行同时产生的,能够极大的减 少加法器由进位引起的延时。 增加了逻辑器件,但有效的减 少的延迟。进位是由ALU部件超 前算出,本位是由四个不含进 位的加法器算出。
Verilog HDL代码如下: module jiafaqi_4(x,y,c0,c4,f); //四位超前进位加法器 input [4:1]x; //四位x值 input [4:1]y; //四位y值 output [4:1]f; //四位加和f input c0; //上一的级进位 output c4; //向下一级的进位 wire [3:1]c; //超前进位 wire [4:1]p; wire [4:1]g; wire [4:1]cd; assign p=x|y; assign g=x&y;
module jiafaqi_1(x,y,c0,f); //一位加法器模块 input x; input y; input c0; output f; assign f=(x^y)^c0; endmodule //该一位加法器只有本位输出,不含向下一级 的进位输出,进位输出是由顶层模块的并 行超前进位提供
// 在BASYS2开发板上的管脚配置 NET "c4" LOC = N5; NET "c0" LOC = A7; NET "x[1]" LOC = P11; NET "x[2]" LOC = L3; NET "x[3]" LOC = K3; NET "x[4]" LOC = B4; NET "y[1]" LOC = G3; NET "y[2]" LOC = F3; NET "y[3]" LOC = E2; NET "y[4]" LOC = N3; NET "f[1]" LOC = M5; NET "f[2]" LOC = M11; NET "f[3]" LOC = P7; NET "f[4]" LOC = P6;

Verilog HDL《数字加法器》报告

Verilog HDL《数字加法器》报告

实验三数字加法器的设计一、实验目的1. 掌握数字加法器的工作原理和逻辑功能。

2. 熟悉ISE集成开发环境。

3. 熟悉ISE中进行开发设计的流程。

二、实验环境1. 装有ModelSim和ISE的计算机。

2. Sword实验系统。

三、实验任务1. 用VerilogHDL语言设计实现4位串行数字加法器和4位并行加法器,在ModelSim上仿真实现。

2. 生成FPGA设计文件,下载到Sword实验系统上验证电路功能。

四、实验原理与实验步骤1. 实验原理数字加法器是一种较为常用的逻辑运算器件,被广泛用于计算机、通信和多媒体数字集成电路中。

广义的加法器包括加法器和减法器,在实际系统中加法器输入通常采用补码形式。

此次实验仅考虑加法运算,分别完成4位的串行进位加法器设计和4位的并行进位加法器设计。

(1) 1 bit全加器最简单的一位全加器的结构,设定两个二进制数字Ai ,Bi和一个进位输入C i 相加,产生一个和输出Si,以及一个进位输出Ci+1。

Si= Ai⊕Bi⊕CiCi+1= AiBi+BiCi+CiAi= AiBi+﹙Ai⊕Bi﹚Ci(2) 4位串行进位加法器n位串行进位全加器原理示意图(3) 4位并行进位加法器超前进位加法器是一种高速加法器,每级进位由附加的组合电路产生,高位的运算不需等待低位运算完成,因此可以提高运算速度。

各级进位信号表达式的推导过程Ci+1 = AiBi+(Ai⊕Bi)Ci设: Gi = AiBiPi= Ai⊕Bi则有: Si = Pi⊕CiCi+1= Gi+PiCi4位并行进位的逻辑表达式为: CC 1= G+PCC 2= G1+P1C1= G1+ P1(G+PC)= G1+ GP1+PP1CC 3= G2+P2C2= G2+ P2(G1+GP1+PP1C)= G2+ G1P2+GP1P2+PP1P2CC 4= G3+P3C3=G3+ P3(G2+…+PP1P2C)= G3+G2P3+G1P2P3+GP1P2P3+PP1P2P3C2. 实验步骤(1)用连续赋值语句实现4位串行进位的全加器,并完成modelsim下的功能仿真。

verilog三位加法器代码

verilog三位加法器代码

verilog三位加法器代码
下面是一个使用Verilog语言编写的三位加法器的代码示例: verilog.
module three_bit_adder(。

input wire a,。

input wire b,。

input wire cin,。

output wire sum,。

output wire cout.
);
assign sum = a ^ b ^ cin;
assign cout = (a & b) | (cin & (a ^ b));
endmodule.
在这个代码中,`three_bit_adder`模块定义了一个三位加法器。

它有三个输入信号 `a`、`b`和`cin`,分别代表两个加数和进位输入。

还有两个输出信号 `sum`和`cout`,分别代表和的结果和进位
输出。

在模块内部,使用`assign`语句对`sum`和`cout`进行赋值。

`sum`的值通过异或门(`^`)计算得出,即三个输入信号的异或结果。

`cout`的值通过与门(`&`)和或门(`|`)的组合计算得出,
具体逻辑为,如果两个输入信号 `a` 和 `b` 同时为1,或者进位
输入信号 `cin` 为1 且 `a` 与 `b` 不相等,则进位输出 `cout` 为1,否则为0。

这个Verilog代码实现了一个简单的三位加法器,可以用于对
三位二进制数进行加法运算。

模可变16位加法计数器

模可变16位加法计数器

《EDA设计》报告题目:模可变16位加法计数器设计专业班级:学生姓名:指导教师:武汉理工大学信息工程学院2014 年 1 月 6 日课程设计任务书学生姓名:专业班级:指导教师:工作单位:信息工程学院题目: 模可变16位加法计数器设计初始条件:可用仪器: PC机(Quartus II软件)硬件:EDA-IV型实验箱。

要求完成的主要任务:(1)设计任务设计一个模可变16位加法计数器。

(2)设计指导设计可变16位加法计数器,可通过3个选择位M2、M1、M0实现最多8种不同模式的计数方式,例如可构成5、10、16、46、100、128、200、256进制,共8种计数模式。

(3)时间安排:2013.12.23 课程设计任务布置、选题、查阅资料2013.12.24 设计,软件编程、仿真和调试2013.12.29 实验室检查仿真结果,验证设计的可行性和正确性2013.12.30 设计的硬件调试2014.01.05 机房检查设计成果,提交设计说明书及答辩指导教师签名:年月日系主任(或责任教师)签名:年月日目录摘要 (I)Abstract........................................................... I I1 绪论 (1)2 Quartus II简介 (2)3 计数器的工作原理 (3)4 设计原理 (4)4.1 整体设计原理 (4)4.2 单元模块的设计 (5)4.3 顶层模块(整体电子线路系统)的设计 (8)5 电路系统的功能仿真 (10)6 硬件调试 (12)7 个人小结 (14)参考文献 (15)摘要计数器是数字电子技术中应用的最多的时序逻辑电路。

计数器不仅能用于对时钟脉冲计数,还可以用于分频、定时、产生节拍脉冲和脉冲序列以及进行数字运算等。

但是并无法显示计算结果,一般都是要通过外接LCD 或LED屏才能显示。

计数器的种类按照计数器中的触发器是否同时翻转分类,可将计数器分为同步计数器和异步计数器两种,如果按照计数过程中数字增减分类,又可将计数器分为加法计数器、减法计数器和可逆计数器,随时钟信号不断增加的为加法计数器,不断减少的为减法计数器,可增可减的叫做可逆计数器,另外还有很多种分类不一一列举,但是最常用的是第一种分类,因为这种分类可以使人一目了然,知道这个计数器到底是什么触发方式,以便于设计者进行电路的设计。

verilog 加法

verilog 加法

verilog 加法摘要:1.Verilog 简介2.Verilog 加法实现的基本原理3.Verilog 加法实现的具体方法4.Verilog 加法实现的实例5.总结正文:【1.Verilog 简介】Verilog 是一种硬件描述语言,主要用于数字系统硬件的描述、模拟和验证。

它的语法简单易学,与C 语言相似,广泛应用于数字电路、模拟电路和混合信号电路的设计与验证。

【2.Verilog 加法实现的基本原理】Verilog 加法实现的基本原理是通过逻辑门实现。

逻辑门是数字电路的基本组件,常见的有与门、或门、非门等。

通过组合这些逻辑门,可以实现各种复杂的逻辑功能,如加法。

【3.Verilog 加法实现的具体方法】在Verilog 中,可以通过两种方法实现加法:全加器和数据流。

(1) 全加器:全加器是一种硬件电路,用于实现两个二进制数的加法运算。

它包含两个输入端(A 和B)、一个输出端(S)和两个进位输入端(C_in 和C_out)。

在Verilog 中,可以通过如下代码实现全加器:```verilogmodule full_adder(input A, input B, input C_in, output S, outputC_out);assign S = A ^ B ^ C_in;assign C_out = (A & B) | (A & C_in) | (B & C_in);endmodule```(2) 数据流:数据流是一种基于数据流图的数字电路设计方法,可以用于描述数字系统的数据处理过程。

在Verilog 中,可以通过如下代码实现数据流加法:```verilogmodule adder_dataflow(input A, input B, output S);reg [15:0] sum;always @(*) beginsum = A + B;S = sum[15];endendmodule```【4.Verilog 加法实现的实例】以下是一个使用全加器的Verilog 加法实现实例:```verilogmodule adder_4bit(input A, input B, input C_in, output S, outputC_out);wire c1, c2, c3;full_adder FA0(A[0], B[0], C_in, S[0], c1);full_adder FA1(A[1], B[1], c1, S[1], c2);full_adder FA2(A[2], B[2], c2, S[2], c3);full_adder FA3(A[3], B[3], c3, S[3], C_out);endmodule```【5.总结】通过Verilog 实现加法,可以采用全加器和数据流两种方法。

Verilog实现加减乘除计算器

Verilog实现加减乘除计算器

Verilog实现加减乘除计算器主要内容: 1. 按键按下后,进⾏加减乘除操作 2. Verilog往TXT⽂本⽂件中写⼊数据 3. 完成计算模块 4. 最终实现加减乘除计算器1. 实现按键按下后,选择option,进⾏加减乘除操作,除法计算结果为商&余数module jsq(clk,rst_n,key,option,x,y,result,quotient,remainder);parameter N = 16; // 输⼊数的位数input clk; // 输⼊时钟input rst_n; // 低电平有效的复位(清零)input key;input [1:0]option;input [N-1:0] x;input [N-1:0] y;output [2*N-1:0] result;output [N-1:0] quotient; //输出计算的商output [N-1:0] remainder; //输出计算的余数reg [2*N-1:0] result_r;reg [N-1:0] quotient_r,remainder_r;always @ (posedge clk or negedge rst_n)beginif (!rst_n)beginresult_r <= 1'b0;quotient_r <= 1'b0;remainder_r <= 1'b0;endelsebeginif (key == 1'b0)begin//按键按下case(option)2'b00: result_r = x + y;2'b01: result_r <= x + (~y + 1'b1);2'b10: result_r = x * y;2'b11: //result_r = x / y;beginquotient_r = x / y;remainder_r = x % y;endendcaseendelsebegin// 按键释放result_r <= 1'b0;quotient_r <= 1'b0;remainder_r <= 1'b0;endendendassign result = result_r ;assign quotient= quotient_r;assign remainder = remainder_r;endmoduleView Code`timescale 1ns/1ps`define clock_period 20module jsq_tb;reg clk;reg rst_n;reg key;reg [1:0]option;reg [15:0] x,y;wire [31:0] result;wire [15:0] quotient;wire [15:0] remainder;initial beginclk = 1'b1;rst_n = 1'b0;key = 1'b1; // 复位时,按键释放# 20//复位20nsrst_n = 1'b1;# 20key = 1'b0;option = 2'b10;# 100key = 1'b1;# 20key = 1'b0;option = 2'b11;# 100// key = 1'b1;// # 20$stop;endalways #(`clock_period/2) clk = ~clk; //50Mjsq #(.N(16)) jsq_0(.clk(clk),.rst_n(rst_n),.key(key),.option(option),.x(x),.y(y),.result(result),.quotient(quotient),.remainder(remainder));initial beginx = 0;repeat(20)#(`clock_period) x = {$random}%100; //通过位拼接操作{}产⽣0—59范围的随机数endinitial beginy = 0;repeat(20)#(`clock_period) y = {$random}%50;end/*integer i;initial beginx = 0;y = 0;for(i = 0; i < 20; i = i + 1)begin//利⽤$random系统函数产⽣随机数。

基于Verilog的任意模长可加减计数器设计

基于Verilog的任意模长可加减计数器设计

基于Verilog 的任意模长可加减计数器设计一、设计要求计数器是一种在时钟的触发下,完成计数功能的时序逻辑电路,输出结果由输入时钟和计数器上一状态的计数共同决定。

本设计要求实现的计数器,具有以下功能:(1)要求实现计数器工作状态的控制;(2)要求实现计数器的异步清零功能;(3)要求实现计数器递增和递减的功能;(4)要求实现计数器的计数范围(模长)任意改变;二、设计思路计数器工作状态的控制,可以设计一个使能端,在外部时钟的触发下,只有当使能端信号有效(高电平),才启动计数器的计数功能(递增或递减),否则计数器输出结果不变。

计数器的异步清零功能,可以设计一个外部输入的清零端,在外部输入信号有效(低电平)的情况下,直接清零计数器,不用等待下一个外部时钟的触发,即计数器的清零是异步的。

计数器计数方向的控制,设计一个加减可控的信号端口,在时钟的触发、异步清零无效以及计数器使能端有效的情况下,该输入端为高电平则计数器完成递增功能,低电平则完成递减功能。

实现计数器的任意模长,即进入下一个计数周期,其计数的最大值可以发生变化。

设计一个4位(最大模长为16)的输入端口,可以在当前计数周期结束,即计数器产生一个溢出信号的同时,判断该端口输入的信号是否发生变化,通过相邻两个计数周期的端口数据作异或运算,结果为高电平则代表模长发生变化,即进入的下一个计数周期,其计数最大值要发生变化。

三、程序设计本次设计使用的是Quartus 11.0开发环境,该软件没有自带仿真功能(9.0版本以后都没自带),需要使用第三方的Modelsim软件,故本设计的程序包括计数器的Verilog设计以及仿真测试需要的testbench激励文件两部分。

计数器的Verilog设计:module Prj(clk,rst_input,en,add_sub,data_input,full,data_output);input clk; // 外部时钟input rst_input; // 外部清零(异步)input en; // 计数使能input add_sub; // 计数方向input [3:0] data_input; // 计数器模长输入output reg full; // 计完当前模长output [3:0] data_output; // 计数器输出reg [3:0] current_counter;// 当前计数值(输出)reg update_length_en; // 改变模长的使能信号// 当前计数周期与上个计数周期的模长输入reg [3:0] current_clk_data_input,last_clk_data_in put;reg [3:0] counter_length; // 下个计数周期的模长reg [1:0] k;always @(posedge clk,negedge rst_input) beginif(!rst_input) // 异步清零beginfull=0;current_counter=0;endelse if(en) // 计数使能beginif(add_sub) // 加法器beginif(current_counter<(counter_length-1))begincurrent_counter=current_counter+1;full=0;endelse// 加法器计数完产生full脉冲以触发// 判断下个计数周期的模长是否变化begincurrent_counter=0;full=1; //full输出endendelse // 减法器beginif(current_counter>0)begincurrent_counter=current_counter-1;full=0;endelse // 减法器计数完begincurrent_counter=counter_length-1;full=1;endendendend//驱动当前计数输出assign data_output=current_counter;initialbegink=1; // k=1 表示启动计数器的第一个计数周期endalways @(posedge full) // 加法器/减法器完成当前周期计数// 计完当前周期(即full有效)才更新beginlast_clk_data_input<=data_input; // 上个周期的模长current_clk_data_input=data_input;//当前周期的模长update_length_en<=last_clk_data_input^current_clk_data_input;// update_length_en为更新计数器模长的使能端,// 异或运算使能端为0代表模长变化 1不变k=k+1; // k的初值为1,k变化说明计数模长更改过了if(k==2'd3)k=2;endalways @(posedge clk)beginif(update_length_en) // 使能有效计数模长变化counter_length=current_clk_data_input;elsebeginif(k>=2)// 下个周期计数器模长不变(保持上次更改的)counter_length=last_clk_data_input;if(k==1)// 整个计数器系统,最初的模长(一次没更改过)counter_length=data_input;endendendmodule测试激励文件testbench:`timescale 1 ps/ 1 psmodule Prj_vlg_tst();reg add_sub;reg clk;reg [3:0] data_input;reg en;reg rst_input;wire [3:0] data_output;wire full;Prj i1 (.add_sub(add_sub),.clk(clk),.data_input(data_input),.data_output(data_output),.en(en),.full(full),.rst_input(rst_input));parameter clk_period=10; // 时钟周期initial // 初始化使能端、清零端和时钟信号beginen=1;rst_input=1;clk=1;#(46*clk_period) en=0;#(3*clk_period) en=1;#(4*clk_period) rst_input=0;#(2*clk_period) rst_input=1;endalways #(clk_period/2) clk=~clk;initialbegin// 计数器模长分别为6 4 5 3// 左边为上一模长持续的时钟个数data_input=4'b0110;#(22*clk_period) data_input=4'b0100;#(12*clk_period) data_input=4'b0101;#(12*clk_period) data_input=4'b0011;#(5*clk_period);endinitialbegin// 计数器计数方向的改变// 左边为递增递减持续的时钟个数add_sub=1;#(9*clk_period) add_sub=0;#(10*clk_period) add_sub=1;#(13*clk_period) add_sub=0;#(4*clk_period) add_sub=1;endendmodule四、仿真结果如图1所示,最开始计数器输入的模长data_input为6,在计数方向控制端add_sub为高电平的情况下,可以从0计数到5,在add_sub为低电平的情况下,可以实现计数器的递减;当计数器模长data_input变为4的时候,先计完当前周期的模长(0到5),才开始模长为4的计数(0到3)。

基于 Verilog语言的可预置加减计数器的设计

基于 Verilog语言的可预置加减计数器的设计

基于Verilog 语言的可预置加减计数器的设计胡 滨(西安邮电学院 陕西西安 710061)摘 要:计数器是大规模集成电路中运用最广泛的结构之一。

在模拟及数字集成电路设计当中,灵活地选择与使用计数器可以实现很多复杂的功能,可以大量减少电路设计的复杂度和工作量。

讨论了一种可预置加减计数器的设计,运用Verilog HDL 语言设计出了一种同步的可预置加减计数器,该计数器可以根据控制信号分别实现加法计数和减法计数,从给定的预置位开始计数,并给出详细的Verilog HDL 源代码。

最后,设计出了激励代码对其进行仿真验证,实验结果证明该设计符合功能要求,可以实现预定的功能。

关键词:Verilog HDL ;可逆计数器;ModelSim ;可预置加减计数器中图分类号:TN47 文献标识码:B 文章编号:1004373X (2007)1617702Design of R eversible Counter B ased on V erilog H DLHU Bin(Xi ′an University of Post &Telecommunications ,Xi ′an ,710061,China )Abstract :Counter is one of the elements most in use in VL SI design.It has been proved that choosing and using counter properly can solve many complex problems.Discussing the design of a kind of reversible counter ,the study devises a synchro 2nous reversible counter by applying Verilog HDL.The reversible counter can count f rom the given preset data ,the detailed Veriog HDL source code has been given .The counter can add and subtract according to control signals.Finally ,the study devi 2ses stimulate code to its simulation certification.The certification result testifies that the design accord with the f unctional re 2quirements can realize the preconcerted f unction.K eywords :Verilog HDL ;reversible counter ;ModelSim ;preset modified counter收稿日期:20070116 计数器对时钟脉冲进行计数,还被广泛用于定时、分频、以及各种复杂的数字电路中,是计算机中的一个重要器件,是应用最广泛的一种典型的时序电路。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

模可变计数器的VerilogHDL程序
module count(out,reset,clk,e,x,y);
output [7:0]out;//设置8位输出out
input reset,clk,e,x,y;//设置时钟信号clk、清零信号reset、使能端e、控制模端x和y reg [7:0]out;
always @(posedgeclk or negedge reset)
begin
if(reset==0)//异步清零端,不受时钟信号控制,当reset=0时,异步清零
out=9'h000;
else
begin
if(x==0 && y==0)//通过x和y值来改变模,此段代码的模为2
if(e==0)
out=9'h000;
else
if(out>=1)out=9'h000;//计数最大值为1,超过清零
else out=out+1;//计数
if(x==0 && y==1)//此段代码的模为8
if(e==0)
out=9'h000;
else
if(out>=7)out=9'h000;//计数最大值为7,超过清零
else out=out+1; //计数
if(x==1 && y==0)//此段代码的模为10
if(e==0)
out=9'h000;
else
if(out>=9)out=9'h000;//计数最大值为9,超过清零
else out=out+1;//计数
if(x==0 && y==0)//此段代码的模为16
if(e==0)
out=9'h000;
else
if(out>=15)out=9'h000;//计数最大值为15,超过清零
else out=out+1;//计数
end
end
endmodule
模可变计数器(加减可控)的VerilogHDL程序
module count(out,reset,clk,e,x,y,G);//增加G端,控制加法与减法
output [7:0]out;
inputreset,clk,e,x,y,G;
reg [7:0]out;
always @(posedgeclk or negedge reset)
begin
if(reset==0)
out=9'h000;
else
begin
if(G==0)//当G=0时为加法计数器
begin
if(x==0 && y==0)
if(e==0)
out=9'h000;
else
if(out>=1)out=9'h000;
else out=out+1;
if(x==0 && y==1)
if(e==0)
out=9'h000;
else
if(out>=7)out=9'h000;
else out=out+1;
if(x==1 && y==0)
if(e==0)
out=9'h000;
else
if(out>=9)out=9'h000;
else out=out+1;
if(x==0 && y==0)
if(e==0)
out=9'h000;
else
if(out>=15)out=9'h000;
else out=out+1;
end
else//当G=1时为减法计数器begin
if(x==0 && y==0)
if(e==0)
out=9'h000;
else
if(out==0)out=9'd1;
else out=out-1;
if(x==0 && y==1)
if(e==0)
out=9'h000;
else
if(out==0)out=9'd7;
else out=out-1;
if(x==1 && y==0)
if(e==0)
out=9'h000;
else
if(out==0)out=9'd9;
else out=out-1;
if(x==0 && y==0)
if(e==0)
out=9'h000;
else
if(out==0)out=9'd15;
else out=out-1;
end
end
end
endmodule。

相关文档
最新文档