1502|2

8985

帖子

21

资源

版主

FPGA实现数码管计数 [复制链接]

本帖最后由 littleshrimp 于 2021-12-18 15:52 编辑

功能类似商场那种“按到10秒送金条”活动的计数器, 因为没有按键就用开关替代,建议厂家在板子上放一个按键。功能为开关拨到上边时开始计数,拨到下边时停止计数并显示当前数值。

GW1N_4.gif

代码是我自己写的,数码管的段选使用了@怀揣少年梦的数据 ,http://bbs.eeworld.com.cn/thread-1189456-1-1.html。

因为我是FPGA新手,功能可以实现,但不知道设计的是否合理。有FPGA高手发现问题还希望多多指教,工程文件在本文底部。

在添加注释时还发现了一个问题,综合时提示类似”ERROR (EX3863) : Syntax error near '<='("C:\Users\lu\Documents\fpga_project_3\src\top.v":34)“这样的错误,但是代码里我没找到问题。

image.png

后来发现只要去掉这条注释就可以正常工作,或者把注释和代码中间空一行也可以正常工作,在我看来这是一个比较奇怪的现象,目前没法解释。感兴趣的网友可以帮忙分析分析。

image.png

部分代码:   

module top(
    input clk,                              //50MHz时钟输入
    input sw,                               //开关输入
    output reg[7:0]seg,                     //数码管输出
    output reg[3:0]sel                      //数码管位选
);
wire cnt_clk;                               //计数时钟
wire rfs_clk;                               //刷新时钟

reg[1:0] bcd_index = 2'b0;                  //计数位选(0=个位...3=千位)
wire[3:0] bcd_out;                          //指定位的数值(0~9)
reg[18:0] cnt = 19'b0;                       //计数                      
reg [3:0] bcd[0:3];                         //要输出的数位数组,[0=个位...3=千位][0~9]

//判断开关状态,决定是否更新计数
always@(posedge clk) begin
    if(sw)begin
        bcd[bcd_index] = bcd_out;
    end
end
//cnt计数
always@(posedge clk) begin
    if(cnt == 50_000 - 1)
        cnt <= 19'b0;
    else
        cnt <= cnt + 1'b1;
end
//根据cnt计数更新位选索引
always@(posedge clk) begin
    if(cnt == 0)
        bcd_index <= bcd_index + 1'b1;
end
//根据位选索引控制对应的数据管位选引脚,低电平为选中

always@(posedge clk) begin
    case(bcd_index)
        4'd0:sel <= ~4'b0001;
        4'd1:sel <= ~4'b0010;
        4'd2:sel <= ~4'b0100;
        4'd3:sel <= ~4'b1000;
    endcase
end
//将bcd值转换成对应的数码管段的控制数据
always@(posedge clk) begin
    case(bcd[bcd_index])
        4'd0:seg = 8'hc0;
        4'd1:seg = 8'hf9;
        4'd2:seg = 8'ha4;
        4'd3:seg = 8'hb0;
        4'd4:seg = 8'h99;
        4'd5:seg = 8'h92;
        4'd6:seg = 8'h82;
        4'd7:seg = 8'hf8;
        4'd8:seg = 8'h80;
        4'd9:seg = 8'h90;
        default:seg = 8'hc0;
    endcase
end
//时钟分频
clk_div clk_div_ins(
    .clk(clk),
    .clk1(cnt_clk),
    .clk2(rfs_clk)
);
//4位bcd计数,cnt_clk是计数时钟,rfs_clk时钟决定输出bcd_index对应数位的数值
bcd4 bcd4_ins(
    .cnt_clk(cnt_clk),
    .read_clk(rfs_clk),
    .bit_index(bcd_index),
    .bcd_out(bcd_out)
);
endmodule

工程文件:

  fpga_project_3.rar (105.75 KB, 下载次数: 0)

个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾

回复

1

帖子

0

资源

一粒金砂(初级)

good

回复

684

帖子

0

资源

纯净的硅(中级)

不错,正在学习中.


回复
您需要登录后才可以回帖 登录 | 注册

相关帖子
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表