jjzjj

【verilog】含异步清零和同步使能的加/减法计数器

芋泥* 2023-08-07 原文
  • 实验目的
    1. 掌握二进制计数器的工作原理。
    2. 能使用verilog设计计数器。

3、进一步熟悉QUARTUSII软件的使用方法和verilog输入方式

  • 实验原理与内容
  1. 实验原理

二进制计数器中应用最多、功能最全的计数器之一,是含异步清零和同步使能的具有并行载入功能的加/减法计数器。其具体工作过程如下:

复位信号有效(低电平有效)时,计数值清零。并行载入控制信号有效时,并行数据输入端的数据存入计数器中。使能信号有效时,根据加减法控制信号来进行加法或者减法计数。具有并行载入数据功能的4位加法计数器原理图如图所示。请参考该图,设计具有异步复位和加/减法功能的计数器。

2.实验内容

本实验要求完成的任务是使用verilog和Quartus II,设计一个4位2进制计数器,并在可编程逻辑器件中实现。在时钟信号的作用下,通过加减控制信号、使能端、并行载入控制信号和复位信号来控制完成加/减法计数和并行载入数据的功能。实验中时钟信号使用数字时钟源模块的1HZ信号,用一位拨动开关K1表示使能端信号,用一位拨动开关K2表示加减控制信号,用一位拨动开关K3表示并行载入数据控制信号,用拨动开关K4~K7表示4位并行载入数据,用复位开关S1表示复位信号,用LED模块的LED1~LED4来表示4位计数器的二进制计数值,用LED12表示加/减法计数时的进位/借位信号。实验LED亮表示对应的位为‘1’,LED灭表示对应的位为‘0’。通过输入不同的值实现计数器的工作时序,观察计数的结果。

数字时钟信号模块的电路原理如图所示,

下表是其时钟输出与FPGA的管脚连接表。

信号名称

对应FPGA管脚名

说明

DIGITAL-CLK

K7

数字时钟信号送至FPGA的K7

按键开关模块的电路原理如下图所示,下表是按键开关的输出与FPGA的管脚连接表。

信号名称

FPGA I/O名称

核心板接口管脚号

功能说明

S[0]

Pin_B12

JP1_79

‘S1’ Switch

S[1]

Pin_B11

JP1_77

‘S2’ Switch

S[2]

Pin_V4

JP3_56

‘S3’ Switch

S[3]

Pin_T4

JP3_52

‘S4’ Switch

S[4]

Pin_P3

JP3_48

‘S5’ Switch

S[5]

Pin_AB11

JP3_40

‘S6’ Switch

S[6]

Pin_A12

JP3_78

‘S7’ Switch

S[7]

Pin_A11

JP3_76

‘S8’ Switch

S[8]

Pin_V5

JP1_55

‘S9’ Switch

S[9]

Pin_T3

JP1_51

‘S10’ Switch

S[10]

Pin_AA12

JP3_43

‘S11’ Switch

S[11]

Pin_T1

JP3_11

‘S12’ Switch

三.实验过程

1.打开QUARTUSII软件,新建一个名为exp2的工程

2.建完工程之后,再新建一个verilog文件,打开verilog编辑器对话框编写verilog程序如下:

