2964|5

10

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

[原创]FPGA开发--数码管扫描 [复制链接]

  本帖最后由 chun912 于 2017-7-25 09:51 编辑

文章摘要:本文主要描述了数码管扫描电路的实现方案;
知识要点:有限状态机,模块例化;

硬件平台: EP4CE6F17C8
开发环境: Quartus II 13.1

数码管扫描模块:

  1. /*
  2. *  功能描述:6位数码管扫描模块
  3. */
  4. module smg_scan(
  5.     input clk,                  // 时钟信号
  6.     input rst_n,                // 复位信号
  7.     output reg[7:0]data_pin,    // 数据引脚,共阳数码管
  8.     output reg[5:0]sel_pin,     // 选通引脚,低电平导通   
  9.     input  [7:0]seg0,           // 数据0
  10.     input  [7:0]seg1,           // 数据1
  11.     input  [7:0]seg2,           // 数据2
  12.     input  [7:0]seg3,           // 数据3
  13.     input  [7:0]seg4,           // 数据4
  14.     input  [7:0]seg5            // 数据5
  15. );
  16.    
  17. //--------------------------------------------------   
  18. // 有限状态机
  19. parameter S_SEG0 = 4'd1;
  20. parameter S_SEG1 = 4'd2;
  21. parameter S_SEG2 = 4'd3;
  22. parameter S_SEG3 = 4'd4;
  23. parameter S_SEG4 = 4'd5;
  24. parameter S_SEG5 = 4'd6;
  25. reg[3:0] state; // 记录当前状态
  26. /*
  27. * 全部刷新时间不能超过10ms,否则人眼可以感觉到闪烁
  28. * 如果刷新时间缩短至5ms以内,则低速摄像机也扑捉不到闪烁
  29. */
  30. parameter FLUSH_COUNT = 50_000; // 单个刷新时间1ms,全部刷新时间为6ms
  31. reg[31:0] count;    // 刷新记数器
  32. always @(posedge clk, negedge rst_n) begin
  33.     if(!rst_n) begin
  34.         sel_pin <= 6'b111111;   // 复位时关闭显示
  35.         state <= S_SEG0;        // 回到初始状态
  36.     end
  37.    
  38.     else if(count >= FLUSH_COUNT) begin  // 定时时间到      
  39.         count <= 0;     // 重新计数      
  40.    
  41.         case(state)     
  42.         S_SEG0: begin
  43.             state    <= S_SEG1;
  44.             sel_pin  <= 6'b111110;  // 片选
  45.             data_pin <= seg0;       // 数据
  46.         end
  47.         
  48.         S_SEG1: begin
  49.             state    <= S_SEG2;
  50.             sel_pin  <= 6'b111101;
  51.             data_pin <= seg1;
  52.         end
  53.         S_SEG2: begin
  54.             state    <= S_SEG3;
  55.             sel_pin  <= 6'b111011;      
  56.             data_pin <= seg2;   
  57.         end
  58.         
  59.         S_SEG3: begin
  60.             state    <= S_SEG4;
  61.             sel_pin  <= 6'b11_0111;     
  62.             data_pin <= seg3;
  63.         end
  64.         
  65.         S_SEG4: begin
  66.             state    <= S_SEG5;
  67.             sel_pin  <= 6'b10_1111;     
  68.             data_pin <= seg4;
  69.         end
  70.         
  71.         S_SEG5: begin
  72.             state    <= S_SEG0; // 最后一个显示完,下一次该显示示第一个了
  73.             sel_pin  <= 6'b01_1111;
  74.             data_pin <= seg5;
  75.         end
  76.         
  77.         default: begin
  78.             state <= S_SEG0;    // 未知状态,返回第一个状态
  79.         end
  80.         endcase
  81.     end
  82.    
  83.     else begin
  84.         count <= count + 1'b1;     // 最后一个时钟沿其实是没计数的;
  85.     end
  86.    
  87. end
  88. endmodule
复制代码



译码器计数器模块:

  1. /*
  2. *  功能描述:异步十进制译码计数器
  3. */
  4. module decoder(   
  5.     clk,    // 计数时钟
  6.     rst_n,  // 异步复位   
  7.     seg,    // 译码输出
  8.     carry   // 进位(做为下级时钟)
  9. );
  10. input  clk;
  11. input  rst_n;
  12. output reg [7:0] seg;
  13. output reg carry;
  14. //------------------------------------------
  15. reg [3:0] count;   // 计数器
  16. // 十进制计数器
  17. always @(posedge clk or negedge rst_n) begin
  18.     if(~rst_n) begin
  19.         count <= 0;
  20.         carry <= 1'b0;  
  21.     end
  22.     else if(count < 9) begin
  23.         count <= count + 1'b1;
  24.         carry <= 1'b0;  
  25.     end
  26.     else begin
  27.         count <= 0;
  28.         carry <= 1'b1;   // 产生进位      
  29.     end        
  30. end
  31. // 组合逻辑
  32. always @(*) begin
  33.     if(~rst_n) begin
  34.         seg <= 8'b1111_1111;    // 全灭
  35.     end
  36.     else begin
  37.         case(count)
  38.         4'd0:
  39.             seg <= 8'b1100_0000;   
  40.         4'd1:
  41.             seg <= 8'b1111_1001;
  42.         4'd2:
  43.             seg <= 8'b1010_0100;
  44.         4'd3:
  45.             seg <= 8'b1011_0000;
  46.         4'd4:
  47.             seg <= 8'b1001_1001;
  48.         4'd5:
  49.             seg <= 8'b1001_0010;
  50.         4'd6:
  51.             seg <= 8'b1000_0010;
  52.         4'd7:
  53.             seg <= 8'b1111_1000;
  54.         4'd8:
  55.             seg <= 8'b1000_0000;
  56.         4'd9:
  57.             seg <= 8'b1001_0000;
  58.         4'd10:
  59.             seg <= 8'b1000_1000;
  60.         default:
  61.             seg <= 8'hff;
  62.         endcase
  63.     end
  64. end
  65. endmodule
