用verilog HDL语言设计可逆计数器。
用verilog HDL语言设计可逆计数器。
西安邮电学院
实验报告书
系部名称:电子工程学院学生姓名:xxx
专业名称:xxxx
班级:xxxx
实验时间:2011 年11月17日
1、掌握可逆计数器的工作原理。
2、学习用verilog HDL语言设计可逆计数器。
二、实验设备:
计算机一台,TD-EDA实验箱一台
三、实验内容:
用verilog HDL语言设计可逆计数器并进行仿真、引脚分配及下载到电路开发板进行功能验证。
四、实验程序:
module keni8(clk,enable,sum,col);
input clk,enable;
output[7:0] sum;
reg[7:0] sum;
output col;
reg col;
always @(posedge clk )
if(enable==1)
sum=sum+1;
else if(enable==0)
sum=sum-1;
else if(sum >= 8)
begin
sum=0;
col=1;
end
endmodule
五、运行结果:
1、在编程过程中,需小心谨慎,特别是注意标点符号的标注。
2、实验结果有一定的延时。
3、实验前需对TD-EDA实验箱进行了解,这样可以使实验更有效率。
模可变计数器设计(Verilog语言)解答
模可变计数器设计(一)实验目的1、进一步熟悉实验装置和Quartus n软件的使用;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(qvmodel) d<=0; else d<=1; endmodule波形仿真:iimulatioin WaveformsSimulation sode : TillingA.B Master Time Sar19L9 ns ■[POinler: 39.3^1 us Imeival:39.32 us Stan :End:he. 14 us 37.. 42 UH 33. 7 us39.9B LLS4k 26 us54 us 4X B2 usP 1 i111■Clk1是计数频率,每来一个 clk1信号q 计数一次Simula ion Wa^efor™ Sinulatlon lode: Tiling如图所rst=1有效时开始计数 clk 为扫描频率sel=0时数码管显示百位 a=0 sel=1时数码管显示十位 a=1 sel=2时数码管显示个位 a=3 m=1模20计数器 m=0模119计数器管脚分配:* I HI Ik * Jij19.3ns J hRoirter.6fl.H us Interval.68.09 UE Slarl End.lane<>0□ S&elk<>1B clkl曲+ 0-L玮tT IF Len^1.nCH- 1±1 sei尬1.田Q B i辭El 勿u 3.dM68.14 us63.16 us ■6E. 18 usI63.22 us 68. 24 usW [1] X [3]连[01 X [1] X [3]迪[0] X [1] X [3] ® [o] X [1] X [3]址[0] II :MasierTiiTiB Bar.68.12 usIIISG[0] SG[1] SG[2] SG[3] SG[4] SG[5] SG[6] SG[7] clkPIN_F13PIN_F14PIN_F15PIN_E15PIN_F16PIN_F17PIN_E18PIN_F18 PIN_C13en PIN_H8m rst sel[0] sel[1] sel[2] d[0] PIN_J9PIN_C5PIN_G18PIN_G17PIN_G16 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 n软件的使用方法;2 、学习有限状态机法进行数字系统设计;3、学习使用原理图输入法进行设计。
同步可逆十进制计数器verilog代码
同步可逆十进制计数器verilog代码以下是一个同步可逆十进制计数器的Verilog代码:```module sync_reversible_counter(input clk, // 输入时钟信号input reset, // 输入复位信号output reg [3:0] count // 输出计数器值);// 定义状态变量reg [2:0] state;// 初始化状态变量和计数器值initial beginstate = 3'b000;count = 4'b0000;end// 状态转移逻辑always @(posedge clk) beginif (reset) begin // 复位信号为高电平时,将状态变量和计数器值重置为初始值state <= 3'b000;count <= 4'b0000;end else begin // 否则进行状态转移操作case (state)3'b000: begin // 当前状态为000时,下一状态为001,计数器加1state <= 3'b001;count <= count + 1;end3'b001: begin // 当前状态为001时,下一状态为010,计数器加1state <= 3'b010;count <= count + 1;end3'b010: begin // 当前状态为010时,下一状态为011,计数器加1state <= 3'b011;count <= count + 1;end3'b011: begin // 当前状态为011时,下一状态为100,计数器加1state <= 3'b100;count <= count + 1;end3'b100: begin // 当前状态为100时,下一状态为101,计数器加1state <= 3'b101;count <= count + 1;end3'b101: begin // 当前状态为101时,下一状态为110,计数器加1state <= 3'b110;count <= count + 1;end3'b110: begin // 当前状态为110时,下一状态为111,计数器加1state <= 3'b111;count <= count + 1;end3'b111: begin // 当前状态为111时,下一状态为000,计数器加1state <= 3'b000;count <= count + 1;endendcaseendendendmodule```这个Verilog代码实现了一个同步可逆十进制计数器。
可逆计数器设计
安康学院HDL数字系统课程设计报告书课题名称:可逆计数器设计姓名:学号:2009222407院系:电子与信息工程系专业:电子信息工程指导教师:时间:2011-12-19课程设计项目成绩评定表设计项目成绩评定表课程设计报告书目录设计报告书目录一、设计目的 (1)二、设计思路 (1)三、设计过程 (1)3.1、系统方案论证 (1)3.2、模块电路设计 (2)四、系统调试与结果 (5)五、主要元器件与设备 (5)六、课程设计体会与建议 (5)6.1、设计体会 (5)6.2、设计建议 (6)七、参考文献 (6)一、设计目的1、熟悉modelsim的基本操作和功能。
2、掌握modelsim实现仿真的流程。
3、掌握可逆计数器的设计思路。
4、了解可逆计数器的组成及工作原理。
5、熟悉可逆计数器的设计和制作。
二、设计思路1、设计抢答器电路。
2、设计可预置时间的定时电路。
3、设计报警电路。
4、设计时序控制电路。
三、设计过程3.1、系统方案论证数字抢答器总体方框图如图1所示。
图 1 数字抢答器框图其工作原理为:接通电源后,主持人将开关拨到“清除”状态,抢答器处于禁止状态,编号显示器灭灯,定时器显示设定时间;主持人将开关置于“开始”状态,宣布“开始”抢答器工作。
定时器倒计时,扬声器给出声响提示。
选手在定时时间内抢答时,抢答器完成:优先判断、编号锁存、编号显示、扬声器提示。
当一轮抢答之后,定时器停止、禁止二次抢答、定时器显示剩余时间。
如果再次抢答必须由主持人再次操作“清除”和“开始”状态开关。
3.2、模块电路设计抢答器电路如图2所示。
图2 数字抢答器电路该电路完成两个功能:一是分辨出选手按键的先后,并锁存优先抢答者的编号,同时译码显示电路显示编号;二是禁止其他选手按键操作无效。
工作过程:开关S 置于“清除”端时,RS 触发器的R 端均为0,4个触发器输出置0,使74LS148的ST =0,使之处于工作状态。
当开关S 置于“开始”时,抢答器处于等待工作状态,当有选手将键按下时(如按下S5),74LS148的输出,010012=Y Y Y ,0=EX Y 经RS 锁存后,1Q=1,BI =1,74LS48处于工作状态,4Q3Q2Q=101,经译码显示为“5”。
基于FPGA的可逆计数器的设计
基于FPGA的可逆计数器的设计作者:牟晨淏黄铁文贺哲明袁申冯洪威王颖来源:《电脑知识与技术》2019年第07期摘要:为了实现可逆计数器的功能,以FPGA为基础,包含主控模块,数码管显示模块,来实现这个设计,通过设计顶层电路,程序编程,模块搭建,仿真运行,性能良好,故实现此功能以供展示。
关键词:FPGA;Verilog;计数器;数码管中图分类号:TP393 文献标识码:A文章编号:1009-3044(2019)07-0242-02开放科学(资源服务)标识码(OSID):既可加1计数又可减1计数的计数器叫作可逆计数器,也叫作双向计数器。
可逆计数器是可以进行正向和反向计数的这种计数器就是把加法计数器和减法计数器的作用合在一起,在逻辑线路上,对计数器的进位和借位脉冲进行适当的控制。
即用一个与或门把进位和借位脉冲加以控制,便构成可逆计数器。
1 原理FPGA是一种运用了逻辑单元阵列LCA的概念,其中包含了逻辑模块输入与输出并且还有IOB与内部连线这几个部分,其中门阵列是可以直接进行编程的器件,他与传统的门阵列进行比较时,会具有相对更小的查找表来实现组合逻辑,在每一个D触发器的输入端都会与一个查找表相互连接,其他的I/O口或者是逻辑电路都由触发器来驱动,这样就形成了一种既可以实现时序逻辑又可以实现组合逻辑功能的一个最基础的逻辑模块,这些模块之间通过金属线进行互相连接或者直接连接到I/O口。
在FPGA中逻辑是由静态单元运行编程数据后来实现的。
各模块或模块与I/O口间的相互连接方式是由存储器单元中的值来决定了逻辑功能,最后呈现出所需要的功能。
分别含有的两个模块一个是数码管模块,一个是主要程序模块。
2 总设计图设计要求及原理:计数器是一种在实践课程中运用较多的一个时序逻辑器件,它的基本功能是统计时间脈冲在一定时间内的个数,从而实现对脉冲实现技术的功能,它的工作原理可以大概论为:在上升或者下降沿到来时,二进制数据在低一位进行自加或自减。
用Verilog HDL设计2位16进制计数器
基于FPGA的系统设计与应用实验二计数器设计实验一、实验目的:学习计数器的设计、仿真和硬件测试方法。
二、实验内容及步骤:1.用Verilog HDL设计2位16进制计数器,由DE2的KEY0输入计数值,在HEX1,HEX0上显示计数值。
2.使用嵌入式逻辑分析仪进行仿真;3.将实验程序下载到DE2运行。
实验注意事项:去抖动三、程序代码module lib22(out1,out2,clk,rst,key);output [6:0] out1,out2;input clk,rst;input key;reg [19:0]count;reg [7:0]in;reg [6:0]out1,out2;reg C,K;reg [9:0] r1;always@(posedge clk)if(count==20'd5000)beginC=~C;count<=1'b0;endelsecount=count+1'b1;always @ (posedge C)beginif(r1<10'd1000)beginK<=1'b0;r1<=r1+1'b1;endelsebeginK<=1'b1;r1<=1'b0;endendalways @ (posedge C,negedge rst) if(!rst)in<=1'b0;else if(!K)beginin=in+8'b1;endalways @ (in[3:0])case(in[3:0])4'b0000:out1=7'b1000000;4'b0001:out1=7'b1111001;4'b0010:out1=7'b0100100;4'b0011:out1=7'b0110000;4'b0100:out1=7'b0011001;4'b0101:out1=7'b0010010;4'b0110:out1=7'b0000010;4'b0111:out1=7'b1011000;4'b1000:out1=7'b0000000;4'b1001:out1=7'b0010000;4'b1010:out1=7'b0001000;4'b1011:out1=7'b0000011;4'b1100:out1=7'b1000110;4'b1101:out1=7'b1100001;4'b1110:out1=7'b0000110;4'b1111:out1=7'b0001110;default:out1=7'b1111111; endcasealways @ (in[7:4])case(in[7:4])4'b0000:out2=7'b1000000;4'b0001:out2=7'b1111001;4'b0010:out2=7'b0100100;4'b0011:out2=7'b0110000;4'b0100:out2=7'b0011001;4'b0101:out2=7'b0010010;4'b0110:out2=7'b0000010;4'b0111:out2=7'b1011000;4'b1000:out2=7'b0000000;4'b1001:out2=7'b0010000;4'b1010:out2=7'b0001000;4'b1011:out2=7'b0000011;4'b1100:out2=7'b1000110;4'b1101:out2=7'b1100001;4'b1110:out2=7'b0000110;4'b1111:out2=7'b0001110;default:out2=7'b1111111; endcaseendmodule四、实验原理图:DE2按键电路图五、实验总结与分析:1.不加去斗时,出现的结果不稳定,不同的DE2板子结果不一样,在加上去斗时,实验结果很稳定;2.去斗可以是检测抖动阶段也可以是不抖动阶段;3.实验二包含了实验一的一些内容,例如数码管的显示,但是加了去抖动程序,使结果更加的稳定。
verilog计数器设计原理
Verilog计数器设计原理1. 介绍计数器是一种常见的数字电路,用于计算和记录事件的数量。
在数字系统中,计数器通常用于生成时钟信号、控制状态机、实现频率分频等应用。
Verilog是一种硬件描述语言,可以用于设计和仿真数字电路。
本文将详细介绍与Verilog计数器设计相关的基本原理。
2. 计数器的基本概念计数器是一种能够在输入脉冲信号的作用下进行累加或递减操作的数字电路。
它通常由触发器和逻辑门组成,触发器用于存储和传递数据,逻辑门用于控制触发器的工作状态。
2.1 同步计数器同步计数器是通过时钟信号来同步各个触发器的状态转换,以实现数据的累加或递减操作。
它包含一个时钟输入端(CLK)和一个复位输入端(RST)。
2.1.1 同步正向计数器同步正向计数器是最简单的同步计数器之一,它能够在每个上升沿时钟信号到达时进行累加操作。
2.1.1.1 原理同步正向计数器由多个触发器和逻辑门组成,其中每个触发器都有一个时钟输入端和一个复位输入端。
当时钟信号的上升沿到达时,触发器的状态将根据输入信号进行更新。
具体的原理如下:1.初始化:将计数器的初始值设置为0。
2.时钟边沿检测:当时钟信号的上升沿到达时,进入下一步操作。
3.累加操作:根据触发器的当前状态进行累加操作。
如果触发器为0,则变为1;如果触发器为1,则变为0。
4.检测溢出:如果最高位触发器由1变为0,则表示计数溢出,需要将其他低位触发器进行进位操作。
2.1.1.2 Verilog代码示例以下是一个4位同步正向计数器的Verilog代码示例:module synchronous_counter(input wire clk,input wire rst,output wire [3:0] count);reg [3:0] count;always @(posedge clk or posedge rst)beginif (rst)count <= 4'b0000;elsecount <= count + 1;endendmodule2.1.2 同步递减计数器同步递减计数器是同步正向计数器的一种扩展,它能够在每个上升沿时钟信号到达时进行递减操作。
十进制可逆加减计数器
时序电路逻辑设计实验人:周铮班级:中法1202班学号:U201215676一实验目的1.掌握用SSI实现简单组合逻辑电路的方法。
2.掌握简单数字电路的安装与测试技术。
3.熟悉使用Verilog HDL描述组合逻辑电路的方法,以及EDA仿真技术。
二实验器件计算机,可编程实验板三实验内容十进制加减可逆计数器设计功能要求:拨码开关键SW1为自动可逆加减功能键,当SW1为HIGH时,计数器实现自动可逆模十加减计数功能,即4个七段数码管上几乎同步显示0—1—2—3—4—...9—8—7—...0—1...的模十自动可逆加减计数结果;当SW1为LOW时,计数器按拨码开关键SW0的选择分别执行加减计数功能。
即当SW0为HIGH时,计数器实现模十加计数功能,即4个七段数码管上几乎同步显示0—1—2—3—4—...9——0—1...的模十加计数结果;当SW0为LOW时,计数器实现模十减计数功能,即4个七段数码管上几乎同步显示9—8—7—...—1—0— (9)—8—7…的模十减计数结果。
四实验设计1.原理设计脉冲发生电路采用555定时器组成的多谐振荡器振荡产生周期为1s的矩形脉冲,从而为计数器提供触发信号。
其中,可以通过R1,R2,C来控制充放电的时间。
加/减计数控制电路主要由74LS138构成。
74LS138芯片是常用的3-8线译码器,常用在单片机和数字电路的译码电路中,74LS138的引脚排列及真值表如图计数单元电路主要由十进制计数器74LS192构成。
74LS192是同步十进制可逆计数器,它具有双时钟输入,并具有清除和置数等功能,其引脚排列图如图功能表如图2.模拟仿真用Verilog HDL语言设计二通道数据选择器实验程序如下:①实验代码module a(input clk,input SW1,input SW0,input clear,input reset,output reg[3:0] s1_reg,output reg[6:0] segdat_reg);reg[26:0] counter;reg[3:0]q;reg x;always@(posedge clk)beginif(clear) begins1_reg<=0;counter<=0;endelsecounter<=counter+1;endalways@(posedge counter[26])beginif (reset) beginq<=0;x<=0;endelsebegincase(SW1)1'd1:begincase(x)1'd0: beginif(q==4'd8)x<=1;q<=q+1;end1'd1: beginif(q==4'd1)x<=0;q<=q-1;endendcaseend1'd0:begincase(SW0)1'd0:beginif(q==4'd0)q<=4'd9;elseq<=q-1;end1'd1:beginif(q==4'd9)q<=4'd0;elseq<=q+1;endendcaseendendcaseendendalways@(q) // 数码管显示处理begincase(q)4'h0:segdat_reg = 7'b0000001; //04'h1:segdat_reg = 7'b1001111; //14'h2:segdat_reg = 7'b0010010; //24'h3:segdat_reg = 7'b0000110; //34'h4:segdat_reg = 7'b1001100; //44'h5:segdat_reg = 7'b0100100; //54'h6:segdat_reg = 7'b0100000; //64'h7:segdat_reg = 7'b0001111; //74'h8:segdat_reg = 7'b0000000; //84'h9:segdat_reg = 7'b0000100; //9default:segdat_reg=7'b0111000; //Fendcaseendendmodule②测试文件test代码module test;// Inputsreg clk;reg SW1;reg SW0;reg clear;reg reset;// Outputswire [3:0] s1_reg;wire [6:0] segdat_reg;// Instantiate the Unit Under Test (UUT)a uut (.clk(clk),.SW1(SW1),.SW0(SW0),.clear(clear),.reset(reset),.s1_reg(s1_reg),.segdat_reg(segdat_reg));initial begin// Initialize Inputsclk = 0;SW1 = 0;SW0 = 1;clear = 1;reset = 1;// Wait 100 ns for global reset to finish#100;// Add stimulus hereendendmodule③管脚设置ucf文件代码# PlanAhead Generated physical constraintsNET "SW0" LOC = P11;NET "SW1" LOC = L3;NET "clear" LOC = K3;NET "clk" LOC = B8;NET "reset" LOC = B4;NET "segdat_reg[0]" LOC = M12;NET "segdat_reg[1]" LOC = L13;NET "segdat_reg[2]" LOC = P12;NET "segdat_reg[3]" LOC = N11;NET "segdat_reg[4]" LOC = N14;NET "segdat_reg[5]" LOC = H12;NET "segdat_reg[6]" LOC = L14;NET "s1_reg[0]" LOC = F12;NET "s1_reg[1]" LOC = J12;NET "s1_reg[2]" LOC = M13;NET "s1_reg[3]" LOC = K14;# PlanAhead Generated IO constraintsNET "clk" SLEW = FAST;④模拟仿真顶层原理图⑤模拟仿真波形图五实验心得本次实验要求用Verilog HDL语言做出十进制可逆加减计数器并进行模拟仿真,其中在代码部分出现多次bug,后经过仔细检查发现是测试文件未加限制的原因,最终做出了模拟仿真。
基于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+HDL语言设计分频器和32位计数器
i<i+1l
end
cs)∥有片选信号
end endrnodule
begin if(addr)
aceuh<2data}
该模块已通过软件仿真,符合设计要求。并已将程序下载到FPGA芯片,在电路板上与 系统进行联调,已证明设计达到预期功能,正式投入使用。
参 考 文 献
1夏宇闻.复杂数字电路与系统的VerilogHDL设计技术.北京t北京航空航天大学出版杜,1999.1—86 2阎石鼓字电子技术基础.北京:高等教育出版社.1 997.224--295 3束万焘·罗 车,吴顺军.CPI,D技术及其盥用西安:西安电子科技大学出版社,1999.30】oo
end end
output
elkl.c}//输出时钟和计数进位信号
j
wirte[15
reg
பைடு நூலகம்
O]data—reg·dataI
c,clkl{
if(i>=119) 计数值的高16位数和低
begin
∥对输人时钟进行J20分频
reg[1 5:O]aceub.aecul;
1
6位数
j<=0; clkl<=~clkl;
第23卷第6期 2002年1 1月
微计算机应用
MICROCOMPUTER APPLICATIONS
Vol
23.N。.6
Nov-,2002
用Ver|log
HDL语言设计分频器和32位计数器
谈艳云 罗志强
100083)
仍局
(北京航空航天大学电子工程东北京
擅要t介绍一种软件实现分频器和32位计数器的设计思路.即采用大规模可编程逻辑芯片.
+PLUS
II仿真正是一种实用的EDA软件,它具有原理图输入和文本输入(采用硬件描述语
基于Verilog语言的4位二进制可逆计数器的设计
基于Verilog语言的4位二进制可逆计数器的设计作者:杨柳李百伦徐杨李鹏飞殷海博葛楠来源:《电脑知识与技术》2019年第09期摘要:此次设计介绍了Verilog-HDL语言在可逆计数器的具体应用,给出了仿真波形并下载到FPGA开发板上实际进行验证。
说明了实现电子电路的自动化设计(EDA)过程和EDA 技术在现代数字系统中的重要地位及作用.关键词:Verilog-HDL;EDA;FPGA;开发板;仿真中图分类号:TP311 文献标识码:A文章编号:1009-3044(2019)09-0219-021 绪论1.1 Verilog HDL 语言1983 年, GDA公司的 Phil Moorby首先创立Verilog HDL语言。
后来phil morrby变成Verilog-XL 的主要的设计师以及(Cadence Design System)的第一合伙人。
一年后,第一个有关 Verilog-XL 的仿真器由Moobry设计,在1986年他提出的XL算法可以用于快速门仿真,又对 Verilog HDL 的发展产生深远的影响。
1.2 EDA技术的优势1)抽象的行为以及功能的描述,在各个内部线路的结构可以使用HDL对数字系统进行,从而可以进行计算机的模拟验证在电子设计各个阶段、各个层次,进而提高设计过程准确性。
既能缩短设计的周期,也能很大程度降低设计的成本。
2)EDA可以自动完成设计过程,依赖于种类库。
例如:在逻辑综合时由综合库,在逻辑仿真时有模拟库,以及在版图综合时又版图库,在测试综合时有测试库等。
3)渐渐强大的逻辑设计仿真测试技术,很大程度上提高大规模的系统电子设计自动化,是EDA中最具有电子现代化设计的技术特征的功能,对如今自动化生产做出巨大的贡献。
1.3 FPGA介绍FPGA (Field Programmable Gate Array)为现场可编程门阵列。
基于PAL、GAL、FPLD 等一些可编程器件,FPGA在此基础上进行深入发展。
verilog计数器代码
Verilog计数器代码1. 介绍计数器是数字电子电路中常见的组件之一,用于记录和显示特定事件的次数。
Verilog是一种硬件描述语言,可用于设计和模拟数字电路。
本文将介绍如何使用Verilog编写一个简单的计数器代码。
2. 计数器的基本原理计数器的基本原理是通过输入的时钟信号进行计数。
每当时钟信号的边沿到来时,计数器的值加1。
计数器可以根据需要进行设置,例如可以设置计数器的初始值、计数器的上限等。
3. Verilog计数器代码的编写下面是一个简单的Verilog计数器代码示例:module counter (input wire clk,input wire reset,output reg [7:0] count);always @(posedge clk or posedge reset) beginif (reset)count <= 0;elsecount <= count + 1;endendmodule代码中定义了一个名为counter的模块,该模块具有三个端口:clk、reset和count。
其中,clk为时钟信号输入端口,reset为复位信号输入端口,count为计数值输出端口。
always @(posedge clk or posedge reset)表示在时钟信号的上升沿或复位信号的上升沿时执行下面的代码块。
if (reset)表示当复位信号为高电平时,将计数器的值设置为0,否则将计数器的值加1。
4. 计数器的测试为了验证计数器的功能,我们可以编写一个简单的测试代码来模拟时钟信号和复位信号的变化。
下面是一个测试代码示例:module counter_tb;reg clk;reg reset;wire [7:0] count;counter uut (.clk(clk),.reset(reset),.count(count));always begin#5 clk = ~clk;endinitial beginclk = 0;reset = 0;#10 reset = 1;#20 reset = 0;#100 $finish;endendmodule测试代码中定义了一个名为counter_tb的测试模块。
同步可逆十进制计数器verilog代码
同步可逆十进制计数器Verilog代码1. 引言同步可逆十进制计数器是一种常见的数字电路设计,用于在数字系统中实现计数功能。
本文将详细介绍同步可逆十进制计数器的设计和实现,包括Verilog代码的编写和功能的实现。
2. 设计原理同步可逆十进制计数器是一种基于时钟信号的计数器,通过时钟信号的边沿触发来实现计数功能。
每当时钟信号的边沿到达时,计数器将自动加一,并将结果输出。
当计数器达到最大值时,会自动回到初始值重新计数。
3. Verilog代码实现以下是一个基本的同步可逆十进制计数器的Verilog代码示例:module synchronous_counter(input wire clk, // 时钟信号output wire [3:0] count // 计数输出);reg [3:0] count_reg; // 计数寄存器always @(posedge clk) beginif (count_reg == 9) begincount_reg <= 0;end else begincount_reg <= count_reg + 1;endendassign count = count_reg;endmodule4. Verilog代码解析4.1 模块定义首先,我们定义了一个模块synchronous_counter,该模块具有一个输入信号clk 和一个输出信号count。
4.2 寄存器定义我们使用reg关键字定义了一个 4 位的寄存器count_reg,用于保存当前的计数值。
4.3 时钟边沿触发在always @(posedge clk)块中,我们使用posedge关键字来指示时钟的上升沿触发。
也可以使用negedge来指示时钟的下降沿触发。
4.4 计数逻辑在时钟的上升沿触发时,我们检查当前的计数值。
如果计数值等于 9,则将计数值重置为 0;否则,将计数值加一。
4.5 输出赋值最后,我们使用assign关键字将计数寄存器的值赋给输出信号count。
可逆计数器设计报告
一、题目(二)2、加/减可逆计数器二、要求:.设计一个4位二进制加/减可逆计数器。
控制信号为1时,加计数;0时,减计数。
要求写出Verilog代码,给出仿真波形(能反映出所有工作状态)。
三、思路方法:题目要求的计数器是一个带有低电平负载和清零输入端的同步4位二进制计数器。
内部应该像‘163一样采用D触发器而非T触发器,这样便于实现载入和清零功能。
每个D触发器的输入由一个2输入多路复用器驱动,这个复用器由1个或门和2个与门构成。
如果输入信号CLR_L有效,多路复用器的输出就为0。
反之,如果输入信号LD_L有效,上面那个与门就把输入数据传送到输出端。
如果CLR_L和LD_L都无效,下面的与门就把”异-或-非”门(XNOR)的输出传送到多路复用器的输出端。
它的二进制计数顺序既可以按升序进行也可以按降序进行,由输入信号UP/DN的值来控制。
当UP/DN为1时,按升序计数;当UP/DN为0时,按降序计数。
四、仿真结果及分析1、Verilog代码module _counter(CLK,CLR_L,LD_L,ENP_L,ENT_L,UPDN,D,Q,RCO_L);input CLK,CLR_L,LD_L,ENP_L,ENT_L,UPDN;input [3:0]D ;output [3:0]Q;output RCO_L;reg [3:0]Q;reg RCO_L;always @ (posedge CLK) //Creat the counter f-f behaviorif (!CLR_L) Q <= 4'b0;else if(!LD_L) Q <= D;else if(!ENT_L && !ENP_L && UPDN) Q <= Q+1;else if(!ENT_L && !ENP_L && !UPDN) Q <= Q-1;else Q <=Q;always @ (Q or ENT_L or UPDN) //Creat RCO_L combinational outputif (!ENT_L && UPDN && (Q == 4'd15)) RCO_L = 0;else if (!ENT_L && !UPDN && (Q == 4'd0)) RCO_L = 0;else RCO_L = 1;endmodule2、所有功能的仿真结果(1)加计数:计数器工作再自由计数模式且UPDN=1,计数器从0000加计数到1111时,RCO_L输出一个周期的低电平,然后计数器跳回0000重新开始计数。
FPGA实验报告8__模8可逆计数器
Lab 8 模8可逆计数译码器集成1101班1.实验目的熟悉用Quartus编译Verilog语言的方法。
掌握用Verilog HDL 语言描述模8可逆计数器和3-8译码器综合的方法。
学会FPGA I/O引脚分配和实现过程。
2.实验内容a)使用Verilog语言实现模8可逆计数器和3-8译码器的设计。
b)得到仿真波形。
c)使用DE0开发板下载。
3.代码分析⏹主模块是模8可逆计数器,输出时以3-8译码器译码输出。
⏹输入时钟信号CP和控制信号CR和EN,输出一个八位二进制数L。
⏹定义一个reg型变量Q,实现可逆计数功能,然后译码输出。
module counter (L,CP,CR,EN);input CP,CR,EN;output [7:0]L;reg [2:0]Q;reg [7:0]L;always @(posedge CP or negedge CR)beginif (~CR) Q<= 3'd0;else if (~EN) //while EN==0,plus countingbeginif (Q>= 3'd7) Q<= 3'd0;elseQ<= Q+3'd1;endelse //while EN==1,decrise countingbeginif (Q<= 3'd0)Q<= 3'd7;elseQ<= Q-3'd1;endcase(Q)3'b000: L=8'b0000_0001;3'b001: L=8'b0000_0010;3'b010: L=8'b0000_0100;3'b011: L=8'b0000_1000;3'b100: L=8'b0001_0000;3'b101: L=8'b0010_0000;3'b110: L=8'b0100_0000;3'b111: L=8'b1000_0000;endcaseendendmodule4.实验步骤(1)打开Quartus9.1软件,选择“File=>New Project Wizard”,在弹出的窗口中输入项目的名称和存储位置。
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,为减计数。
Verilog机组实验计数器
计数器+ALU实验
实验内容
1、ALU实现及仿真
2、计数器实现及仿真
3、ALU+计数器综合实现及仿真
实验原理
1、A LU实现及仿真
使用Verilog HDL代码编程方式构建ALU181元件符号,生成ALU模块。
主要步骤:
(1)建立工程(注意工程名字和文件夹名字一致)
(2)编辑ALU181.v文件,并生成元件符号
(3)建立原理图文件,调用该元件符号
(4)编译
(5)波形仿真(不需引脚绑定)
2、计数器实现及仿真
(1)设计计数器Counter元件。
通过.v文件构建元件符号Counter,生成计数器。
(2)进行波形仿真
(3)进行引脚绑定,下载到实验箱进行验证。
3、ALU+计数器综合实现及仿真
(1)设计计数器Counter元件。
通过.v文件构建元件符号Counter,生成计数器(2)设计ALU元件。
通过.v文件构建元件符号ALU181
(3)计数器产生的信号S[3..0]作为ALU中S[3..0]的输入信号。
实验中程序运行结果及截图
实验心得
通过这次实验的学习。
我们了解到了ALU和计数器的基本原理,通过自己动手实验,进一步了解了其基本结构在实际实验中是怎样发挥作用的。
在实验的过程中,我和小组成员互相配合,共同摸索,虽然几经失败,但是最后在老师的帮助下发现了错误,并且加以改正,最后成功做出了实验,完成了一个简单的ALU+计数器。
在此过程中,增强了动手能力,加深了理解,增进了友谊,是一次不可多得的宝贵的实验经历。
数字电路 综合练习题及答案
Q 3 Q 2 Q1 Q 0
1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 0 0
n
n
n
n
Q 3 Q 2 Q1
n +1
Q0
1011 1100 1101 1110 1111
1100 1101 1110 1111 1011
L
&
Y0
Y1
Y2
Y3
Y4
Y5
Y6
Y7
74H C138 E1 +5V R1 1 k R2 1 k
8 7 6 2 555 5 1 0 .0 1 F 4 3
E2
E3
A2
A1
A0
1 vO1
CET Q3 Q2 Q 1 Q0 CEP CP D3 D2 D1 D0 7 4 LV C 1 6 1
TC
1
PE CR 1
Q0 0
Q1 0
0
0
0 1
1 1 1 0 0
1
1
0
1
1
A 2 3 4
1
1 1 0
1
1 1 1 1 1
1
1 0 0 1 1
0
1 1 0 0 0
1
1 1 1 1 1
1
1 1 1 0 0
1
0 0 0 0 0
0
1 1 0 0 0
2+ 1
Q0
Q1
3+ 0
5
6 7
0
1 1
0
1 1 1
1
1 1 1
1
1 1 0
0
0 1 0
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西安邮电学院
实验报告书
系部名称:电子工程学院学生姓名:xxx
专业名称:xxxx
班级:xxxx
实验时间:2011 年11月17日
1、掌握可逆计数器的工作原理。
2、学习用verilog HDL语言设计可逆计数器。
二、实验设备:
计算机一台,TD-EDA实验箱一台
三、实验内容:
用verilog HDL语言设计可逆计数器并进行仿真、引脚分配及下载到电路开发板进行功能验证。
四、实验程序:
module keni8(clk,enable,sum,col);
input clk,enable;
output[7:0] sum;
reg[7:0] sum;
output col;
reg col;
always @(posedge clk )
if(enable==1)
sum=sum+1;
else if(enable==0)
sum=sum-1;
else if(sum >= 8)
begin
sum=0;
col=1;
end
endmodule
五、运行结果:
1、在编程过程中,需小心谨慎,特别是注意标点符号的标注。
2、实验结果有一定的延时。
3、实验前需对TD-EDA实验箱进行了解,这样可以使实验更有效率。