FPGA设计8位异步、同步二进制计数器

举报
timerring 发表于 2022/07/29 18:27:32 2022/07/29
【摘要】 ​ 【实验要求】 实验内容与原理说明(包括框图、逻辑表达式和真值表)。实验模块程序代码(设计模块Design Block)和激励代码(激励模块Test Bench)。仿真波形图。综合得到的门级电路图。实验结果分析及思考。每一次报告用Word文档提交,文件名:姓名_班级_第几次实验_学号。【实验软件工具】QuartusII;ModelSim SE.【一】设计一个8位异步二进制计数器模块1. 实...

 【实验要求】 

  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端输入一个脉冲,触发器状态就翻转一次,即其原理框图如下:

编辑

 对应的真值表如下所示:

编辑

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. 波形仿真图

编辑


4.门级电路图

编辑


【二】设计一个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. 波形仿真图

编辑

4.门级电路图

编辑


【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。