当前位置:   article > 正文

数码管的静态显示(二)

数码管的静态显示(二)

1.原理

要按照上图的顺序传递位选和段选的数据。

因为q0是最高位,共阳极数码管结构是dp....a,所以应该先传入低位a,而a在上图中的8段2进制编码中是seg[7],所以段选信号的顺序是seg[0],...seg[7]。

因为输出信号是两个时钟,所以要进行分频,因为不能太高。因为是4分频,所以计数的最大值是3。

(FPGA使用的晶振太高了, 74hc595 在50MHz的频率下没法正常工作, 所以选一个较为低一点的时钟频率作为触发)

为了让时钟信号能正确采集到数据,所以时钟信号的上升沿应该对准数据的稳定状态,也就是数据的中间。

2.代码

2.1 hc595_ctrl.v

  1. module hc595_ctrl(
  2. input wire sys_clk ,
  3. input wire sys_rst_n ,
  4. input wire [5:0] sel ,
  5. input wire [7:0] seg ,
  6. output reg ds ,
  7. output reg shcp ,
  8. output reg stcp ,
  9. output wire oe
  10. );
  11. wire [13:0] data;
  12. reg [1:0] cnt;
  13. reg [3:0] cnt_bit;
  14. assign oe=1'b0;
  15. assign data={seg[0],seg[1],seg[2],seg[3],seg[4],seg[5],seg[6],seg[7],sel[5],sel[4],sel[3],sel[2],sel[1],sel[0]};
  16. always@(posedge sys_clk or negedge sys_rst_n)
  17. if(sys_rst_n==1'b0)
  18. cnt<=2'd0;
  19. else if(cnt==2'd3)
  20. cnt<=2'd0;
  21. else
  22. cnt<=cnt+1'b1;
  23. always@(posedge sys_clk or negedge sys_rst_n)
  24. if(sys_rst_n==1'b0)
  25. cnt_bit<=4'd0;
  26. else if((cnt==2'd3)&&(cnt_bit==4'd13))
  27. cnt_bit<=4'd0;
  28. else if(cnt==2'd3)
  29. cnt_bit<=cnt_bit+1'b1;
  30. else
  31. cnt_bit<=cnt_bit;
  32. always@(posedge sys_clk or negedge sys_rst_n)
  33. if(sys_rst_n==1'b0)
  34. ds<=1'd0;
  35. else if(cnt==2'd0)
  36. ds<=data[cnt_bit];
  37. else
  38. ds<=ds;
  39. always@(posedge sys_clk or negedge sys_rst_n)
  40. if(sys_rst_n==1'b0)
  41. shcp<=1'b0;
  42. else if(cnt==2'd2)
  43. shcp<=1'b1;
  44. else if(cnt==2'd0)
  45. shcp<=1'b0;
  46. else
  47. shcp<=shcp;
  48. always@(posedge sys_clk or negedge sys_rst_n)
  49. if(sys_rst_n==1'b0)
  50. stcp<=1'b0;
  51. else if((cnt==2'b0)&&(cnt_bit<=4'b0))
  52. stcp<=1'b1;
  53. else if((cnt==2'd2)&&(cnt_bit==4'b0))
  54. stcp<=1'b0;
  55. else
  56. stcp<=stcp;
  57. endmodule

2.2 seg_595_static.v

  1. module seg_595_static
  2. (
  3. input wire sys_clk ,
  4. input wire sys_rst_n ,
  5. output reg ds ,
  6. output reg shcp ,
  7. output reg stcp ,
  8. output reg oe
  9. );
  10. wire [5:0]sel;
  11. wire [7:0]seg;
  12. seg_static #(
  13. .CNT_MAX (25'd24)
  14. )
  15. seg_static_inst(
  16. .sys_clk (sys_clk) ,
  17. .sys_rst_n (sys_rst_n) ,
  18. .sel (sel) ,
  19. .seg (seg)
  20. );
  21. hc595_ctrl hc595_ctrl_inst(
  22. .sys_clk (sys_clk ) ,
  23. .sys_rst_n (sys_rst_n ),
  24. .sel (sel ) ,
  25. .seg (seg ) ,
  26. .ds (ds ),
  27. .shcp (shcp ),
  28. .stcp (stcp ),
  29. .oe (oe )
  30. );
  31. endmodule

2.3 tb_seg_595_ctrl.v

  1. `timescale 1ns/1ns
  2. module tb_seg_595_ctrl();
  3. reg sys_clk;
  4. reg sys_rst_n;
  5. wire ds ;
  6. wire shcp ;
  7. wire stcp ;
  8. wire oe ;
  9. initial
  10. begin
  11. sys_clk=1'b1;
  12. sys_rst_n<=1'b0;
  13. #20
  14. sys_rst_n<=1'b1;
  15. end
  16. always#10 sys_clk=~sys_clk;
  17. seg_595_static seg_595_static_inst
  18. (
  19. .sys_clk (sys_clk ) ,
  20. .sys_rst_n (sys_rst_n) ,
  21. .ds (ds ) ,
  22. .shcp (shcp ) ,
  23. .stcp (stcp ) ,
  24. .oe (oe )
  25. );
  26. endmodule

2.4 tb_seg_595_static.v

  1. `timescale 1ns/1ns
  2. module tb_seg_595_static();
  3. reg sys_clk;
  4. reg sys_rst_n;
  5. initial
  6. begin
  7. sys_clk=1'b1;
  8. sys_rst_n<=1'b0;
  9. #20
  10. sys_rst_n<=1'b1;
  11. end
  12. always#10 sys_clk=~sys_clk;
  13. seg_static #(
  14. .CNT_MAX (25'd24)
  15. )
  16. seg_static_inst(
  17. .sys_clk (sys_clk) ,
  18. .sys_rst_n (sys_rst_n) ,
  19. .sel (sel) ,
  20. .seg (seg)
  21. );
  22. endmodule

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/237789
推荐阅读
相关标签
  

闽ICP备14008679号