FPGA设计编程(三) 时序逻辑电路-计数器设计

这篇具有很好参考价值的文章主要介绍了FPGA设计编程(三) 时序逻辑电路-计数器设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

 

【实验要求】 

【实验软件工具】

【实验一】设计一个8位异步二进制计数器模块

1. 实验内容与原理说明

2. 实验模块程序代码和激励代码

(1)设计模块代码

(2)激励模块代码

3. 波形仿真图

4.门级电路图

【实验二】设计一个8位同步二进制计数器模块

1. 实验内容与原理说明

2. 实验模块程序代码和激励代码

(1)设计模块代码

(2)激励模块代码

3. 波形仿真图

4.门级电路图

【实验三】设计一个8位十进制计数器(异步/同步)模块

1. 实验内容与原理说明

2. 实验模块程序代码和激励代码

(1)设计模块代码

(2)激励模块代码

3. 波形仿真图

 4.门级电路图

【实验四】设计一个m序列码产生器模块(要求:码长为31,寄存器级数5,反馈系数为75(八进制)的m序列产生器)

1. 实验内容与原理说明

2. 实验模块程序代码和激励代码

(1)设计模块代码

(2)激励模块代码

3. 波形仿真图

4.门级电路图

【实验结果分析及思考】


【实验要求】 

  1. 实验内容与原理说明(包括框图、逻辑表达式和真值表)。
  2. 实验模块程序代码(设计模块Design Block)和激励代码(激励模块Test Bench)。
  3. 仿真波形图。
  4. 综合得到的门级电路图。
  5. 实验结果分析及思考。
  6. 每一次报告用Word文档提交,文件名:姓名_班级_第几次实验_学号。

【实验软件工具】

  1. QuartusII;
  2. ModelSim SE.

【实验一】设计一个8位异步二进制计数器模块

1. 实验内容与原理说明

构成计数器的低位计数器触发器的输出作为相邻计数触发器的时钟,这样逐步串行连接起来的一类计数器称为异步计数器。时钟信号的这种连接方法称为行波计数。这种异步计数器的计数延迟增加影响它的应用范围。异步清零程序的实现:通过判断最后一个状态,当为下一个状态时,就将输出清零,回到循环起点。

由于八位异步二进制计数器不便形象地展示,这里以三位二进制计数器作以描述,计数器工作前,一般都需要把所有的触发器置“0”,即计数器状态为000。这一过程称清零或复位。清零之后,计数器就可以开始计数了。第一个计数脉冲输入时,在该脉冲的下降沿到来时刻,F1翻转,Q由0变1。Q的正跳变加到F2的CP端,因为触发器都是负跳变触发,所以F2不翻转,计数器的状态为001。第二个计数脉冲输入时,F1又翻转,Q由1变0。Q的负跳变送到F2的CP端,F2翻转,Q= 1。Q的正跳变送到F3的CP端,F3不翻转,计数器状态为010。

按照上述规律,当第七个脉冲输入时,计数器状态为111。如输入第八个脉冲,计数器状态变成000,并产生一个向高位的进位信号。

由上述可知,每向触发器CP端输入一个脉冲,触发器状态就翻转一次,即其原理框图如下:

FPGA设计编程(三) 时序逻辑电路-计数器设计

 对应的真值表如下所示:

FPGA设计编程(三) 时序逻辑电路-计数器设计

2. 实验模块程序代码和激励代码

(1)设计模块代码

module Asyn8count(clk,rst,y);  
input clk;  
input rst;  
output[7:0] y;  
wire[7:0] dy;  
  
D U0(y[0],~y[0],clk,rst);  
D U1(y[1],~y[1],y[0],rst);  
D U2(y[2],~y[2],y[1],rst);  
D U3(y[3],~y[3],y[2],rst);  
D U4(y[4],~y[4],y[3],rst);  
D U5(y[5],~y[5],y[4],rst);  
D U6(y[6],~y[6],y[5],rst);  
D U7(y[7],~y[7],y[6],rst);  
  
endmodule  
  
module D(y,din,clk,rst);  
input clk;  
input din;  
input rst;  
output reg y;  
  
always@(negedge clk or negedge rst) begin  
if(!rst) begin  
y<=0;  
end  
else begin  
y<=din;  
end  
end  
endmodule

(2)激励模块代码

// Verilog Test Bench template for design : Asyn8count  
//   
// Simulation tool : ModelSim (Verilog)  
//   
  
