一个问题:六位八段数码管(Verilog)

[复制链接]
发表于 2024-6-2 13:20:38 | 显示全部楼层 |阅读模式
【基本信息】

需求:verilog步伐,表现任意六位字符或数值,包罗点号,且可以或许按需点亮位数。(学习篇)
芯片型号:cyclone Ⅳ EP4CE10F17C8
数码管属性:六位、八段
【终极成果图】


经过多轮测试,末了代码步伐满足设计要求,但结合仿真发现了一个问题,仿真和上机不匹配,当然还是要以上机为准。
【模块例化图】


这里就是简单地赋个初始值,来测试digital模块,终极是要seg_led和seg_sel的表现变革。
【verilog步伐】

1、digital模块

模块化设计,六个位上的值直接拆开做处理,分析起来清晰。sel_cnt表现目前要表现的位数(从右往左),即sel_cnt = 6代表全亮。dp_cnt表现点号所在位数,若dp_cnt=0则代表没有点号。clk_2khz为数码管的刷新信号。
  1. module digital
  2. (
  3.     input           sys_clk      ,
  4.     input           sys_rst      ,
  5.     input           clk_2khz     ,
  6.    
  7.     input [3:0]     num6,
  8.     input [3:0]     num5,
  9.     input [3:0]     num4,
  10.     input [3:0]     num3,
  11.     input [3:0]     num2,
  12.     input [3:0]     num1,
  13.     input [2:0]     sel_cnt     ,
  14.     input [2:0]     dp_cnt      ,
  15.    
  16.     output reg[5:0] seg_sel     ,
  17.     output reg[7:0] seg_led      
  18. );
  19. reg[2:0] sel_cnt_tran;
  20. reg[3:0] num;
  21. reg[2:0] tran1;
  22. //endmodule
复制代码
界说了几个变量,sel_cnt_tran用来根据数码管刷新信号更替数码管的位选,而num用来接引各位上的值,数码管根据num编号段选信号。tran1在过程讨论部分做解释。
  1. always @(posedge sys_clk or negedge sys_rst)
  2. begin
  3.     if(!sys_rst)
  4.         sel_cnt_tran = 3'd0;
  5.     else
  6.     if(clk_2khz)begin
  7.         if(sel_cnt_tran < sel_cnt)begin
  8.             tran1 = sel_cnt_tran;
  9.             sel_cnt_tran = sel_cnt_tran + 1'b1;
  10.         end
  11.         else begin
  12.             tran1 = sel_cnt_tran;
  13.             sel_cnt_tran = 3'd0;
  14.         end
  15.     end
  16. end
复制代码
上述代码就是位选更替,可以直观得到,tran1比sel_cnt_tran要晚上一个数码管刷新周期。
[code]always @(posedge sys_clk or negedge sys_rst)begin    if(!sys_rst)        seg_sel
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5

GMT+8, 2025-7-2 09:28 , Processed in 0.081849 second(s), 29 queries 手机版|qidao123.com技术社区-IT企服评测▪应用市场 ( 浙ICP备20004199 )|网站地图

快速回复 返回顶部 返回列表