【FPGA】EDA技术综合设计 带同步复位和使能控制端的4位二进制加1计数器

带同步复位和使能控制端的4位二进制加1计数器:

1、设计原理
计数器的原理本质上和分频器一样,对板子上的原有时钟的周期进行计数,达到一定周期后进行重新计数,这时记为一个数,Q加1,达到最大值后,Q清零,使能端en,当en为低电平无效的时候,不进行计数,Q保持为0,按下复位键后计数器进行重新计数。

2、设计源文件

`timescale 1ns / 1ps
/
// Create Date: 2022/06/07 21:13:22
// Module Name: couter_4
/

module couter_4(clk,rst,en,D,W, Q);
input clk;//时钟输入
input rst;//复位
input en;//使能
output reg[6:0]D;//段选
output reg[1:0]W;//位选
output reg[3:0]Q;//四位二进制输出
reg [25 : 0] cnt_reg=7'h0000000;  //计数值
reg[13:0]x=14'b00000000000000;//两位数码管的段码组合
initial begin//初始化
D=7'b0000000;//不亮
Q=4'b0000;
W=2'b00;
end
always @(posedge clk) 
    begin
    if(en==1)
        begin
        if (rst == 1)  //判断是否清零复位
            cnt_reg <= 0; //如果是,清零
         else
            cnt_reg <= cnt_reg + 1; //没有清零,能使能,计数器才加一 
         end    
     else 
        cnt_reg <= 0;         
    end
//动态显示计数   
reg [19:0] clkdiv;
always@(posedge clk)
    begin
    if(rst==1)
        clkdiv<=0;
    else
        clkdiv<=clkdiv+1;
     end
wire s;   //位选选择
assign s=clkdiv[19];//令s为clkdiv的第一个值,实现较长时间内s的状态改变
 //位选动态显示
always@(*)
    begin
     W=2'b00;
     W[s]=1;//第s位选中的位选端打开,进行显示
    end 
 //对段选码输出十位和个位的选择  
always@(*)
    case(s)
      0:D=x[6:0];
      1:D=x[13:7];
      default:;
    endcase 
always @(posedge clk) 
    begin
    if (en == 1)  //判断是否使能
        begin
        if(rst == 1)//判断是否复位
            Q <=4'b0000;//如果是,清零
        else
            if(cnt_reg == 7'h5f5e100)//100000000,1hz
                     Q<=Q+1; 
        end        
        else
          Q <=4'b0000; 
    end             
always@(*)
begin
    case(Q)
    4'b0000:x = 14'b01111110111111; // 00
    4'b0001:x = 14'b01111110000110; // 01
    4'b0010:x = 14'b01111111011011; // 02
    4'b0011:x = 14'b01111111001111; // 03
    4'b0100:x = 14'b01111111100110; // 04
    4'b0101:x = 14'b01111111101101; // 05
    4'b0110:x = 14'b01111111111101; // 06
    4'b0111:x = 14'b01111110000111; // 07
    4'b1000:x = 14'b01111111111111; // 08
    4'b1001:x = 14'b01111111100111; // 09
    4'b1010:x = 14'b00001100111111; // 10
    4'b1011:x = 14'b00001100000110; // 11
    4'b1100:x = 14'b00001101011011; // 12
    4'b1101:x = 14'b00001101001111; // 13
    4'b1110:x = 14'b00001101100110; // 14
    4'b1111:x = 14'b00001101101101; // 15
    default:x = 14'b00000000000000;
  endcase 
 end
endmodule

3、仿真测试文件

`timescale 1ns / 1ps
module sim_couter4();
reg clk;
reg rst;
reg en;
wire [6:0] D;  //段选信号
wire [1:0] W;  //片选信号
wire [3:0] Q;  //四位二进制数计数器的值
couter_4 u1(clk,rst,en,D,W, Q);
parameter PERIOD = 10;
always begin
clk = 0;//开始时clk为0
#(PERIOD/2) clk = 1; 
#(PERIOD/2);
end
initial begin
rst=1;//开始时清零位为1
en=0;//没有使能
#10
rst=0;//改变rst状态
en=1;//改变使能状态
#10
rst=1;
#10
rst=0;
end
endmodule

仿真结果
在这里插入图片描述
实验板部分结果
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这是一个比较典型的FPGA数字电路设计问题。下面是一个简单的设计原理: 1. 时钟信号:计数器需要一个时钟信号来进行计数。时钟信号可通过一个需要计数的高速时钟信号分频得到。可以使用FPGA内部的时钟分频器模块来实现。 2. 同步复位和使能控制端:计数器需要一个同步复位信号和一个使能控制信号。同步复位信号可以通过按键或外部信号触发,使计数器重新从0开始计数。使能控制信号可以通过开关或外部信号控制,使计数器在特定时间段内停止计数。 3. 4二进制1计数器设计一个4二进制1计数器,可以使用FPGA内部的计数器模块来实现。计数器根据时钟信号进行计数,每计数到15时,需要将计数值清零。 4. 共阴极数码管显示:将计数器的输出值转换为七段显示的信号,将信号驱动共阴极数码管显示。可以使用FPGA内部的七段译码器模块和数码管驱动模块来实现。 5. 可逆计数和可装载预置数:如果需要实现可逆计数和可装载预置数功能,可以在计数器模块中添控制逻辑。例如,当计数器需要逆向计数时,可以在控制逻辑中将计数器的计数方向反转。当需要装载预置数时,可以在控制逻辑中将预置数值载到计数器中。 6. 两共阴极数码管显示十进制数:如果需要实现两共阴极数码管显示十进制数的功能,可以在计数器模块中添BCD码转换器。将计数器的输出值转换为BCD码,然后将BCD码转换为两个七段信号,分别驱动两共阴极数码管显示。可以使用FPGA内部的BCD码转换器模块来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值