`timescale 1 ps/ 1 ps  
module Asyn8count_vlg_tst();  
// constants                                             
// general purpose registers  
reg eachvec;  
// test vector input registers  
reg clk;  
reg rst;  
// wires                                                 
wire [7:0]  y;  
  
// assign statements (if any)                            
Asyn8count i1 (  
// port map - connection between master ports and signals/registers     
    .clk(clk),  
    .rst(rst),  
    .y(y)  
);  
initial                                                  
begin                                                    
clk<=0;rst<=0;  
#17 rst<=1;  
#6000 $stop;  
end  
always #5 clk<=~clk;  
endmodule 

3. 波形仿真图

FPGA设计编程(三) 时序逻辑电路-计数器设计

4.门级电路图

FPGA设计编程(三) 时序逻辑电路-计数器设计

【实验二】设计一个8位同步二进制计数器模块

1. 实验内容与原理说明

计数器的基本原理是将几个触发器按照一定的顺序连接起来,然后根据触发器的组合状态按照一定的计数规律随着时钟脉冲的变化记忆时钟脉冲的个数。按照计数器各个触发器的时钟是否同步分为同步计数器和异步计数器。同步二进制加法计数器的基本构成方法:将触发器接成 T 触发器;各触发器都用计数脉冲 CP 触发,最低位触发器 的T 输入为 1,其他触发器的 T 输入为其低位各触发器输出信号相与。在同步8位二进制计数器的电路符号中,clk为时钟信号输入端,DATA为预置初值使能端, rst为清零端,en为计数使能端,这些端口均为高电平有效,DOUT为预置计数器初值,Q为计数输出端,COUT为进位信号。

2. 实验模块程序代码和激励代码

(1)设计模块代码

module Sync8count(clk,rst,y);  
input clk;  
input rst;  
output reg [7:0] y;  
  
always@(posedge clk or negedge rst) begin  
    if(~rst) begin  
        y<=0;  
    end  
    else begin  
        y<=y+1;  
    end  
end  
  
endmodule 

(2)激励模块代码

// Verilog Test Bench template for design : Sync8count  
//   
// Simulation tool : ModelSim (Verilog)  
//   
  
`timescale 1 ps/ 1 ps  
module Sync8count_vlg_tst();  
// constants                                             
// general purpose registers  
reg eachvec;  
// test vector input registers  
reg clk;  
reg rst;  
// wirst                                                 
wire [7:0]  y;  
  
// assign statements (if any)                            
Sync8count i1 (  
// port map - connection between master ports and signals/registers     
    .clk(clk),  
    .rst(rst),  
    .y(y)  
);  
initial                                                  
begin                                                    
clk<=0;rst<=0;  
#17 rst<=1;  
#6000 $stop;end  
  
always #5 clk<=~clk;  
endmodule

3. 波形仿真图

FPGA设计编程(三) 时序逻辑电路-计数器设计

4.门级电路图

FPGA设计编程(三) 时序逻辑电路-计数器设计

【实验三】设计一个8位十进制计数器(异步/同步)模块

1. 实验内容与原理说明

根据计数器的构成原理,必须由四个触发器的状态来表示一位十进制数的四位二进制编码。而四位编码总共有十六个状态。所以必须去掉其中的六个状态,至于去掉哪六个状态,可有不同的选择。这里考虑去掉1010~1111六个状态,即采用8421BCD 码的编码方式来表示一位十进制数。

在十进制运算时,当相加二数之和大于9时,便产生进位。可是用BCD码完成十进制数运算时,当和数大于9 时,必须对和数进行加6修正。这是因为,采用BCD码后,在二数相加的和数小于等于9时,十进制运算的结果是正确的;而当相加的和数大于9时,结果不正确,必须加6修正后才能得出正确的结果。因此,当第一次近似求值时,可将它看成每一级是一个4位二进制加法器来执行,就好像X,和Y,是普通4位二进制数一样。设Si`代表这样得到的4位二进制数和,Ci+1`为输出进位,而Si代表正确的BCD和,Ci+1代表正确的进位,那么

当Xi+Yi+Ci<10时,Si= Si`

当Xi+Yi+Ci≥10时,Si=Si`+6

显然,当Ci+1`=1或S`≥10时,输出进位Ci+1=1。因此,可利用C i+1的状态来产生所要求的校正因子。C i+1=1时,校正因子为6;C i+1=0时校正因子为0。