module exp2(R,Resetn,Clk,Load,En,up_down,Count,Q);
    /*
    * 说明:
    * R         输入向量    提供并行数据
    * Resetn    复位输入
    * Clock     时钟信号 
    * Load      Load==0(计数模式)     Load==1(加载模式)
    * En        使能输入端
    * up_down   用于识别计数器执行加/减运算
    * Q         输出向量 
    * Count     进位/借位信号
    */
    input [3:0]R;
    input Resetn,Clk,Load,En,up_down;
    output reg [3:0]Q;
    output reg Count;

    reg Clock_1hz;          //1Hz分频新信号
    reg [26:0]Counter;      //计数器用于分频时计数


    //实现50MHz到1Hz分频操作,产生频率为1Hz的时钟信号
    always @(posedge Clk)
    begin
        if(Counter == 'd25000000)
        begin
            Clock_1hz <= ~Clock_1hz;
            Counter <= 0;
        end
        else
            Counter <= Counter + 1;
    end
  //主程序部分,实现键控加法减法计数、并行载入数据、进位/借位输出
    always @(negedge Resetn,posedge Clock_1hz)
    begin
        if(Resetn == 0)
		  begin
            Q <= 0;
				Count<=0;
			end
        else if(Load)
            Q <= R;
        else if(En)
        begin
            Q <= Q + (up_down ? 1 : -1);
            if(up_down)
                Count = (Q[3]&Q[2]&Q[1]&Q[0]);
            else
                Count = (!(Q[3]|Q[2]|Q[1]|Q[0]));
        end
	end
endmodule

3.对编写的verilog程序进行编译并仿真,对程序的错误进行修改。

波形图如下:

4.编译仿真无误后,依照拨动开关、LED与FPGA的管脚连接表或参照实验箱用户手册进行管脚分配,分配完成后,再进行全编译一次,以使管脚分配生效,管脚分配图如下:

实验结果:

不拨动开关,即K7 K6 K5 K4表示D3 D2 D1 D0为0000;

拨动开关K4,即K7 K6 K5 K4表示D3 D2 D1 D0为0001;

拨动开关K5,即K7 K6 K5 K4表示D3 D2 D1 D0为0010;

拨动开关K5K4,即K7 K6 K5 K4表示D3 D2 D1 D0为0011;

拨动开关K6,即K7 K6 K5 K4表示D3 D2 D1 D0为0100;

拨动开关K6K4,即K7 K6 K5 K4表示D3 D2 D1 D0为0101;

拨动开关K6K5,即K7 K6 K5 K4表示D3 D2 D1 D0为0110;

拨动开关K6K5K4,即K7 K6 K5 K4表示D3 D2 D1 D0为0111;

拨动开关K7,即K7 K6 K5 K4表示D3 D2 D1 D0为1000;

拨动开关K1,使得CLK信号为1,计数器开始工作,前四个LED灯通过8421码计数0000,0001,0010,0011,0100,0101,0110,0111,1000并通过显示屏显示出数字,可以通过开关K2设置递增计数与递减计数,通过LOAD端表示存入一个数并从此数开始计数,通过Reset端进行复位清零,达到所需功能。

四、实验总结

本实验最重要的是设计到复位清零端进行复位清零,对于递增计数与递减计数的设置需要清除verilog代码编写上的问题,设置Load端控制存入所需数字时高位低位互相对应,否则会产生一些不必要的问题,造成一些麻烦,在进行管脚分配的时候也要一一对应。

有关【verilog】含异步清零和同步使能的加/减法计数器的更多相关文章

  1. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  2. ruby-on-rails - Ruby on Rails 计数器缓存错误 - 2

    尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot

  3. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  4. Verilog使用inout信号的方法 - 2

    目录一、inout在设计文件中的使用方法1.1、inout的第一种使用方法1.2、inout实现的第二种使用方法1.3、inout使用总结 二、inout在仿真测试中的使用方法一、inout在设计文件中的使用方法在FPGA的设计过程中,有时候会遇到双向信号(既能作为输出,也能作为输入的信号叫双向信号)。比如,IIC总线中的SDA信号就是一个双向信号,QSPIFlash的四线操作的时候四根信号线均为双向信号。在Verilog中用关键字inout定义双向信号,这里总结一下双向信号的处理方法。1.1、inout的第一种使用方法  实际上,双向信号的本质是由一个三态门组成的,三态门可以输出高电平,低电

  5. ruby - 使用什么异步 Ruby 服务器? - 2

    我们开始使用Ruby开发新游戏项目。我们决定使用其中一种异步Ruby服务器,但我们无法决定选择哪一种。选项是:歌利亚抽筋+消瘦/彩虹rack-fiber_pool+rack+thin/rainbowseventmachine_httpserver它们似乎都在处理HTTP请求。Cramp还支持开箱即用的Websocket和服务器端事件。您知道这些服务器的优缺点吗? 最佳答案 我使用eventmachine_httpserver公开了一个RESTfulAPIinanEventMachine-basedIRCbot绝对不会推荐它用于任何严

  6. ruby-on-rails - FactoryGirl工厂特征内的序列不使用主序列计数器 - 2

    我有以下工厂:FactoryGirl.definedofactory:foodosequence(:name){|n|"Foo#{n}"}trait:ydosequence(:name){|n|"Fooy#{n}"}endendend如果我跑create:foocreate:foocreate:foo,:y我得到Foo1,Foo2,Fooy1。但我想要Foo1,Foo2,Fooy3。我怎样才能做到这一点? 最佳答案 经过smile2day'sanswer的一些提示后和thisanswer,我得出以下解决方案:FactoryGirl.

  7. Ruby 并发/异步处理(简单用例) - 2

    我一直在研究ruby​​的并行/异步处理能力,并阅读了许多文章和博客文章。我查看了EventMachine、Fibers、Revactor、Reia等。不幸的是,我无法为这个非常简单的用例找到简单、有效(且非IO阻塞)的解决方案:File.open('somelogfile.txt')do|file|whileline=file.gets#(R)ReadfromIOline=process_line(line)#(P)Processthelinewrite_to_db(line)#(W)WritetheoutputtosomeIO(DBorfile)endend你看到了吗,我的小脚本正

  8. ruby - 异步读取 EventMachine 中的文件 - 2

    我使用RubyEventMachines已经有一段时间了,我想我已经了解它的基础知识了。但是,我不确定如何高效地读取大文件(120MB)。我的目标是逐行读取文件并将每一行写入Cassandra数据库(对于MySQL、PostgreSQL、MongoDB等也应该如此,因为Cassandra客户端明确支持EM)。这个简单的片段会阻塞react器,对吗?require'rubygems'require'cassandra'require'thrift_client/event_machine'EM.rundoFiber.newdorm=Cassandra.new('RankMetrics',

  9. ruby-on-rails - Rails 计数器缓存及其实现 - 2

    我正在尝试掌握Rails计数器缓存功能,但无法完全掌握它。假设我们有3个模型ABCA属于B或C,取决于字段key_type和key_id。key_type表示A属于B还是C,因此如果key_type="B"则记录属于B,否则属于C。在我的模型a.rb中,我定义了以下关联:belongs_to:b,:counter_cache=>true,:foreign_key=>"key_id"belongs_to:c,:counter_cache=>true,:foreign_key=>"key_id"和在b和c模型文件中has_many:as,:conditions=>{:key_type=>"

  10. FIFO实战学习-同步FIFO/异步FIFO-格雷码 - 2

    目录FIFO一.自定义同步FIFO1.1代码设计1.2Testbech1.3行为仿真***学习位宽计算函数$clog2()***$clog2()系统函数使用,可以不关注***分布式资源或者BLOCKBRAM二.异步FIFO2.1在FIFO判满的时候有两种方式:2.2异步FIFO为什么要使用格雷码2.2.1介绍格雷码2.2.2格雷码在异步FIFO中的应用2.2.2格雷码判满2.4二进制与格雷码之间的转换2.4.1二进制码转换为格雷码的方法2.4.2格雷码转换为二进制码的方法2.3实现框图2.5实现及仿真代码2.6仿真图验证2.7结论FIFO  这篇更多的是记录FIFO学习,参考了众多优秀的文章,

随机推荐