复制代码


建立顶层模块(测试用)


  1. /*
  2. *  功能描述:数码管测试程序
  3. */
  4. module smg_test(
  5.     input clk,              // 系统时钟
  6.     input rst_n,            // 系统复位
  7.     output [7:0]data_pin,   // 数据管数据脚
  8.     output [5:0]sel_pin     // 数码管片选脚
  9. );
  10. reg[31:0] timer;    // 定时器
  11. reg tick;
  12. // 模块连接线
  13. wire[7:0]seg0;
  14. wire[7:0]seg1;
  15. wire[7:0]seg2;
  16. wire[7:0]seg3;
  17. wire[7:0]seg4;
  18. wire[7:0]seg5;
  19. wire[7:0]seg6;
  20. wire c0;    // 计数器进位
  21. wire c1;
  22. wire c2;
  23. wire c3;
  24. wire c4;
  25. //-----------------------------------------------   
  26. always @(posedge clk or negedge rst_n) begin
  27.     if(~rst_n)
  28.     begin
  29.         timer <= 0;
  30.         tick  <= 0;
  31.     end   
  32.     else if(timer == 32'd25_000_000)
  33.     begin
  34.         tick  <= 1'b1;
  35.         timer <= 0;         
  36.     end   
  37.     else begin
  38.         tick  <= 0;
  39.         timer <= timer + 1'b1;
  40.     end
  41. end
  42. // 例化数码管显示模块
  43. smg_scan s0(
  44.     .clk(clk),              // 时钟信号
  45.     .rst_n(rst_n),          // 复位信号
  46.     .data_pin(data_pin),    // 数据引脚,共阳数码管
  47.     .sel_pin(sel_pin),      // 选通信号,低电平导通   
  48.     .seg0(seg0),            // 数据
  49.     .seg1(seg1),            // 数据
  50.     .seg2(seg2),            // 数据
  51.     .seg3(seg3),            // 数据
  52.     .seg4(seg4),            // 数据
  53.     .seg5(seg5)             // 数据
  54. );
  55. // 例化6个显示译码器,用于将数字转化为显示段码;
  56. decoder u0(
  57.     .clk(tick),    // 计数时钟
  58.     .rst_n(rst_n), // 异步复位
  59.     .seg(seg0),    // 译码输出
  60.     .carry(c0)     // 进位
  61. );
  62. decoder u1(
  63.     .clk(c0),      // 计数时钟
  64.     .rst_n(rst_n), // 异步复位
  65.     .seg(seg1),    // 译码输出
  66.     .carry(c1)     // 进位
  67. );
  68. decoder u2(
  69.     .clk(c1),      // 计数时钟
  70.     .rst_n(rst_n), // 异步复位
  71.     .seg(seg2),    // 译码输出
  72.     .carry(c2)     // 进位
  73. );
  74. decoder u3(
  75.     .clk(c2),      // 计数时钟
  76.     .rst_n(rst_n), // 异步复位
  77.     .seg(seg3),    // 译码输出
  78.     .carry(c3)     // 进位
  79. );
  80. decoder u4(
  81.     .clk(c3),      // 计数时钟
  82.     .rst_n(rst_n), // 异步复位
  83.     .seg(seg4),    // 译码输出
  84.     .carry(c4)     // 进位
  85. );
  86. decoder u5(
  87.     .clk(c4),      // 计数时钟
  88.     .rst_n(rst_n), // 异步复位
  89.     .seg(seg5),    // 译码输出
  90.     .carry()       // 进位
  91. );
  92. endmodule
复制代码





此帖出自Altera SoC论坛

最新回复

有限状态机貌似不是标准写法,资料上标准写法是用逻辑电路生成state_next。哪个好?  详情 回复 发表于 2017-8-8 11:58
点赞 关注
 
 

回复
举报

4

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
顶一下,虽然于我而言并卵
此帖出自Altera SoC论坛
 
 
 

回复

2万

帖子

74

TA的资源

管理员

板凳
 
支持一下  这样展示很清晰
此帖出自Altera SoC论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(初级)

4
 
很好,谢谢分享。
此帖出自Altera SoC论坛
 
 
 

回复

54

帖子

0

TA的资源

一粒金砂(中级)

5
 
有限状态机貌似不是标准写法,资料上标准写法是用逻辑电路生成state_next。哪个好?
此帖出自Altera SoC论坛
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(初级)

6
 
cncqzxj 发表于 2017-8-8 11:58
有限状态机貌似不是标准写法,资料上标准写法是用逻辑电路生成state_next。哪个好?

肯定是标准的好啊~~~~~
此帖出自Altera SoC论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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