当时钟信号CLK、复位信号RST、时钟使能信号EN或加载信号LOAD中任一信号发生变化,都将启动进程语句PROCESS。此时如果RST为'0',将对计数器清0,即复位。这项操作是独立于CLK的异步(独立)行为;如果RST为'1',则看是否有时钟信号的上升沿;如果此时有CLK 信号,且又测得 EN='1',接下去是判断加载控制信号 LOAD的电平。如果LOAD为低电平,则允许将输人口的4位加载数据置入计数寄存器中,以便计数器在此数基础上累加计数。而若LOAD为高电平,则允许计数器计数;此时若满足计数值小于9,即Q<9,计数器将进行正常计数,即执行语句“Q:=Q+1”,否则对计数器清0。但如果测得EN=’0’,则跳出IF语句,使Q保持原值,并将技术值向端口输出:“DOUT<=Q;”。

第二个IF语句的功能是当计数器Q的计数值达到9时由端口COUT输出高电平,作为十进制计数溢出的进位信号,而当Q为其他值时,输出低电平’0’。

2. 实验模块程序代码和激励代码

(1)设计模块代码

module bit1Dcount(clk,dout,num,rst);  
input clk;  
input rst;  
output reg dout;  
output reg [3:0] num;  
  
always@(posedge clk or negedge rst) begin  
    if(~rst) begin  
        num<=0;  
    end  
    else begin  
        if(num==9) begin  
            num<=0;  
            dout<=1;  
        end  
        else begin  
            num<=num+1;  
            dout<=0;  
        end  
    end  
  
end  
  
endmodule  
  
module bit8Dcount(clk,dout,data,rst);  
input clk;  
input rst;  
output reg dout=0;  
output reg [31:0] data;  
  
wire dout_1,dout_2,dout_3,dout_4,dout_5,dout_6,dout_7;  
wire[31:0] num;  
wire out;  
  
bit1Dcount U0(.clk(clk),.dout(dout_1),.num(num[3:0]),.rst(rst));  
bit1Dcount U1(.clk(dout_1),.dout(dout_2),.num(num[7:4]),.rst(rst));  
bit1Dcount U2(.clk(dout_2),.dout(dout_3),.num(num[11:8]),.rst(rst));  
bit1Dcount U3(.clk(dout_3),.dout(dout_4),.num(num[15:12]),.rst(rst));  
bit1Dcount U4(.clk(dout_4),.dout(dout_5),.num(num[19:16]),.rst(rst));  
bit1Dcount U5(.clk(dout_5),.dout(dout_6),.num(num[23:20]),.rst(rst));  
bit1Dcount U6(.clk(dout_6),.dout(dout_7),.num(num[27:24]),.rst(rst));  
bit1Dcount U7(.clk(dout_7),.dout(out),.num(num[31:28]),.rst(rst));  
  
always@(posedge clk or negedge rst) begin  
    if(~rst) begin  
        data<=0;  
        dout<=0;  
    end  
    else begin  
        data<=num;  
        dout<=out;         
    end  
end  
  
endmodule

(2)激励模块代码

// Verilog Test Bench template for design : bit8Dcount  
//   
// Simulation tool : ModelSim (Verilog)  
//   
  
