精华内容
下载资源
问答
  • Quartus ii 13.0 与 Verilog实现8位计数器,Modelsim仿真,有testbench。
  • 终于谈到计数器了,呀!在数字系统中,使用得最多的时序电路差不多就是计数器了。计数器不仅能用于对时钟脉冲计数,还可以用于分频、定时、产生节拍脉冲、产生脉冲序列以及进行数字运算等等。  其实,计数也是一种...

    摘要:终于谈到计数器了,呀!在数字系统中,使用得最多的时序电路差不多就是计数器了。计数器不仅能够用于对时钟脉冲计数,还可以用于分频、定时、产生节拍脉冲、产生脉冲序列以及进行数字运算等等。

      其实,计数也是一种最简单最基本的运算,就像我们心里默念的计数一样。不过不同的是,计数器是有一定频率的计数,具有一定的时间间隔,而我们心里默念的计数的时间间隔不一样罢了(也就是不够准确的啦),而计数器就是实现这种运算的逻辑电路,主要是通过对时钟(上升)脉冲的个数进行计数的

      计数器在我们身边也很普遍,比如手机中自带的跑步的计时器、电脑定时关机等等;所以,熟悉掌握计数器,不仅对于学习 Verilog 非常有用,而且,还能锻炼我们的逻辑能力和更深刻地理解数字电路的工作原理,从而对科技更加感兴趣!

    计数器

      让我们直接上代码,看看计数器的底层硬件代码实现,下面是计数器的 Verilog 代码实现:

    module Counters(
        input Clk,
        input Up, // 可增可减(可逆)计数器
        output reg [7:0] Cout = 8'b0000_0000 // 8 位计数器
        );
    
       always @(posedge Clk)
          if (Up)
             Cout <= Cout + 1'b1;
          else
             Cout <= Cout - 1'b1;
    
    endmodule

      其 RTL 电路图如下所示:

    1. 时钟信号:Clk(时钟信号,就是电路的“心脏”,不可或缺);
    2. 复位信号:rst_n(复位信号,也是一个合格的电路不应该缺少的一个输入信号,当复位信号为低电平时,输出全部置零,这就是所谓的低电平有效)当复位信号为高电平时,开始计数,每一个时钟信号的上升沿到来就计一次数,每计数满 256 个时钟周期为一个输出循环,输出置零,然后重新计数;当然,这里为了更好地读懂代码,并没有加入复位信号啊哈哈哈嗝。
    3. 计数值信号:Cout(显示计数值,根据自己设计的需要,可以对位数进行设置,比如最大计数值为 6,那么位数就可以设置为 3 bits)

      其实,这个既是计数器,又能当分频器,而且还能当计时器哟(再者还可以当闹钟功能)这三者其实都是息息相关的,但是博主并没有把分频器和定时器的功能加上去,其实只需要增加一两个信号即可,小伙伴们能否想到怎么添加,从而使得这个程序既有计数器的功能,也有分频器的功能和定时器的功能呢?(后续揭晓)

    展开全文
  • 1.计数器原理 在时钟作用下,输出信号从0开始,每个时钟的上升沿输出加1。当复位信号有效时,输出清零。计时实现只需累加即可。 计数器虽然简单,但是在多种场合都有应用,比如产生ROM地址、分频、状态机等。 比如:...

    下载:Quartus ii与verilog实现8位计数器,Modelsim仿真工程

    1.计数器原理
    在时钟作用下,输出信号从0开始,每个时钟的上升沿输出加1。当复位信号有效时,输出清零。计时实现只需累加即可。
    计数器虽然简单,但是在多种场合都有应用,比如产生ROM地址、分频、状态机等。
    比如:
    Matlab与FPGA数字信号处理系列——DDS信号发生器——Quartus ii 利用 ROM 存储波形实现DDS(1)

    Vivado利用 ROM 存储波形实现DDS(1)

    2.代码编写
    (1)新建工程
    第一页配置工程存放路径、工程名、顶层文件名,点Next;
    在这里插入图片描述
    第二页直接点Next;
    第三页选择FPGA型号,飓风4系列 EP4CE6F17C8;

    在这里插入图片描述

    第四页配置仿真软件和语言,此处设置为使用 Modelsim-Altera 仿真,语言选择Verilog语言,对下图中的Modelsim-Altera,如果没有使用Modelsim的Altera自带的定制版,使用的是Modelsim SE,那么此处选择Modelsim;
    在这里插入图片描述
    第五页直接点Finish,工程如下图所示。
    在这里插入图片描述

    (2)新建Verilog顶层文件
    在这里插入图片描述

    (3)编写Verilog代码,保存为count.v文件

    引脚特性功能
    clk输入——时钟仿真中设置为100M,上升沿有效
    rst_n输入——复位低电平有效,计数值清零
    count_out输出——计数值位宽8-bit,从0计数到255,时钟上升沿+1
    module count(
    	clk,
    	rst_n,
    	count_out
    );
    
    input clk;
    input rst_n;
    output reg [7:0] count_out;
    
    always @ ( posedge clk or negedge rst_n )
    begin
    	if( !rst_n ) begin
    		count_out <= 8'b0;
    	end 
    	else begin
    		count_out <= count_out + 1'b1;
    	end 
    end 
    
    endmodule
    

    在这里插入图片描述

    (4)编译工程
    在这里插入图片描述
    点击 RTL Viewer可以看代码综合后的RTL 电路;
    在这里插入图片描述
    可以看到,代码被综合成带有使能和清零的D触发器和加法器,每个时钟加8’h01(十六进制的1,位宽8-bit);
    在这里插入图片描述

    3.Modelsim仿真
    (1)生成 Test Bench 测试文件
    在这里插入图片描述

    (2)打开Test Bench 文件并添加到工程
    点击文件夹标志,弹出的对话框中找到 simulation 文件夹下的modelsim 文件夹,打开 modelsim 文件夹,将文件类型选为“All Files”,并把下方的“Add file to current project”勾选上;
    在这里插入图片描述

    (3)编写激励信号
    将 count.vt 文件的内容用以下代码代替:

    `timescale 1 ns/ 1 ps
    module count_vt();
    
    reg clk;
    reg rst_n;                                            
    wire [7:0]  count_out;
                             
    count i1 (
    	.clk(clk),
    	.count_out(count_out),
    	.rst_n(rst_n)
    );
    
    initial                                                
    begin                                                                           
    	clk = 0;
    	rst_n= 0;
    	
    	#20;
    	rst_n= 1;
    	
    	#600;
    	$stop;                                            
    $display("Running testbench");                       
    end    
                                                    
    always                                                               
    begin                                                                       
    	#5 clk = ~clk;                                            
    end   
                                                     
    endmodule
    

    (4)配置仿真
    右键1处,选 setting,再选择 2 处,勾选 3 处后点击 4 处;
    在这里插入图片描述
    弹出的对话框,点击1处,弹出第二个对话框,在2处输出仿真文件中的模块名称“count_vt”,点击3处,找到simulation->modelsim-> count.vt 文件并添加“Add”,点击三次“OK”;
    在这里插入图片描述
    对下图1处的Modelsim-Altera,如果没有使用Modelsim的Altera自带的定制版,使用的是Modelsim SE,那么此处选择Modelsim;
    在这里插入图片描述

    (5)开始仿真
    点击下图中的图标,会调用 Modelsim 仿真;
    在这里插入图片描述

    4.仿真结果
    复位为0时输出为0,复位为1后,在时钟clk的上升沿输出加1;
    在这里插入图片描述
    箭头所指白色的输出信号,右键 Radix -> Unsigned,可以输出无符号整数,8位输出可以表示0~255;
    在这里插入图片描述
    点击红框内的,可以设置继续仿真的时间,后面可以点击仿真指定时间、停止等;
    在这里插入图片描述
    在这里插入图片描述

    欢迎关注:FPGA探索者

    回复“8位计数器”获取工程及源码。
    在这里插入图片描述

    展开全文
  • 初学者,文件过程:先设计一位的加法计数,再一个个进位达成八位二进制加法,若要改成十进制的只需要修改加法部分语言将二进制改成十进制即可
  • out_q, //计数器输出 clk, //时钟 load, //并行数据载入使能 enable, //计数使能 data, //置数 reset //复位信号 ); //输出端口 output[7:0] out_q; //输入端口 input[7:0] data; input clk, reset, enable, load; ...
    • code
    module(
    out_q,   //计数器输出
    clk,     //时钟
    load,    //并行数据载入使能
    enable,  //计数使能
    data,    //置数
    reset    //复位信号
    );
    //输出端口
    output[7:0]  out_q;
    //输入端口
    input[7:0] data;
    input clk, reset, enable, load;
    //内部变量声明
    reg[7:0] out_q;
    //代码开始
    always @ (posedge clk) begin
        if(reset) begin         //同步复位信号
            out_q <= 8'b0;
        end else if(load) begin //采样到置位信号
            out_q <= data;
        end else if(enable) begin //计数+1
            out_q <= out_q + 1;
        end
    end
    endmodule
    • quartus ii 综合后的RTL
      这里写图片描述
    展开全文
  • 使用Verilog语言描述计数器——脉动计数器。 内容说明: 本次设计的计数器属于脉动计数器。使用Verilog语言设计,并且设计方法采用模块设计和简单的行为级设计。会有这两种设计的对比测试。最后,会有对这次设计...

    使用Verilog语言描述计数器——脉动计数器。

    内容说明:

    本次设计的计数器属于脉动计数器。使用Verilog语言设计,并且设计方法采用模块设计和简单的行为级设计。会有这两种设计的对比测试。最后,会有对这次设计计数器过程中的一些小心得。

    计数器

    什么是计数器?

    计数是一种最简单基本的运算。计数器就是实现这种运算的逻辑电路。计数器在数字系统中主要是对脉冲的个数进行计数,以实现测量、计数和控制的功能,同时兼有分频功能。(百度)

    自己对计数器的理解。

    计数器就是一个简简单单具有计数功能的模块(module)。不过,这个原理简单的计数模块在芯片和计算机中却是不可或缺的部分。计数器虽然是对脉冲个数进行计数,但是如果把脉冲个数进行某种运算,而且这种运算可以具有某种含义,那么“计数”便可以统计“某种关键量”的次数(数量)。

    计数器分类:

    按照触发条件:同步计数器和异步计数器。
    按照功能:加法计数器、减法计数器,移位计数器、可以记录固定数值的计数器。
    本次设计的脉动计数器属于减法计数器。

    脉动计数器

    脉动计数器是由4个T触发器组成的计数模块。具体逻辑图如图1
    图1:脉动计数器逻辑图
    图1:脉动计数器逻辑图

    设计思想:

    这次设计给出了电路的逻辑图。在这个图中,我们可以看出需要调用4个T触发器,用时钟信号和复位信号把4个T触发器连接起来,4个T触发器的输出组成了最终的输出结果。需要先设计出T触发器,一个T触发器是由一个D触发器和一个非门构成,而D触发器之前设计过。这样设计逻辑就很简单了,先设计D触发器,之后和非门组成T触发器,最后构成脉动计数器。
    这次的设计方面继续采用模块化设计。

    设计代码:

    D触发器设计代码:
    这个D触发器功能比较完善,具有复位、置数功能。

    module dff (clk,rst,load,d,q);
    input	clk,rst,load;
    input	d;
    output	q;
    reg	q;
    
    always @ (posedge clk or negedge rst or negedge load)
    	if(!rst)
    		q<=0;
    	else if (!load)
    		q<=1;
    	else
    		q<=d;
    
    endmodule
    

    T触发器设计代码:

    module	tff (clk,rst,q);
    input	clk,rst;
    output	q;
    //wire	a;
    //not (a,q);
    //dff u1 (clk,rst,1'b1,a,q);
    dff u1 (clk,rst,1'b1,~q,q);
    
    endmodule
    
    

    T触发器设计时,可以有两种想法。一种是如同注释一样,调用一个非门;另一种是在模块调用总直接取非。两种各自选取。
    注:在dff u1 (clk,rst,1'b1,~q,q);中,1'b1不可偷懒写成1。因为,前者代表1位二进制的1;后者代表十进制的1,具体几位看自己的计算机,一般是32位。在赋值的时候,有时会忽略数字的位数和进制,这样只要你自己可以理解不出错误,都可以(开心就好)。但是模块调用是“很严肃”的事情,这样“无所谓”会让模块调用(实例化)出现问题。

    顶层模块设计代码:

    module counter (clk,rst,q);
    input		clk,rst;
    output	[3:0]	q;
    tff u1 (.clk(clk),.rst(rst),.q(q[0]));
    tff u2 (.clk(q[0]),.rst(rst),.q(q[1]));
    tff u3 (.clk(q[1]),.rst(rst),.q(q[2]));
    tff u4 (.clk(q[2]),.rst(rst),.q(q[3]));
    endmodule
    
    

    在使用模块设计之后,使用行为级编写一个简单的计数器,功能和上面设计的脉动计数器一样。不过,代码长度和难度完全不一样。
    代码如下:

    module counter_1 (clk,rst,q);
    input		clk,rst;
    output	[3:0]	q;
    reg	[3:0]	q;
    always @ (posedge clk or negedge rst)
    begin
    	if(!rst)
    		q<=0;
    	else
    		q<=q-1;
    end
    endmodule
    

    测试代码:

    module counter_tb;
    reg		clk,rst;
    wire	[3:0]	q1,q2;
    counter   t1 (clk,rst,q1);
    counter_1 t2 (clk,rst,q2);
    initial
    begin
    	clk=0;rst=0;
    #10	rst=1;
    #50	rst=0;
    #10	rst=1;
    #200	rst=0;
    #10	$stop;
    #10	$finish;
    end
    
    always	#6 clk=~clk;
    
    endmodule
    

    运行结果:

    两中不同设计方法的计数器测试结果如图2所示。
    十进制输出结果如图3所示。
    异步复位部分如图4所示。
    图2:两中不同设计方法的计数器测试结果
    图2:两中不同设计方法的计数器测试结果
    注:图上显示的数值是把二进制转换为了无符号的数值。就是输出没有负数。但是如果改变输出数值的格式,比如改成十进制,结果如图3所示。
    图3:十进制输出结果
    图3:十进制输出结果
    对于为什么会有-8后面是7这个现象的解释。
    0到(-1))
    可以这样理解,0000减1,但是减不了。向“远方”借1,最后变成了1111。这种理解方式只是让你“强行”明白减法。这里的标准回答是补码,十进制中的4位二进制数中规定最高一位是标志位。“1”表示负数;“0”表示正数。有关补码的知识之后再说。
    这样也可以解释(-8)的下一位为什么是(7)。
    (-8)到7

    图4:异步复位部分
    图4:异步复位部分
    可以看出异步复位不需要等待时钟的到来,就可以把输出结果复位(置零)。但是新的输出的出现需要等待时钟。

    总结

    本次主要介绍计数器和如何使用Verilog编写一个计数器。两种设计方法的区别,使用分模块(复杂)设计可以控制模块内部功能,自主性强一些,通过修改内部代码可以实现功能的“微调”;但是编写代码难度加大,对设计者素质要求高。使用行为级(容易)设计最大的优点简单、方便;同时缺点无法做到“窥看”内部。

    预告

    其他计数器的设计。计数器也有新花样。

    感想

    不入其行,不知其难。
    入了其行,方知世界之大!!!

    展开全文
  • Quartus ii 13.0 与 Verilog实现8位计数器,Modelsim仿真,有testbench。
  • Verilog——计数器

    2021-06-21 16:56:27
    //八位计数器 //组合逻辑电路 reg[7:0] y;//触发器,定义为reg型,虽然是输出,但是要在always语句里对它赋值,要做reg型变量定义 wire[7:0] sum;//+1运算的结果 assign sum=y+1;//组合逻辑部分 //触发器工作 ...
  • verilog写的一个计数器,通过计数器可实现分频计数!
  • 约翰逊(扭环形)计数器是基于移位寄存器的计数器,用N个寄存器表示2N个状态,请设计一个4位约翰逊计数器,和格雷码有点类似,相邻两个状态之间只有1bit是不同的。 代码 DUT module johnson_cnt( input wire clk, ...
  • 8位扭环计数器Verilog HDL)

    万次阅读 2019-01-22 13:15:36
    Verilog HDL学习笔记五 扭环计数器又叫约翰逊(Johnson)计数器,用n位触发器来表示2n个状态的计数器,若以四位二进制计数器为例,它可表示16个状态。但由于8421码每组代码之间可能有二位或二位以上的二进制代码发生...
  • 题目:用verilog实现4bit约翰逊(Johnson)计数器。 module Johnson_Counter( input clk, input rst_n, output reg [3:0] johnson_cnt ); //---------------------------------------------------- //johnson_cnt ...
  • 基于verilog的数字频率计数器

    千次阅读 多人点赞 2020-09-25 23:39:03
    数字频率计数器前言一、什么是数字频率技术器?二、简易数字频率计设计要求和原理介绍1.数字频率器结构设计2.结构3、各结构代码LED模块前段模块# 总结引脚分配 前言 简易数字频率计基本指标 测频范围1KHz-10MHz,...
  • 设计带符号位的 8 位加法器电路,每个加数的最高位为符号位,符号位‘1’ 表示-,符号位‘0’表示+
  • 2.设计16位二进制计数器,带异步复位、同步使能、同步装载、同步清零、同步置位 法一 author : Mr.Mao e-mail : 2458682080@qq.com module CNT_16B2(rst_a, en_s, load_s, clr_s, clk, q, cnt, data) ; input rst...
  • Verilog HDL语言设计计数器+加法器

    千次阅读 2018-07-22 16:35:07
    完成课本例题4.12,进行综合和仿真(包括功能仿真和时序仿真),查看仿真结果,将Verilog代码和仿真波形图整理入实验报告。 功能文件: module shiyan1(out,reset,clk); input reset,clk; output reg[3:0] out; ...
  • Verilog设计十进制加法器(FPGA)

    万次阅读 2018-04-25 17:51:12
    本文提供了一个同步清零、同步置数的十进制加法计数器代码和一个异步清零、异步置数的可逆十进制计数器代码,且使用ISE13.4综合通过并在Basys2开发板上成功验证功能,此外大家可以修改代码以调节周期。同步清零、...
  • 说明:说明:本实验实现了八位加法计数器,可以用于定时1us;其中CLK,EN,RST, LOAD,DATA作为输入信号;CLK作为时钟信号,频率为50MHz;EN为允许加载或计数信号,当EN == 1时,允许计数器计数和给计数器设置初值;...
  • Verilog实现4位带符号加法器,带有上益出和下溢出标志位,内含TestBench代码,可直接使用。代码简单修改即可宽展至任意位数的加法器。
  • 二进制计数器及testbench,Verilog HDL

    千次阅读 2013-07-19 14:59:43
    写的很详细,也很全面,特别是testbench: http://www.cnblogs.com/yuphone/archive/2010/12/10/1902664.html
  • 带异步复位和计数使能控制的8位二进制减法计数器设计 带异步复位和计数使能控制的8位二进制减法计数器设计
  • MModelSim是工业界最优秀的语言仿真器,它提供最友好的调试环境,是作FPGA、ASIC设计的RTL级和门级电路仿真的首选。用它设计一个十进制计数器
  • Verilog HDL学习——8位全加器

    千次阅读 2020-04-21 11:17:18
  • verilog 实现8位有符号加法器

    千次阅读 2020-10-03 22:29:27
    一、有符号加法器 对于同一个加法器来说,其实输入无论是有符号数还是无符号数都是可以的。以我之前写的8位二进制加法器:传送门 为例,第一张图我们选radix是unsigned,表示无符号加法,第二张图我们选radix是...
  • 实验成功可以用
  • Verilog HDL报告.docx

    2020-06-03 10:37:25
    三个仿真实验简介如下: (1)键控LED 灯仿真,通过三位key控制八个灯的亮灭,key值为多少时,即对应位的灯亮...(3)八位计数器模块,实现计数和复位功能;通过输入可以暂停计数,恢复之后可以接着上次数据继续计数。
  • 最近刚上手数字电路实验,很多地方都不懂,实验课要求做出数码管静态显示计数器。自己写了一段代码也没报错,但是上basys3板子就行不通。 总体思路如下: 1: 计数模块 ``` module cnt( input clk1, ...
  • 本文由网友提供,非原创。 测量范围10Hz-50Mhz,通过8数数码管显示; 数字频率计的原理很简单,就是计算每秒钟内待测信号的脉冲个数,按照... 计数器有二级制计数器和BCD计数器,因为计数器的计数结果需要经过译...
  • 调用IP核设计一个模10的四位计数器,并在此基础之上级联成八位计数器。 计数器模块设计 2.综合 添加单个文件需手动Add 修改.v文件-->如何修改修改IP核? 四位计数器模块仿真 `time...
  • 此压缩文件为计数器和7段数码管显示功能,使用Verilog语言描述的模块

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 290
精华内容 116
关键字:

八位计数器verilog