模可变计数器设计(Verilog语言)概览
verilog教程
verilog教程Verilog是一种硬件描述语言(HDL),用于描述数字系统的行为和结构。
它是一种流行的HDL,广泛用于硬件设计和验证领域。
本教程将介绍Verilog的基本概念和语法,以帮助初学者入门。
一、Verilog的基本概念1.1 什么是VerilogVerilog是一种描述数字系统的语言,它可以用来描述硬件电路、验证设计的正确性以及进行电路仿真。
1.2 Verilog的应用领域Verilog广泛应用于硬件设计和验证领域,包括用于开发ASIC(应用特定集成电路)、FPGA(现场可编程门阵列)以及其他数字系统的设计。
1.3 Verilog的版本Verilog有多个版本,包括Verilog-1995、Verilog-2001以及最新的Verilog-2005、这些版本之间有一些语法和功能上的差异。
二、Verilog的语法结构2.1模块和端口在Verilog中,所有的电路描述都是由模块(module)组成的。
模块是电路的基本组成单元,可以看作是一个黑盒子,它接受一些输入,产生一些输出。
2.2信号声明在Verilog中,我们需要声明所有的输入和输出信号。
可以使用`input`和`output`关键字来声明这些信号。
2.3电路实现Verilog允许使用多种语句和结构来描述电路的行为和结构。
这些语句包括顺序语句、条件语句、循环语句以及层次结构。
2.4实例化模块在一个模块中,我们可以实例化其他的模块。
这样可以将一个大的电路拆分成多个小的模块,方便编写和测试。
三、Verilog的仿真和验证3.1静态验证Verilog语言本身提供了很多语法和语义层面的验证功能,对于语法和类型错误会有相应的提示。
3.2激励设计在进行电路验证时,我们需要为输入信号提供激励。
Verilog提供了一种称为`testbench`的特殊模块,用于生成输入信号并将其应用到待验证的电路中。
3.3波形仿真在Verilog中,我们可以使用仿真器来模拟电路的行为,并生成波形图来验证电路是否按预期工作。
实验一 模可变计数器
南昌大学实验报告学生姓名:柳宇航学号:6102113025专业班级:通信工程中兴131班实验类型:□验证□综合□设计□创新实验日期:2015.10.22实验成绩:实验一模可变计数器的设计(一)实验要求完成设计、仿真、调试、下载、硬件测试等环节,在EDA实验装置上实现模可变计数器功能,具体要求如下:1、设置一个按键控制改变模值,按键按下时模为10-99之间(具体数值自行确定)的数,没按下时模为100-199之间(具体数值自行确定)的数;2、计数结果用三位数码管十进制显示。
(二)实验步骤1.选定M=0时,实现模值为17的计数;M=1时,实现模值为119的计数。
2.建立工作库文件夹,输入计数器的Verilog代码并存盘。
3.选目标器件CycloneII中的EP2C35F672C8并编译。
4.建立仿真波形文件,设置仿真结束时间和输入条件,进行波形仿真。
图1仿真波形的建立图2M=0时模17计数仿真M=0时,计数到16,灯亮M=1M=0复位M=1时,计数到118,灯亮图3M=1时模119计数仿真波形分析:当RST为高电平时,计数清零。
当RST为低电平,使能位EN为高电平时,开始计数:模控制位M为低电平时,则计数器记到16时归0后重新计数,实现模为17的计数功能;模控制位M为高电平时,则计数器记到118时归0后重新计数,实现模为119的计数功能。
当EN 为低电平时,暂停计数。
5.管脚分配clk PIN_C13en PIN_A5m PIN_B5rst PIN_A6sel[0]PIN_G18sel[1]PIN_G17sel[2]PIN_G16SG[0]PIN_F13SG[1]PIN_F14SG[2]PIN_F15SG[3]PIN_E15SG[4]PIN_F16SG[5]PIN_F17SG[6]PIN_E18SG[7]PIN_F18d[0]PIN_H106.下载测试。
下载到实验箱上测试,下推K7(M=0),可以从实验箱数码管观察到0~16模17计数。
计数器(1):Verilog常用写法
计数器(1):Verilog常⽤写法 计数器是⾮常基本的使⽤,没有计数器就⽆法处理时序。
我在学习时发现市⾯上有⼏种不同的计数器写法,⾮常有趣,在此记录下来:⼀、时序逻辑和组合逻辑彻底分开1.代码1//======================================================================2// --- 名称 : Count_13// --- 作者 : xianyu_FPGA4// --- ⽇期 : 2018-12-105// --- 描述 : 模10计数器,0到10循环累加6//======================================================================78module Count_19 (10input clk ,11input rst_n ,12output reg [ 3:0] cnt13 );1415//----------------------------------------------------------------------16//-- 组合电路17//----------------------------------------------------------------------18reg [ 3:0] cnt_n ;1920always @(*)begin21if(cnt == 4'd9)22 cnt_n = 4'd0;23else24 cnt_n = cnt + 1'b1;25end2627//----------------------------------------------------------------------28//-- 时序电路29//----------------------------------------------------------------------30always @(posedge clk or negedge rst_n)begin31if(!rst_n)32 cnt <= 4'b0;33else34 cnt <= cnt_n;35end3637endmodule3839/*40//----------------------------------------------------------------------41//-- 组合电路也可以这样写42//----------------------------------------------------------------------43wire [ 3:0] cnt_n ;4445assign cnt_n = (cnt==4'd9)? 4'd0 : cnt+1'b1;4647*/2.写法1的RTL视图3.写法2的RTL视图⼆、最常见的写法1.代码1//======================================================================2// --- 名称 : Count_23// --- 作者 : xianyu_FPGA4// --- ⽇期 : 2018-12-105// --- 描述 : 模10计数器,0到10循环累加6//======================================================================78module Count_29 (10input clk ,11input rst_n ,12output reg [ 3:0] cnt13 );1415always @(posedge clk or negedge rst_n)begin16if(!rst_n)17 cnt <= 4'd0;18else if(cnt==4'd9)19 cnt <= 4'd0;20else21 cnt <= cnt + 1'b1;22end23242526endmodule2.RTL视图三.代码⽚段写法1.代码1//====================================================================== 2// --- 名称 : Count_33// --- 作者 : xianyu_FPGA4// --- ⽇期 : 2018-12-105// --- 描述 : 模10计数器,0到10循环累加6//====================================================================== 78module Count_39//---------------------<端⼝声明>---------------------------------------10 (11input clk ,12input rst_n ,13output reg [ 3:0] cnt14 );15//---------------------<信号定义>---------------------------------------16wire add_cnt ;17wire end_cnt ;1819//----------------------------------------------------------------------20//-- 0-9计数21//----------------------------------------------------------------------22always @(posedge clk or negedge rst_n)begin23if(!rst_n)24 cnt <= 'd0;25else if(add_cnt)begin26if(end_cnt)27 cnt <= 'd0;28else29 cnt <= cnt + 1'b1;30end31else32 cnt <= cnt;33end3435assign add_cnt = 1;36assign end_cnt = add_cnt && cnt==10-1;3738394041endmodule2.RTL视图四、⾃减计数器(较少⽤到)1.代码1//====================================================================== 2// --- 名称 : Count_43// --- 作者 : xianyu_FPGA4// --- ⽇期 : 2018-12-195// --- 描述 : 模10⾃减计数器,10到0循环累减6//====================================================================== 78module Count_49//---------------------<端⼝声明>---------------------------------------10 (11input clk ,12input rst_n ,13output reg [ 3:0] cnt14 );15//---------------------<参数定义>---------------------------------------16parameter CNT_MAX = 10 ;1718//----------------------------------------------------------------------19//-- 10到0循环累减20//----------------------------------------------------------------------21always @(posedge clk or negedge rst_n)begin22if(!rst_n) begin23 cnt <= 0;24end25else if(cnt==0) begin26 cnt <= CNT_MAX;27end28else begin29 cnt <= cnt - 1;30end31end323334endmodule2.RTL视图3.仿真波形五、新学到的⼀种⾮常简洁的计数器 本以为计数器就是这样了,近来学习开源骚客《SDRAM那些事⼉》系列教程,⼜发现⼀种新的写法,对于特定功能的实现上⾮常简洁。
verilog第二章简单的Verilog模块
and #1 u2(sela, a, nsl);
and #1 u3(selb, b, sl);
or #1 u4(out, sela, selb);
endmodule
/*一个名为adder的三位加法器的例子。*/
module adder ( count,sum,a,b,cin ); //模块定义开始
// 选择逻辑组合
2.2.2 模块的概念
一个设计是由一个个模块构成的。一个模块的设计如下:
1 模块内容是嵌套在module和endmodule两个语句之间。每个
模块实现特定的功能,模块是可以进行层次嵌套的。正因为
如此,才可以将大型的数字电路设计分割成不同的小模块来
实现特定的功能,最后通过顶层模块调用子模块来实现整体
endmodule
数据流语句
▪这个例子描述了一个三位的加法器。从例子中可以看出整个
Verilog HDL程序是嵌套在module和endmodule声明语句里
的,只出现了一个assign语句。
例SR触发器模块
S
Q
//SR 触发器
module SR_FF (Q, Q_n,S,R);
R
Q_n
output Q, Q_n; //端口声明
input S,R;
nand n1(Q, S,Q_n);
nand n2(Q_n,R,Q);
nand为verilog
中的与非门门级
原语部件
endmodule
模块中的5个部分并没全部出现,只出现在
低层次模块实例化
D触发器模块
//D 触发器
module D_FF (d, clk,clr,q,qb);
实验六Verilog设计分频器计数器电路
实验六Verilog设计分频器/计数器电路一、实验目的1进一步掌握最基本时序电路的实现方法;2学习分频器/计数器时序电路程序的编写方法;3进一步学习同步和异步时序电路程序的编写方法。
二、实验内容1、用Verilog设计一个10分频的分频器,要求输入为clock(上升沿有效),reset(低电平复位),输出clockout为5个clock周期的低电平,5个clock周期的高电平),文件命名为fenpinqi10.v。
2、用Verilog设计一异步清零的十进制加法计数器,要求输入为时钟端CLK(上升沿)和异步清除端CLR(高电平复位),输出为进位端C和4位计数输出端Q,文件命名为couter10.v。
3、用Verilog设计8位同步二进制加减法计数器,输入为时钟端CLK(上升沿有效)和异步清除端CLR(低电平有效),加减控制端UPDOWN,当UPDOWN为1时执行加法计数,为0时执行减法计数;输出为进位端C和8位计数输出端Q,文件命名为couter8.v。
4、用VERILOG设计一可变模数计数器,设计要求:令输入信号M1和M0控制计数模,当M1M0=00时为模18加法计数器;M1M0=01时为模4加法计数器;当M1M0=10时为模12加法计数器;M1M0=11时为模6加法计数器,输入clk上升沿有效,文件命名为mcout5.v。
5、VerilogHDL设计有时钟时能的两位十进制计数器,有时钟使能的两位十进制计数器的元件符号如图所示,CLK是时钟输入端,上升沿有效;ENA是时钟使能控制输入端,高电平有效,当ENA=1时,时钟CLK才能输入;CLR是复位输入端,高电平有效,异步清零;Q[3..0]是计数器低4位状态输出端,Q[7..0]是高4位状态输出端;COUT是进位输出端。
三、实验步骤:第一个实验:1、打开QuartusII,新建一个工程f_fenpinq10yjq2、新建一个Verilog HDL文件3、输入程序:module fenpinqi10(clk,reset,clkout);input clk,reset;output clkout;reg clkout;reg[2:0] cnt;always @(posedge clk , negedge reset)beginif(!reset)begin clkout<=0;cnt<=0;endelse if(cnt==4)begin cnt<=0;clkout<=~clkout;endelse cnt<=cnt+1;endendmodule4、设置顶层实体名(点settings>general >下拉选fenpinqi10)5、编译6、执行file>Create/Update>Create Symbol Files for Current Flie为VHDI设计文件生成原件符号7、建立波形文件8、导入引脚9、仿真结果如下:总结:仿真结果与实验一的题意相符,所以仿真正确。
verilog实现60计数器
input load,clk,reset;input[7:0] data;
output reg[7:0] qout; output cout;
always @(posedge clk)
begin
if(reset) qout<=0;
count60 mycount(qout,cout,data,load,reset,clk);
always #(DELY/2) clk=~clk;
initial
begin clk=0;reset=0 ;load=0 ;data=58;
#DELY reset=1;
#DELY reset=0;
#DELY load=1;
end
end
assign cout=(qout==8'd59)?1:0;
endmodule
`include "count60.v"
module count;
reg clk,reset,load;
reg[7:0] data;
wire [7:0]qout;
wire cout;
parameter DELY=100;
verilog实现60计数器 modulecount60(qout,cout,data,load,reset,clk); input load,clk,reset;input[7:0] data; output reg[7:0] qout; output cout; always @(posedge clk) begin if(reset) qout<=0; else if(load) qout<=data; else begin if(qout[3:0]==9) begin qout[3:0]<=0; if(qout[7:4]==5) qout[7:4]<=0; else qout[7:4]<=qout[7:4]+1; end else qout[3:0]<=qout[3:0]+1; end end assign cout=(qout==8?d59)?1:0; endmodule `include "count60.v" module count; reg clk,reset,load; reg[7:0] data; wire [7:0]qout; wire cout; parameter dely=100; count60 mycount(qout,cout,data,load,reset,clk); always #(dely/2) clk=~clk; initial begin clk=0;reset=0 ;load=0 ;data=58; #dely reset=1; #dely reset=0; #dely load=1; #dely load=0; #(dely*60) $finish; end initial $monitor($time,,,"clk=%d reset=%d load=%d qout=%d cout=%d clk,reset,load,cout,qout);endmodule `timescale 1ns/1ns `include "vote.v" module vote; reg wirepass; parameter dely=100; vote vt(a,b,c,pass); initial begin #dely$finish; end initial $monitor($time,,,"a=%b pass=%b",a,b,c,pass);endmodule crx110
数字电路与逻辑设计实训课程学习总结基于Verilog的多功能计数器设计与实现
数字电路与逻辑设计实训课程学习总结基于Verilog的多功能计数器设计与实现数字电路与逻辑设计是计算机科学与技术专业的一门重要课程,通过学习这门课程,我深入了解了数字电路与逻辑设计的基本原理和Verilog语言的应用。
在实践中,我通过设计与实现基于Verilog的多功能计数器,不仅巩固了理论知识,而且提高了自己的实践能力和问题解决能力。
首先,在学习数字电路与逻辑设计的过程中,我了解到数字电路是基于二进制运算的电子电路系统,其中包括了门电路、触发器、寄存器等基本组件。
通过对这些组件的学习和理解,我能够准确地分析和设计各种数字电路电子产品。
其次,我学习了Verilog语言的基本语法和使用方法。
Verilog是一种硬件描述语言,可以用来描述数字电路的结构和功能。
通过学习Verilog语言,我可以使用模块化和层次化的设计思路来实现复杂的数字电路功能。
在实践中,我选择了设计和实现一个多功能计数器作为我的项目。
该多功能计数器能够实现多种计数模式,并且能够通过外部输入信号进行控制。
在设计的过程中,我首先进行了功能需求的分析和设计,然后结合Verilog语言的特点,采用模块化设计的思路,将计数器分为了多个子模块,分别实现不同的功能。
最后,我进行了仿真和综合验证,确保设计的正确性和稳定性。
在实现的过程中,我遇到了一些困难和问题,但通过查阅资料和与同学的讨论,我逐渐解决了这些问题。
例如,在设计过程中,我遇到了一些时序逻辑的问题,通过调整时钟信号和状态转移的顺序,最终解决了这些问题。
另外,在测试和验证的过程中,我遇到了一些功能异常的情况,通过对代码的仔细分析和调试,最终找到了问题的源头并进行了修复。
通过这个实训项目,我不仅深入理解了数字电路与逻辑设计的原理,还提高了我的实践能力和问题解决能力。
我学会了如何使用Verilog语言来描述和实现数字电路,如何进行功能需求的分析和设计,如何进行仿真和综合验证。
这对于我今后的学习和工作都具有重要的意义。
verliog数字时钟计数器电路设计
Verilog数字时钟计数器电路设计一、引言Verilog是一种硬件描述语言,用于描述、设计和模拟数字电路。
数字时钟计数器电路是数字电子系统中常见的模块,用于产生时钟信号和计数功能。
本文将介绍如何使用Verilog语言设计数字时钟计数器电路。
二、电路功能数字时钟计数器电路的功能是产生一个稳定的时钟信号,并实现计数功能,用于驱动数字系统中的时序逻辑。
该电路通常包括时钟发生器和计数器两部分,时钟发生器用于产生稳定的时钟信号,而计数器用于对时钟信号进行计数。
三、Verilog语言简介Verilog是一种硬件描述语言,它可以用于描述数字电路的结构、行为和时序特性。
Verilog语言具有丰富的语法结构,包括模块、端口、信号、赋值语句、过程块等,可以描述数字电路中的各种逻辑和时序操作。
四、数字时钟计数器电路设计1. 模块定义我们需要使用Verilog语言定义数字时钟计数器的模块。
模块是Verilog语言中的最基本单元,用于描述数字电路的结构和行为。
以下是数字时钟计数器模块的定义:```verilogmodule clk_counter(input wire clk,input wire rst,output reg [3:0] count);```在上面的代码中,我们定义了一个名为`clk_counter`的模块,该模块包括一个时钟输入`clk`、一个复位输入`rst`和一个4位计数输出`count`。
2. 时钟发生器接下来,我们需要设计时钟发生器模块,用于产生稳定的时钟信号。
以下是时钟发生器模块的定义:```verilogmodule clk_generator(output reg clk);always #10 clk = ~clk;endmodule```在上面的代码中,我们定义了一个名为`clk_generator`的模块,该模块包括一个时钟输出`clk`。
通过`always`块和`#10`延时控制,我们实现了一个简单的时钟发生器,每10个时间单位翻转一次。
verilog数字系统设计教程
verilog数字系统设计教程Verilog数字系统设计教程作者:XXX引言:数字系统设计是现代电子工程中非常重要的一部分。
Verilog作为一种硬件描述语言,提供了一种方便且专业的方法来设计和描述数字系统。
本教程旨在为初学者提供关于Verilog数字系统设计的详细介绍和指导。
1. Verilog简介Verilog作为一种硬件描述语言,用于描述数字系统的功能、结构和时序行为。
它类似于C语言,但更专注于硬件级别。
Verilog可以用于设计各种数字系统,例如处理器、嵌入式系统、通信设备等。
2. Verilog基本语法2.1 模块定义Verilog的基本单位是模块。
模块是数字系统的基本组成部分,可以看作是一个独立的功能单元。
模块可以包含输入、输出、内部信号以及其它子模块等。
2.2 信号声明在Verilog中,可以声明各种类型的信号,包括输入信号、输出信号和内部信号等。
信号声明定义了信号的类型、宽度和方向。
3. Verilog建模3.1 组合逻辑建模组合逻辑是数字系统中最基本的部分。
Verilog提供了各种组合逻辑建模的方法,包括逻辑运算、选择结构和多路复用器等。
3.2 时序逻辑建模时序逻辑是数字系统中需要考虑时序关系的部分。
Verilog提供了时序逻辑建模的方法,包括触发器、计数器和时序控制等。
4. Verilog仿真4.1 仿真器介绍仿真器是用于验证数字系统设计的工具。
Verilog可以与各种仿真器配合使用,用于验证设计的正确性和性能。
4.2 仿真流程仿真流程包括编写测试平台和测试用例、编译和仿真等步骤。
本节将介绍基本的仿真流程和相关技巧。
5. Verilog综合5.1 综合概述综合是将Verilog代码转换为逻辑门级描述的过程。
综合器通过将Verilog代码映射到实际的硬件库中,生成能够实现指定功能的逻辑电路。
5.2 综合流程综合流程包括综合前的优化和综合本身两个阶段。
本节将介绍综合的基本流程和主要考虑因素。
基于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作为一种硬件描述语言,被广泛应用于数字电路设计中,能够帮助工程师们更高效地进行数字电路的建模、仿真和验证。
本文将介绍基于Verilog的数字电路设计与模拟的相关内容,包括Verilog语言基础、数字电路设计流程、常用的数字电路元件设计以及Verilog仿真工具的使用等方面。
Verilog语言基础Verilog是一种硬件描述语言(HDL),它可以描述数字系统中的行为和结构,是数字电路设计中常用的编程语言之一。
Verilog包括结构化Verilog和行为Verilog两种描述方式,结构化Verilog主要用于描述数字系统的结构,而行为Verilog则用于描述数字系统的行为。
在Verilog中,最基本的单元是模块(module),一个模块可以包含输入端口、输出端口以及内部逻辑。
示例代码star:编程语言:verilogmodule and_gate(input a, input b, output y);assign y = a & b;endmodule示例代码end上面是一个简单的AND门模块的Verilog描述,其中input表示输入端口,output表示输出端口,assign用于赋值操作。
通过这样的描述,我们可以实现各种逻辑门、寄存器、计数器等数字电路元件。
数字电路设计流程在进行数字电路设计时,通常需要遵循一定的设计流程,以确保设计的正确性和可靠性。
典型的数字电路设计流程包括需求分析、概念设计、详细设计、验证和实现等阶段。
在Verilog中,我们可以通过编写相应的代码来完成这些阶段的工作。
需求分析:明确设计的功能需求和性能指标。
概念设计:根据需求设计数字系统的整体结构和功能模块。
详细设计:对各个功能模块进行详细设计,包括内部逻辑和接口定义。
verilog设计十进制计数器(含进位位)
verilog设计⼗进制计数器(含进位位)⼗进制计数器:设计要求:1、每当计数器值为4’b001时,⾃动回到4’b00002、每个时钟沿计数器值加13、进位输出carry应该与4'b1001同周期输出4、异步复位module cnt10 ( clk, rst_n, carry, cnt );input clk, rst_n;output carry;output [3:0] cnt;reg carry;reg [3:0] cnt;always @( posedge clk or negedge rst_n )beginif ( ~rst_n )begincnt <= 4'b0000;endelse if ( cnt == 4'b1001 )begincnt <= 4'b0000;endelsebegincnt <= cnt + 4'b0001;endendalways @(posedge clk or negedge rst_n)beginif(!rst_n)begincarry <= 1'b0;endelse if(cnt == 4'b1000)begincarry <= 1'b1;endelsecarry<= 1'b0;endendmoduleView Code测试程序:`timescale 1ns/1psmodule cnt10_tb();reg clk, rst_n;wire carry;wire [3:0] cnt;always #10 clk = ~clk;cnt10 cnt10_tb(.clk(clk),.rst_n(rst_n),.carry(carry),.cnt(cnt));initialbeginclk = 1'b0;rst_n = 1'b1;#10 rst_n = 1'b0;#10 rst_n = 1'b1;endendmodule波形图:在这个⼗进制计数器中,唯⼀要注意的⼀点就是进位位carry变化的时刻,如果是为了使下⼀级能正确接收到前⼀级的进位位标识,要在计数到九时使进位位有效;如上图波形所⽰。
模可控计数器的设计
模可控计数器的设计-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN
杭州电子科技大学
实验报告
实验课程名称EDA技术
实验序号3
实验内容模可控计数器的设计班级
姓名张学涌
学号
指导教师黄继业
二○一一年十一月十日
实验目的与要求
实验目的:进一步学习quartus的文本设计,仿真,测试,以及硬件下载测试;
实验名称:模可控计数器的设计
实验原理
可用并行预置的加法器实现;将计数进位与预置数加载输入信号端或计数复位端相接,当计数值溢出时,在下一时钟预置的值加载进计数器,然后计数器再从这个预置数重新计数,从而实现模可控的计数器;
实验内容
模可控计数器的文本编辑如图:
仿真后的波形图为:
由图可以知道,几乎没有毛刺。
这是一个8位的计数器,预置数为F1,当计数到FF的时候,出现溢出,同一时刻LD(keep属性)变成1,。
到下一时刻的时候,计数器加载预置数,即F1,同一时刻PM变成1,然后计数器再从F1 重新计数,直到FF时又重新加载;
仿真后的RTL图为:
资源利用情况:
由图可以看到资源利用得非常少;
总结与体会
通过模可控器的设计,我懂得如何设计计数器的思路和原理,收获很深刻!。
计数器的VHDL设计与实现
期刊论文—EDA课程设计题目:计数器的VHDL设计与实现学生姓名:***学生学号:09专业班级:计算机科学与技术0902班指导老师:***计数器的VHDL设计与实现摘要:介绍了各种基本计数器的组成及其工作原理,重点研究了可变模计数器的设计与实现, 在对现有的可变模计数器的研究基础上,在Quartus 开发环境中,用VHDL语言设计一种功能更加强大的可变模计数器,它具有清零、置数、使能控制、可逆计数和可变模等功能,并且对传统的可变模计数器的计数失控问题进行研究,最终设计出一种没有计数失控缺陷的可变模计数器,并通过波形仿真和EPF10K20TI144-4系列实验箱,验证了其各项设计功能。
结果表明该设计正确.功能完整。
运行稳定。
关键词:VHDL;计数器;可变模计数;可逆计数VHDL Design and Realization of CounterAbstract:This paper analyzes all kinds of basic counter and its working principle, focus on the counter variable mode of design and implementation. In the environment of Quartus based on research of the existing module—alterable counter,a module—alterable counter with more functions,such as clear,set,enable control,reversible count,module—alterable count and so on,which is designedwith VHDL.By researching the problem of losing control existed in traditional module—alterable counter.A module—alterablecounter with no fault designed.And through the waveform simulation and EPF10K20TI144-4 series experiment box,all of the functions are verified.The resuit indicates that the counter is designed correctly,and has integral functions and stable operation.Keywords:VHDL;counter;divided frequency impIement;reversible引言随着电子技术、计算机技术和EDA技术的不断发展,数字系统规模越来越大,传统的电路设计已难以适应复杂电子系统的设计要求。
Verilog代码(计数器、交通灯、串并转换)
1、通用二进制计数器设计一个二进制计数器(默认为8位计数器),具有加/减计数功能、异步复位、预制数功能。
代码如下:`define WIDTH 8module BinaryCounter(counter,clk,up_down,load,reset,din);output reg [`WIDTH-1:0] counter;input clk;input up_down; //1为加计数,0为减计数input reset;input load; //预置数,1有效,din输出到counterinput [`WIDTH-1:0] din;always@(posedge clk or posedge reset)beginif(reset)counter<=0;else if(load)counter<=din;else if(up_down==1)counter<=counter+1;else if(up_down==0)begincounter<=counter-1;if(counter<1) counter<=0;endendendmodule测试程序如下:`define WIDTH 8module BinaryCounter_tb;reg clk,up_down,reset,load;reg [`WIDTH-1:0] din;wire [`WIDTH-1:0] counter;integer i;initialbeginclk=0;reset=1;#5 reset=0;#3000 $stop;endalways #5 clk=~clk;/*always@(posedge clk)beginup_down={$random}%2;load={$random}%2;din={$random}%256;end*/initialbegin#5;for(i=0;i<256;i=i+3)begindin=i;#10;endendinitialbeginup_down=1;load=1;#20 load=0;#30 load=1;#30 load=0;endalways #200 up_down=~up_down;BinaryCounter bcounter(.counter(counter),.clk(clk),.up_down(up_down),.load(load),.reset(reset),.din(din));endmodule波形图如下:图1 二进制计数器波形图图2 二进制计数器波形图从图像可看出,20s-50s为加计数,50s-80s时load=1,执行置数功能,80s-200s 时up_down=1,为加计数,200s-280s时up_down=0,为减计数。
模可变计数器
南昌大学实验报告学生姓名:学号:专业班级:实验类型:□验证□综合 设计□创新实验日期:实验成绩:实验二模可变计数器的设计一、实验目的1、进一步加强经典状态机的设计2、学会设计模可变计数器二、实验要求1、设计一个模可变计数器,当M=0时实现模23计数,当M=1时实现模109计数2、计数结果用七段数码管显示3、对设计电路进行时序仿真三、设计过程1,模可变计数器原理:即在原有的模值计数器上加入模值转换功能2,计数器的数码管显示需注意十位和百位的进位即:当个位数的数值为9的下一个脉冲来时转换为,同时向十位进一,转换的算法为:9(1001)+7(0111)=0(0000),并进一位;当数值为99时,用同样的方法转换:153(1001 1001B,数码管显示99)+103(01100111B)=100(0001 0000 0000);四、实验步骤1、顶层文件的设计顶层原理图设计可以依据实验原理和需求设定,由时钟分频模块,数码管显示模块和模可变计数模块(CLKDIV,SCAN_LED,COUNTER)三部分组成。
2,各模块设计文件①CLKDIV:L IBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CLKDIV ISPORT(CLK : IN STD_LOGIC;CLK_DIV : OUT STD_LOGIC);END CLKDIV;ARCHITECTURE RT1 OF CLKDIV ISSIGNAL DA TA:INTEGER RANGE 0 TO 100;SIGNAL CLK_TEMP:STD_LOGIC;BEGINPROCESS(CLK)BEGINIF RISING_EDGE(CLK) THENIF(DA TA=100) THENDA TA<=0;CLK_TEMP<=NOT CLK_TEMP;ELSEDA TA<=DA TA+1;END IF;END IF;CLK_DIV<=CLK_TEMP;END PROCESS;END RT1②COUNTERLIBRARY IEEE ;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY count ISPORT (CLK,RST,EN,M : IN STD_LOGIC;CQ1,CQ2,CQ3 : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) ;COUT : OUT STD_LOGIC ) ;END ENTITY count;ARCHITECTURE one OF count ISSIGNAL model : INTEGER;BEGINPROCESS (CLK,RST,EN,M,model)V ARIABLE CQI : STD_LOGIC_VECTOR (11 DOWNTO 0) ;BEGINIF M = '0' THEN model <= 34;ELSIF M = '1' THEN model <= 264;ELSE model <= 0;END IF;IF RST = '1' THEN CQI := (OTHERS => '0');ELSIF CLK'EVENT AND CLK = '1' THENIF EN = '1' THENIF CQI < model THENIF CQI(7 DOWNTO 0) = 153 THEN CQI := CQI + 103 ;ELSIF CQI(3 DOWNTO 0) = 9 THEN CQI := CQI + 7 ;ELSE CQI := CQI + 1 ;END IF;ELSE CQI := (OTHERS => '0') ;END IF;END IF;END IF;IF CQI = model THEN COUT <= '1';ELSE COUT <= '0';END IF;CQ1 <= CQI(3 DOWNTO 0);CQ2 <= CQI(7 DOWNTO 4);CQ3 <= CQI(11 DOWNTO 8);END PROCESS;END ARCHITECTURE one;③SCAN_LEDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY scan_led ISPORT(clk : IN STD_LOGIC;data1,data2,data3: IN STD_LOGIC_VECTOR(3 DOWNTO 0);scan : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);choose: OUT STD_LOGIC_VECTOR(2 DOWNTO 0)); END ENTITY;ARCHITECTURE one OF scan_led ISSIGNAL cout8:STD_LOGIC_VECTOR(2 DOWNTO 0);SIGNAL A :STD_LOGIC_VECTOR(3 DOWNTO 0); BEGINP1:PROCESS(cout8)BEGINCASE cout8 ISWHEN "000" => choose <= "000"; A <= "0000";WHEN "001" => choose <= "001"; A <= "0000";WHEN "010" => choose <= "010"; A <= "0000";WHEN "011" => choose <= "011"; A <= "0000";WHEN "100" => choose <= "100"; A <= "0000";WHEN "101" => choose <= "101"; A <= data3;WHEN "110" => choose <= "110"; A <= data2;WHEN "111" => choose <= "111"; A <= data1;WHEN OTHERS => NULL;END CASE;END PROCESS P1;P2:PROCESS(clk)BEGINIF clk'EVENT AND clk ='1' THEN cout8 <= cout8+1;END IF;END PROCESS P2;P3:PROCESS(A)BEGINCASE A ISWHEN "0000"=> scan <="0111111"; --0WHEN "0001"=> scan <="0000110"; --1WHEN "0010"=> scan <="1011011"; --2WHEN "0011"=> scan <="1001111"; --3WHEN "0100"=> scan <="1100110"; --4WHEN "0101"=> scan <="1101101"; --5WHEN "0110"=> scan <="1111101"; --6WHEN "0111"=> scan <="0000111"; --7WHEN "1000"=> scan <="1111111"; --8WHEN "1001"=> scan <="1101111"; --9WHEN "1010"=> scan <="1110111"; --AWHEN "1011"=> scan <="1111100"; --BWHEN "1100"=> scan <="0111001"; --CWHEN "1101"=> scan <="1011110"; --DWHEN "1110"=> scan <="1111001"; --EWHEN "1111"=> scan <="1110001"; --FWHEN OTHERS=> NULL;END CASE;END PROCESS P3;END;3、编译1)输入完程序之后逐个编译2)逐个编译无错之后进行全程编译4、将以上模块生成元器件时钟分频模块模可变计数模块数码管显示模块 5,将以上各器件连接成实验原理图6、系统仿真1)建立新的波形激励文件2)在波形编辑器窗口添加节点3)通过Edit->End Time 来设定仿真结束时间4)在CLOCK窗口中设置clk的时钟周期为100s5)点击save保存6) 通过Tools下的Simulator Tools项进行仿真,然后观察输出波形。
EDA实验报告实验二:模可变计数器的实验报告
Nb大学实验报告学生姓名:EDA教父学号:61xxxx099 专业班级:通信101实验类型:□验证□综合□设计□创新实验日期:2012-10-8 实验成绩:实验二模可变计数器的设计一实验要求利用控制位M来改变模长要求M=1时模为114计数,M=0时模为16计数;二实验步骤1.建立工作库文件夹,输入计数器的VHDL代码并存盘。
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY count ISPORT(CLK,M,EN,RST:IN STD_LOGIC;sel0,sel1,sel2:buffer STD_LOGIC;SG:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);CLK1:buffer STD_LOGIC;GW,SW,BW: buffer STD_LOGIC_VECTOR(3 DOWNTO 0);COUT:OUT STD_LOGIC;SEL:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END count;ARCHITECTURE behav OF count ISSIGNAL CNT : STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL J : STD_LOGIC_VECTOR(11 DOWNTO 0);SIGNAL CNT8: STD_LOGIC_VECTOR(2 DOWNTO 0);SIGNAL A : STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL MODEL : STD_LOGIC_VECTOR(11 DOWNTO 0);BEGINP1:PROCESS(CLK)BEGINIF CLK'EVENT AND CLK = '1' THEN CNT<=CNT+1;IF CNT=130 THEN CLK1<='1';ELSE CLK1<='0';END IF;END IF;END PROCESS;P2:PROCESS(EN,RST,M,CLK1)BEGINCASE M ISWHEN '0'=>MODEL<="000000010101";WHEN '1'=>MODEL<="000100010011";END CASE;GW<=J(3 downto 0); SW<=J(7 downto 4);BW<=J(11 downto 8);IF RST='1' THEN J<=(others=>'0');ELSIF CLK1'EVENT AND CLK1='1' THENIF EN='1' THENIF J<MODEL THENIF GW=9 THENJ<=J+7;IF SW=9 THENJ<=J+103;END IF;ELSE J<=J+1;END IF;ELSE J<=(others=>'0');END IF;END IF;END IF;END PROCESS;P3:PROCESS( CLK)BEGIN IF CLK'EVENT AND CLK='1' THENIF CNT8<"010" THEN CNT8 <=CNT8+1;ELSE CNT8<=(OTHERS=>'0');END IF;END IF;SEL(0)<=sel0 ;SEL(1)<=sel1 ;SEL(2)<=sel2 ;CASE CNT8 ISWHEN "000" => sel2<='0';sel1<='1';sel0<='0';A<=GW;WHEN "001" => sel2<='0';sel1<='0';sel0<='1';A<=SW;WHEN "010" => sel2<='0';sel1<='0';sel0<='0';A<=BW;WHEN OTHERS =>NULL;END CASE;END PROCESS ;P4:PROCESS(A)BEGINCASE A ISWHEN "0000" =>SG<="00111111"; WHEN "0001" =>SG<="00000110";WHEN "0010" =>SG<="01011011"; WHEN "0011" =>SG<="01001111";WHEN "0100" =>SG<="01100110"; WHEN "0101" =>SG<="01101101";WHEN "0110" =>SG<="01111101"; WHEN "0111" =>SG<="00000111";WHEN "1000" =>SG<="01111111"; WHEN "1001" =>SG<="01101111";WHEN OTHERS=>NULL;END CASE;END PROCESS;COUT <='1' WHEN J =MODEL ELSE '0';END behav;2.选目标器件CycloneII中的EP2C35F672C8并编译。
verilog教程
verilog教程Verilog是一种硬件描述语言(HDL),用于设计和描述数字电路。
它是一种事件驱动的语言,可以用来描述时序逻辑和组合逻辑。
Verilog可以用于设计和验证各种数字电路,从简单的门电路到复杂的处理器和系统。
Verilog的语法和结构与C语言相似,它由模块、端口、信号和行为描述组成。
Verilog中的模块是模块化设计的基本单元,可以将模块集成到更大的设计中。
模块可以具有输入端口、输出端口和内部信号。
输入和输出端口用于与其他模块进行通信,而内部信号用于在模块内部传递和保存数据。
Verilog的行为描述方式包括并行块和顺序块。
并行块表示同时执行的代码,而顺序块表示按顺序执行的代码。
Verilog中的并行块使用关键字"always @(posedge clock)"来表示,其中的代码只在时钟上升沿触发时执行。
顺序块使用关键字"always @(*)"来表示,其中的代码在输入信号变化时立即执行。
在Verilog中,可以使用各种逻辑运算符,如AND、OR、NOT和XOR,来实现组合逻辑。
此外,还可以使用各种触发器和寄存器类型,如D触发器和JK触发器,来实现时序逻辑。
通过将组合逻辑和时序逻辑结合起来,可以实现复杂的数字电路。
Verilog的仿真可以使用各种工具,如ModelSim和Vivado,来验证设计的正确性。
仿真可以通过将输入信号施加到设计中,然后观察输出信号的变化来进行。
如果输出信号与预期的结果一致,那么设计就是正确的。
在Verilog中,还可以使用分层设计的概念来实现模块的结构化和组织。
通过使用层次化模块,可以将设计划分为更小的模块,并将它们组合在一起以实现更大的系统。
尽管Verilog的学习曲线可能有点陡峭,但它是数字电路设计中最常用和最强大的工具之一。
通过掌握Verilog,您可以实现自己的数字电路设计,并进行验证和测试。
总之,Verilog是一种用于设计和描述数字电路的硬件描述语言。
verilog模六十计数器设计
endmodule
子模块 1:
module frequency1000( input cp, output reg cp1
); reg [15:0]cnt=0; always@(posedge cp) begin cnt<=cnt+1'b1; if(cnt>=16'b1100001101001111)//50000-1,把 50MHz 分频为 1000Hz begin cp1<=~cp1;
性能测试: 用电子表测量系统从 00 显示到 59,再到 00 的时间,确实为 30 秒(计数信号为 2Hz), 性能上达到要求。
七、 系统设计开发步骤与过程
1、 明确设计要求与拥有的资源; 2、 设计原理图; 3、 编写代码; 4、 仿真; 5、 修改代码后,重复步骤 4、5,直到仿真结果无误为止; 6、 将代码写入开发板,进行性能与功能测试; 7、 修改代码后,重复步骤 4、5、6、7,直到性能与功能都达到要求为止; 8、 撰写系统说明书与报告。
); reg [24:0]cnt=0; always@(posedge cp) begin cnt<=cnt+1'b1; if(cnt>=25'b1011111010111100000111111)//25000000-1,把 50MHz 分
频为 2Hz begin cp0<=~cp0; cnt<={25{1'b0}}; end
endmodule
子模块 3:
module cnt6( input tc, input cr, output reg [3:0]q6=0 ); always@(posedge tc or negedge cr) begin if(~cr) q6<=4'b0000; else if(q6>=4'b0101) q6<=4'b0000;
可变模计数器
一、实验目的:1. 掌握用 VHDL 硬件描述语言做电路综合设计方法。
2. 熟悉掌握程序的编译、仿真、生成模块及芯片引脚号码锁定方法并下载到目标芯片。
二、实验仪器:ZY11EDA13BE 型实验箱三、实验内容及要求:1. 设计一个可变模计数器。
2. 设计一个可变模计数器, 计数器有 3个触发器构成, 在外部控制信号 S2和 S1的控制下分别实现模 3、模 5、模 7和模 8计数器,即(1 S2S1=00时,实现模 3计数,触发器的状态一次0→ 1→ 2→ 0;(2 S2S1=01时,实现模 5计数,触发器的状态一次0→ 1→ 2→ 3→ 4→ 0;(3 S2S1=10时,实现模 7计数,触发器的状态一次0→ 1→ 2→ 3→ 4→ 5→ 6→ 0;(4 S2S1=11时,实现模 7计数,触发器的状态一次0→ 1→ 2→ 3→ 4→ 5→ 6→7→ 0; 并将结果输出到数码管上。
四实验程序二四译码部分LIBRARY IEEE;ENTITY M2_45 ISPORT(A: IN STD_LOGIC_VECTOR(1 DOWNTO 0; Y3,Y2,Y1,Y0: BUFFER STD_LOGIC;END M2_45;ARCHITECTURE A OF M2_45 ISSIGNAL SEL :STD_LOGIC_VECTOR(1 DOWNTO 0; SIGNAL QN :STD_LOGIC_VECTOR(2 DOWNTO 0; BEGINSEL(0<=A(0;SEL(1<=A(1;WITH SEL SELECTQN<="0001"WHEN"00", "0010"WHEN"01","0100"WHEN"10","1000"WHEN"11","0000"WHEN OTHERS;Y0<=QN(0;Y1<=QN(1;Y2<=QN(2;Y3<=QN(3;END A;模三部分LIBRARY IEEE;ENTITY MO3 ISPORT(CP,EN:IN STD_LOGIC;Q:OUT STD_LOGIC_VECTOR(2 DOWNTO 0 ;END MO3;ARCHITECTURE A OF MO3 ISSIGNAL QN:STD_LOGIC_VECTOR(2 DOWNTO 0 ; BEGIN PROCESS(CP,ENBEGINIF(EN='0'THENQN<="000";ELSIF(CP'EVENT AND CP='1'THENIF(QN="010"THENQN<="000";ELSEQN<=QN+1;END IF;END IF;END PROCESS;Q<=QN;END A;模五部分LIBRARY IEEE;ENTITY MO5 ISPORT(CP,EN:IN STD_LOGIC;Q:OUT STD_LOGIC_VECTOR(2 DOWNTO 0 ;END MO5;ARCHITECTURE A OF MO5 ISSIGNAL QN:STD_LOGIC_VECTOR(2 DOWNTO 0 ; BEGIN PROCESS(CP,ENBEGINIF(EN='0'THENQN<="000";ELSIF(CP'EVENT AND CP='1'THEN IF(QN="100"THENQN<="000";ELSEQN<=QN+1;END IF;END IF;END PROCESS;Q<=QN;END A;模七部分LIBRARY IEEE;ENTITY MO7 ISPORT(CP,EN:IN STD_LOGIC;Q:OUT STD_LOGIC_VECTOR(2 DOWNTO 0 ;END MO7;ARCHITECTURE A OF MO7 ISSIGNAL QN:STD_LOGIC_VECTOR(2 DOWNTO 0 ; BEGIN PROCESS(CP,ENBEGINIF(EN='0'THENQN<="000";ELSIF(CP'EVENT AND CP='1'THENIF(QN="110"THENQN<="000";ELSEQN<=QN+1;END IF;END IF;END PROCESS;Q<=QN;END A;模八部分LIBRARY IEEE;ENTITY MO8 ISPORT(CP,EN:IN STD_LOGIC;Q:OUT STD_LOGIC_VECTOR(2 DOWNTO 0;END MO8;ARCHITECTURE A OF MO8 ISSIGNAL QN:STD_LOGIC_VECTOR(2 DOWNTO 0 ; BEGINPROCESS(CP,ENBEGINIF(EN='0'THENQN<="000";ELSIF(CP'EVENT AND CP='1'THEN IF(QN="111"THENQN<="000";ELSEQN<=QN+1;END IF;END IF;END PROCESS;Q<=QN;END A;动态扫描部分LIBRARY IEEE;ENTITY CTL ISPORT(CP:IN STD_LOGIC;MO3,MO5,MO7,MO8:IN STD_LOGIC_VECTOR(2 DOWNTO 0; SEL:IN STD_LOGIC_VECTOR(1 DOWNTO 0;COUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0;END CTL;ARCHITECTURE A OF CTL ISBEGINPROCESS(CPBEGINIF(CP'EVENT AND CP='1'THENCASE SEL ISWHEN "00"=>COUT<=MO3(2 DOWNTO 0;WHEN "01"=>COUT<=MO5(2 DOWNTO 0;WHEN "10"=>COUT<=MO7(2 DOWNTO 0;WHEN "11"=>COUT<=MO8(2 DOWNTO 0;WHEN OTHERS=>COUT<="000";END CASE;END IF;END PROCESS;END A;BCD 译码部分LIBRARY IEEE;ENTITY BCDYM ISPORT(D:IN STD_LOGIC_VECTOR(2 DOWNTO 0; Q:OUT STD_LOGIC_VECTOR(6 DOWNTO 0; END BCDYM;ARCHITECTURE QQ OF BCDYM ISBEGINPROCESS(DBEGINCASE D ISWHEN"000"=>Q<="0111111";WHEN"001"=>Q<="0000110";WHEN"010"=>Q<="1011011";WHEN"011"=>Q<="1001111";WHEN"100"=>Q<="1100110";WHEN"101"=>Q<="1101101";WHEN"110"=>Q<="1111101";WHEN"111"=>Q<="0000111";WHEN OTHERS=>Q<="0000000";END CASE;END PROCESS;END QQ;五实验电路图 MO3 CP INPUT VCC CP Q[2..0] EN 0. inst3 M2_45 A[1..0] INPUT VCC A[1..0] Y0 Y1 Y2 Y3 MO5 CP Q[2..0] EN CTL BCDY M D[2..0] CP MO3[2..0] MO5[2..0] inst11 COUT[2..0] Q[6..0] inst inst5 MO7[2..0] MO8[2..0]SEL[1..0] MO7 CP Q[2..0] EN inst10 Q[6..0] inst7 OUTPUT MO8 CP Q[2..0] EN inst8 //。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
模可变计数器设计(一)实验目的1、进一步熟悉实验装置和QuartusⅡ软件的使用;2、进一步熟悉和掌握EDA设计流程;3、学习简单组合、时序电路的EDA设计;4、学习计数器中二进制码到BCD码的转换技巧;5、学习实验装置上数码管的输出方法。
(二)设计要求完成设计、仿真、调试、下载、硬件测试等环节,在EDA实验装置上实现模可变计数器功能,具体要求如下:1、设置一个按键控制改变模值,按键按下时模为10-99之间(具体数值自行确定)的数,没按下时模为100-199之间(具体数值自行确定)的数;2、计数结果用三位数码管十进制显示。
(三)主要仪器设备3、微机1台4、QuartusII集成开发软件1套5、EDA实验装置1套(四)实验步骤主要有三个模块1:一个模20和模119的计数器2:数码管的显示3:BCD的调整源程序:module count (clk,m,en,rst,a,sel,SG,d);input clk,m,en,rst;output [7:0] SG;output [2:0] sel;output a;(* synthesis, keep *) reg clk1;(* synthesis, keep *) wire [3:0] gw,sw,bw;/*(* synthesis, keep *) */reg [3:0]a;reg [11:0] q;reg [11:0] model;reg [7:0] cnt,SG;reg [2:0] sel;reg [0:0]d;output [0:0]d;always @(posedge clk)begin cnt=cnt+1;if (cnt==200) begin clk1=1'b1; cnt=0; endelse clk1=1'b0; //200分频,CLK为数码管扫描频率,CLK1为计数频率if (sel<2) sel=sel+1; else sel=0; end //sel为数码管选择always @(sel) begincase (sel)0: a=bw; //0数码管为百位1: a=sw; //1数码管为十位2: a=gw; //2数码管为个位default: a=0;endcasecase (a)0:SG<=8'b00111111; 1:SG<=8'b00000110;2:SG<=8'b01011011; 3:SG<=8'b01001111;4:SG<=8'b01100110; 5:SG<=8'b01101101;6:SG<=8'b01111101; 7:SG<=8'b00000111;8:SG<=8'b01111111; 9:SG<=8'b01101111; //8段译码值default: SG=8'b11111111;endcase endalways @(m)if (m) model=12'b000000100000; //模值20else model=12'b000100011001; //模值119assign gw=q[3:0];assign sw=q[7:4];assign bw=q[11:8];always @(posedge clk1,negedge rst)beginif (!rst) q=0;else if (en)beginif (q<model)beginif (gw==9) begin q=q+7; if (sw==9) q=q+96; end //BCD调整else q=q+1;endelse q=0;endendalways @(q)if(q<model) d<=0;else d<=1;endmodule波形仿真:Clk1是计数频率,每来一个clk1信号q计数一次如图所示:rst=1有效时开始计数clk为扫描频率sel=0时数码管显示百位a=0sel=1时数码管显示十位a=1sel=2时数码管显示个位a=3m=1 模20计数器m=0 模119计数器管脚分配:SG[0] PIN_F13SG[1] PIN_F14SG[2] PIN_F15SG[3] PIN_E15SG[4] PIN_F16SG[5] PIN_F17SG[6] PIN_E18SG[7] PIN_F18clk PIN_C13en PIN_H8m PIN_J9rst PIN_C5sel[0] PIN_G18sel[1] PIN_G17sel[2] PIN_G16d[0] PIN_G13(五)实验心得本实验主要是三大模块的编写,第一次的实验在老师给的参考代码下进行的,不过错误依然很多,主要有几个重点药掌握,一是首先要编写出能够计数的模块,用m来控制模值的变化m=1时模值为20 m=0时模值为119;二是计数模块都是二进制计数的,而要在数码管上显示计数的话就必须进行BCD调整,并且q是一个是十二位的寄存器,通过把gw=q[3:0]; sw=q[7:4]; bw=q[11:8]赋值的方法;一个个的显示在数码管上,由于clk的频率比较快,所以可以看到三位数码管显示的值,我觉得管脚分配也是比较关键的!一开始我就把个位和百位显示的值搞反了序列信号发生和检测器设计(一)实验目的1、进一步熟悉EDA实验装置和QuartusⅡ软件的使用方法;2、学习有限状态机法进行数字系统设计;3、学习使用原理图输入法进行设计。
(二)设计要求完成设计、仿真、调试、下载、硬件测试等环节,在EDA实验装置上实现一个串行序列信号发生器和一个序列信号检测器的功能,具体要求如下:1、先用设计0111010011011010序列信号发生器,其最后6BIT数据用LED显示出来;2、再设计一个序列信号检测器,检测上述序列信号,若检测到串行序列“11101”则输出为“1”,否则输出为“0”;(三)主要仪器设备1、微机1台2、QuartusII集成开发软件1套3、EDA实验装置1套(四)实验步骤主要两部分1:序列信号发生器设置q<=16'b0111010011011010;q[0]<=q[15];Q<=q[15];q[15:1]<=q[14:0] ;通过循环移位串行输出2:序列信号检测器状转移态图一共有六个状态分别为S = 5'd00000,A = 5'd00001,B = 5'd00011,C = 5'd00110,D = 5'd01101,E = 5'd11010;源程序:module xulie(clk,rst,z,Q,led); input clk,rst;output Q,z;output [4:0] led;reg [4:0] led;reg [4:0] state;reg Q,z;reg [4:0] a;reg [15:0] q;parameter S = 5'd00000,A = 5'd00001,B = 5'd00011,C = 5'd00110,D = 5'd01101,E = 5'd11010;always @(posedge clk)beginif(rst==0) beginq<=16'b0111010011011010;endelse beginq[0]<=q[15];Q<=q[15];q[15:1]<=q[14:0] ;endendalways @(posedge clk)beginif(state==D && Q==1)begin z<=1;led<=5'b11101;endelse begin z<=0;led<=5'b00000;endendalways @(posedge clk or negedge rst)if(!rst)beginstate<=S;endelsecasex(state)S: if(Q==1)state<=A;else state<=S;A: if (Q==1)state<=B;else state<= S;B: if (Q==1)state<=C;else state<=S;C: if(Q==0)state<=D;else state<=C;D: if(Q==1)state<=E;else state<=S;E: if(Q==0)state<=S;else state<=A;default: state<=S;endcaseendmodule波形仿真当rst=1是序列信号发生器循环发出0111010011011010 当检测到11101是z=1输出高电平,并且同时使11101序列显示在五个led灯上(五)实验心得做实验之前准备了很多,实验时还是出现了很多问题,一开始序列信号发生器在第一个周期之后就会多出一个0即输出00111010011011010,原因在于Q<=q[15]; q[15:1]<=q[14:0] ;q[0]<=Q;因为q[0]<=Q需要一个时钟的上升沿才能执行,所以就会多输出一个0;其次状态转移图也是关键,需要记忆六个不同的状态;做这个实验让我学到了casex的一些用法;进一步了解编写verilog语言。