`timescale 1 ps/ 1 ps  
module bit8Dcount_vlg_tst();  
// constants                                             
// general purpose registers  
reg eachvec;  
// test vector input registers  
reg clk;  
reg rst;  
// wirst                                                 
wire [31:0]  data;  
wire dout;  
  
// assign statements (if any)                            
bit8Dcount i1 (  
// port map - connection between master ports and signals/registers     
    .clk(clk),  
    .data(data),  
    .dout(dout),  
    .rst(rst)  
);  
initial                                                  
begin                                                    
clk<=0;rst<=0;  
#4 rst<=1;  
#130000000 $stop;  
end  
  
always #1 clk<=~clk;  
endmodule

3. 波形仿真图

FPGA设计编程(三) 时序逻辑电路-计数器设计

 4.门级电路图

FPGA设计编程(三) 时序逻辑电路-计数器设计

【实验四】设计一个m序列码产生器模块(要求:码长为31,寄存器级数5,反馈系数为75(八进制)的m序列产生器)

1. 实验内容与原理说明

m序列又叫做伪随机序列、伪噪声(Pseudo Noise,PN)码或伪随机码,是一种可以资先确定、可以重复产生和复制又具有随机统计特性的二进制码序列。在通信系统中有着泛的应用,如扩频通信,卫星通信的码分多址,数字数据中的加密、加扰、同步、误码率测量等领域。

伪随机序列一般用二进制表示,每个码元(即构成m序列的元素)只有“0”或“1”两种取值,分别与数字电路中的低电平或高电平相对应。

m序列是对最长线性反馈移位寄存器序列的简称,它是一种由带线性反馈的移位寄存器所产生的序列,并且具有最长周期。下图所示是一种3位m序列产生器,它将最后两级触发器的输出通过同或门反馈到第一级的输入端,其工作原理是:在清零后,3个触发器的输出均为0,于是同或门的输出为1,在时钟触发下,每次移位后各级寄存器状态都会发生变化。分析该电路的仿真波形图,其中任何一级触发器(通常为末级)的输出都是一个周期序列(或者称为m序列),但各个输出端的m序列的初始相位不同。m序列的周期不仅与移位寄存器的级数有关,而且与线性反馈逻辑和初始状态有关。此外,在相同级数的情况下,采用不同的线性反馈逻辑所得到的周期长度是不同的。

FPGA设计编程(三) 时序逻辑电路-计数器设计

通常,将类似于上图所示电路结构的m序列产生器称为简单型码序列发生器(Simple Shift Register Generator,SSRG),它的一般结构如图4.7.4所示、其中各个触发器构成位移寄存器。M序列反馈系数表如下所示:

 FPGA设计编程(三) 时序逻辑电路-计数器设计

2. 实验模块程序代码和激励代码

(1)设计模块代码

module PNGenerator(clk,rst,en,dout,y);  
input clk;  
input rst;  
input en;  
output dout;  
output reg [4:0] y;  
  
assign dout=y[0];  
  
always@(posedge clk or negedge rst) begin  
    if(~rst) begin  
        y<=5'b00001;  
    end  
    else if(en) begin  
        y[0]<=y[1];  
        y[1]<=y[2];  
        y[2]<=y[3];  
        y[3]<=y[4];  
        y[4]<=y[0]^y[1]^y[2]^y[3];  
    end  
    else begin  
        y<=y;  
    end  
end  
  
endmodule

(2)激励模块代码

// Verilog Test Bench template for design : PNGenerator  
//   
// Simulation tool : ModelSim (Verilog)  
//   
  
`timescale 1 ps/ 1 ps  
module PNGenerator_vlg_tst();  
// constants                                             
// general purpose registers  
reg eachvec;  
// test vector input registers  
reg clk;  
reg en;  
reg rst;  
// wirst                                                 
wire dout;  
wire [4:0]  y;  
  
// assign statements (if any)                            
PNGenerator i1 (  
// port map - connection between master ports and signals/registers     
    .clk(clk),  
    .dout(dout),  
    .en(en),  
    .rst(rst),  
    .y(y)  
);  
initial                                                  
begin                                                    
clk<=0;rst<=0;en<=0;  
#17  
    rst<=1;  
#17  
    en<=1;  
#6000 $stop;      
end  
  
always #5 clk<=~clk;  
  
endmodule

3. 波形仿真图

FPGA设计编程(三) 时序逻辑电路-计数器设计

4.门级电路图

FPGA设计编程(三) 时序逻辑电路-计数器设计

【实验结果分析及思考】

这次实验是设计8位异步二进制计数器模块、8位同步二进制计数器模块、8位十进制计数器以及m序列码产生器模块的实验,我更加理解了在FPGA课本一开始所介绍的,行为描述是最常用的描述方法。在实际的建模中,我从看到题目要求的迷惑,逐渐转变为仔细分析题目要求,建模的自信,很大原因归功于行为描述的简洁与清晰。同样,实验中需要注意的地方是有关于异步、同步还有位数以及进制的问题。

此外,通过实验,也让我从实践的角度理解了异步和同步二进制加法计数器的构成区别:异步二进制加法计数器的构成方法是将触发器接成计数触发器;最低位触发器用计数脉冲 CP 触发,其他触发器用邻低位输出的下降沿触发。而同步二进制加法计数器的构成方法:将触发器接成 T 触发器;各触发器都用计数脉冲 CP 触发,最低位触发器 的T 输入为 1,其他触发器的 T 输入为其低位各触发器输出信号相与。

在程序设计和原理图设计的过程中,我通过对Quartus的练习和使用,锻炼了自己的编程能力,对于Quartus和Modelsim联合仿真也比以往熟练不少,也学会了如何在遇到错误的时候冷静分析原因,例如端口的定义错误,测试程序的逻辑报错等等,通过对程序不断调试和改进,我对于verilog语言的理解有了很大的提升。

相关参考资源已上传:

山东大学FPGA实验参考与报告实验三时序逻辑电路计数器设计-嵌入式文档类资源-CSDN下载山东大学FPGA实验参考与报告实验三时序逻辑电路计数器设计更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/m0_52316372/85900903文章来源地址https://www.toymoban.com/news/detail-430458.html

到了这里,关于FPGA设计编程(三) 时序逻辑电路-计数器设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (数字逻辑笔记)用Verilog实现4位计数器。(时序逻辑)

    实验描述: 输入: Clock:如果计数器enable信号为1,那么在时钟上升沿,count加1 Enable:如果enable为1,那么在时钟上升沿,count加1;如果enable为0,count保持不变 Reset:重置信号,如果reset为0,count重置为0 输出: Count[3:0]:4位计数信号,范围:4‘b0000 – 4’b1111 实现代码: Tes

    2024年02月11日
    浏览(33)
  • OUC数字逻辑Verilog实验二 用Verilog实现4位计数器(时序逻辑)

    clk为模拟的脉冲,reset为重置信号,如果reset为0,则把init的值作为初始值赋值给out,enable为使能端,如果enable为1,则在上升沿根据mode的值,如果mode为1,为加计数,mode为0,为减计数。 仿真图像中, 第1个脉冲,reset为0,为out赋值输入的初始值0010。 第2~6个脉冲,enable为1,

    2024年01月17日
    浏览(35)
  • 基于FPGA的四位数码管显示按键计数器设计(verilog编程)

    软件:Vivado 2022.2 硬件:BASYS 3 设计描述:通过开发板上的四个按键,按下一次记数加一,分别由四个数码管从左到右分别显示四个按键记数情况。 例: 1.初始值为0000,意为无记数 2.当按下第一个按键,记数加一,数码管显示1000 3.再次按下一第一个按键,记数加一,数码管显

    2024年02月08日
    浏览(38)
  • 数字电路13-任意进制计数器设计

    因为市面上的进制计数器的种类优先,所以需要特定进制时,只能自己在已有产品的基础上构成需要的特定进制。 十进制计数器也是通过4位二进制计数器,去掉多余状态所得 根据十进制计数器,可得M进制计数器的特点,即状态数、脉冲数、末状态 如前面的十进制计数器,

    2024年02月07日
    浏览(43)
  • 任意进制加法计数器电路设计

    目录 一、题目 二、时钟发生电路 1、施密特触发电路 2、单稳态电路 3、多谐振荡电路 三、 N进制计数器 1、M的情形 2、MN的情形 2、1  193实现 2、2 192实现 四、设计的小bug 1、两个bug 2、bug的原因及解决 五、仿真源文件的获取 图一 题目要求         如题,我们要设计三部

    2024年02月09日
    浏览(39)
  • 【30-60s计数器电路设计】数电课设

    这是徐州工程学院2021年的电子工艺实习课程作业之一,我是20级计嵌专业的学生。电路方面的东西并不是我们的主修课程,所以在完成这项作业的过程中遇到了许多困难( 特别是在查不到样板的情况下 )。网上也找到过一位仁兄的案例,不过并没有详细的电路运行原理和操

    2024年02月08日
    浏览(37)
  • FPGA实验二:模可变计数器设计

    目录 一、实验目的 二、实验要求 三、实验代码 1.实验源码

    2024年02月12日
    浏览(39)
  • 【FPGA零基础学习之旅#7】BCD计数器设计

    🎉欢迎来到FPGA专栏~BCD计数器设计 ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏与酒 🍹 ✨ 博客主页: 小夏与酒的博客 🎈该系列 文章专栏: FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ 顶层模块中的BCD模块级联: Verilog实现

    2024年02月08日
    浏览(38)
  • FPGA设计开发(基础课题):74LS160计数器芯片设计

    一、设计目的 1、学会用HDL语言设计时序电路; 2、用HDL语言设计74LS160计数器芯片的数字功能。 二、设计原理 计数器是最常用的寄存器逻辑电路,从微处理器的地址发生器到频率计都需要用到计数器。一般计数器可以分为两类:加法计数器和减法计数器。加法计数器每来一个

    2024年02月08日
    浏览(42)
  • 数字逻辑实验之利用D触发器,设计并实现三位扭环计数器

    【 实验要求 】: 采用Moore(摩尔型)电路,利用D触发器,设计并实现三位扭环计数器并用Verilog编程语言写出其代码。 【 实验目的 】  掌握时序逻辑电路的设计方法; 熟悉Vivado2014集成开发环境和; 实现如下图所示的三位扭环计数器。   【 实验环境 】 FPGA虚拟仿真平台。

    2024年02月03日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包