在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2754|回复: 1

[求助] 用CPLD控制八段数码管的问题

[复制链接]
发表于 2013-5-8 19:40:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
通过CPLD来控制一个五位的八段数码管显示,显示数字300,我分别用三种有细微差别的方法实现,发现效果不同;一、用一个模块实现,代码如下:



  1. module xianshi(out1,out2,out3,out4,out5,di);
  2. //input [16:0] in;
  3. output wire [7:0] out1,out2,out3,out4,out5;
  4. output wire [9:0] di;
  5. wire [3:0] num5,num4,num3,num2,num1;
  6. reg [7:0] temp1,temp2,temp3,temp4,temp5;
  7. assign di=10'd0;
  8. assign num5=300/10000;
  9. assign num4=(300-num5*10000)/1000;
  10. assign num3=(300-num5*10000-num4*1000)/100;
  11. assign num2=(300-num5*10000-num4*1000-num3*100)/10;
  12. assign num1=300-num5*10000-num4*1000-num3*100-num2*10;
  13. parameter num_0=8'b11100111;
  14. parameter num_1=8'b00100001;
  15. parameter num_2=8'b11001011;
  16. parameter num_3=8'b01101011;       
  17. parameter num_4=8'b00101101;       
  18. parameter num_5=8'b01101110;
  19. parameter num_6=8'b11101110;
  20. parameter num_7=8'b00100011;
  21. parameter num_8=8'b11101111;       
  22. parameter num_9=8'b00101111;       

  23. case(num5)
  24.         0:assign out5=num_0;
  25.         1:assign out5=num_1;
  26.         2:assign out5=num_2;
  27.         3:assign out5=num_3;       
  28.         4:assign out5=num_4;
  29.         5:assign out5=num_5;
  30.         6:assign out5=num_6;
  31.         7:assign out5=num_7;
  32.         8:assign out5=num_8;
  33.         9:assign out5=num_9;       
  34. endcase

  35. case(num4)
  36.         0:assign out4=num_0;
  37.         1:assign out4=num_1;
  38.         2:assign out4=num_2;
  39.         3:assign out4=num_3;       
  40.         4:assign out4=num_4;
  41.         5:assign out4=num_5;
  42.         6:assign out4=num_6;
  43.         7:assign out4=num_7;
  44.         8:assign out4=num_8;
  45.         9:assign out4=num_9;       
  46. endcase

  47. case(num3)
  48.         0:assign out3=num_0;
  49.         1:assign out3=num_1;
  50.         2:assign out3=num_2;
  51.         3:assign out3=num_3;       
  52.         4:assign out3=num_4;
  53.         5:assign out3=num_5;
  54.         6:assign out3=num_6;
  55.         7:assign out3=num_7;
  56.         8:assign out3=num_8;
  57.         9:assign out3=num_9;       
  58. endcase

  59. case(num2)
  60.         0:assign out2=num_0;
  61.         1:assign out2=num_1;
  62.         2:assign out2=num_2;
  63.         3:assign out2=num_3;       
  64.         4:assign out2=num_4;
  65.         5:assign out2=num_5;
  66.         6:assign out2=num_6;
  67.         7:assign out2=num_7;
  68.         8:assign out2=num_8;
  69.         9:assign out2=num_9;       
  70. endcase

  71. case(num1)
  72.         0:assign out1=num_0;
  73.         1:assign out1=num_1;
  74.         2:assign out1=num_2;
  75.         3:assign out1=num_3;       
  76.         4:assign out1=num_4;
  77.         5:assign out1=num_5;
  78.         6:assign out1=num_6;
  79.         7:assign out1=num_7;
  80.         8:assign out1=num_8;
  81.         9:assign out1=num_9;       
  82. endcase

  83. endmodule


复制代码



这种方法正确;



二、用两个模块实现,利用实例化,代码如下:




  1. module pulse_counter(out1,out2,out3,out4,out5,di);
  2. output wire[7:0] out1,out2,out3,out4,out5;
  3. output wire [9:0] di;       
  4. xianshi u_xianshi(3000,out1,out2,out3,out4,out5,di);

  5. endmodule


复制代码






  1. module xianshi(in,out1,out2,out3,out4,out5,di);
  2. input [16:0] in;
  3. output reg [7:0] out1,out2,out3,out4,out5;
  4. output [9:0] di;
  5. wire [3:0] num5,num4,num3,num2,num1;
  6. reg [7:0] temp1,temp2,temp3,temp4,temp5;
  7. reg di=10'd0;
  8. assign num5=in/10000;
  9. assign num4=(in-num5*10000)/1000;
  10. assign num3=(in-num5*10000-num4*1000)/100;
  11. assign num2=(in-num5*10000-num4*1000-num3*100)/10;
  12. assign num1=in-num5*10000-num4*1000-num3*100-num2*10;
  13. parameter num_0=8'b11100111;
  14. parameter num_1=8'b00100001;
  15. parameter num_2=8'b11001011;
  16. parameter num_3=8'b01101011;       
  17. parameter num_4=8'b00101101;       
  18. parameter num_5=8'b01101110;
  19. parameter num_6=8'b11101110;
  20. parameter num_7=8'b00100011;
  21. parameter num_8=8'b11101111;       
  22. parameter num_9=8'b00101111;       

  23. always @(in)
  24.         begin
  25. case(num5)
  26.         0:  out5=num_0;
  27.         1:   out5=num_1;
  28.         2:  out5=num_2;
  29.         3:  out5=num_3;       
  30.         4:  out5=num_4;
  31.         5:  out5=num_5;
  32.         6:  out5=num_6;
  33.         7:  out5=num_7;
  34.         8:  out5=num_8;
  35.         9:  out5=num_9;       
  36. endcase

  37. case(num4)
  38.         0:  out4=num_0;
  39.         1:  out4=num_1;
  40.         2:  out4=num_2;
  41.         3:  out4=num_3;       
  42.         4:  out4=num_4;
  43.         5:  out4=num_5;
  44.         6:  out4=num_6;
  45.         7:  out4=num_7;
  46.         8:  out4=num_8;
  47.         9:  out4=num_9;       
  48. endcase

  49. case(num3)
  50.         0:  out3=num_0;
  51.         1:  out3=num_1;
  52.         2:  out3=num_2;
  53.         3:  out3=num_3;       
  54.         4:  out3=num_4;
  55.         5:  out3=num_5;
  56.         6:  out3=num_6;
  57.         7:  out3=num_7;
  58.         8:  out3=num_8;
  59.         9:  out3=num_9;       
  60. endcase

  61. case(num2)
  62.         0:  out2=num_0;
  63.         1:  out2=num_1;
  64.         2:  out2=num_2;
  65.         3:  out2=num_3;       
  66.         4:  out2=num_4;
  67.         5:  out2=num_5;
  68.         6:  out2=num_6;
  69.         7:  out2=num_7;
  70.         8:  out2=num_8;
  71.         9:  out2=num_9;       
  72. endcase

  73. case(num1)
  74.         0:  out1=num_0;
  75.         1:  out1=num_1;
  76.         2:  out1=num_2;
  77.         3:  out1=num_3;       
  78.         4:  out1=num_4;
  79.         5:  out1=num_5;
  80.         6:  out1=num_6;
  81.         7:  out1=num_7;
  82.         8: out1=num_8;
  83.         9: out1=num_9;       
  84. endcase
  85. end
  86. endmodule


复制代码



在pulse_counter模块中调用xianshi模块,xianshi模块中的输出变量采用的是reg型;
经实践,该方法正确;

三、用两个模块实现,利用实例化,和方法二区别在于在xianshi模块中输出变量采用wire类型,代码如下:




  1. module pulse_counter(out1,out2,out3,out4,out5,di);
  2. output wire[7:0] out1,out2,out3,out4,out5;
  3. output wire [9:0] di;       
  4. xianshi u_xianshi(3000,out1,out2,out3,out4,out5,di);

  5. endmodule


复制代码





  1. module xianshi(in,out1,out2,out3,out4,out5,di);
  2. input [16:0] in;
  3. output wire [7:0] out1,out2,out3,out4,out5;
  4. output [9:0] di;
  5. wire [3:0] num5,num4,num3,num2,num1;
  6. reg [7:0] temp1,temp2,temp3,temp4,temp5;
  7. reg di=10'd0;
  8. assign num5=in/10000;
  9. assign num4=(in-num5*10000)/1000;
  10. assign num3=(in-num5*10000-num4*1000)/100;
  11. assign num2=(in-num5*10000-num4*1000-num3*100)/10;
  12. assign num1=in-num5*10000-num4*1000-num3*100-num2*10;
  13. parameter num_0=8'b11100111;
  14. parameter num_1=8'b00100001;
  15. parameter num_2=8'b11001011;
  16. parameter num_3=8'b01101011;       
  17. parameter num_4=8'b00101101;       
  18. parameter num_5=8'b01101110;
  19. parameter num_6=8'b11101110;
  20. parameter num_7=8'b00100011;
  21. parameter num_8=8'b11101111;       
  22. parameter num_9=8'b00101111;       

  23. case(num5)
  24.         0: assign out5=num_0;
  25.         1:  assign out5=num_1;
  26.         2: assign out5=num_2;
  27.         3: assign out5=num_3;       
  28.         4: assign out5=num_4;
  29.         5: assign out5=num_5;
  30.         6: assign out5=num_6;
  31.         7: assign out5=num_7;
  32.         8: assign out5=num_8;
  33.         9: assign out5=num_9;       
  34. endcase

  35. case(num4)
  36.         0: assign out4=num_0;
  37.         1: assign out4=num_1;
  38.         2: assign out4=num_2;
  39.         3: assign out4=num_3;       
  40.         4: assign out4=num_4;
  41.         5: assign out4=num_5;
  42.         6: assign out4=num_6;
  43.         7: assign out4=num_7;
  44.         8: assign out4=num_8;
  45.         9: assign out4=num_9;       
  46. endcase

  47. case(num3)
  48.         0: assign out3=num_0;
  49.         1: assign out3=num_1;
  50.         2: assign out3=num_2;
  51.         3: assign out3=num_3;       
  52.         4: assign out3=num_4;
  53.         5: assign out3=num_5;
  54.         6: assign out3=num_6;
  55.         7: assign out3=num_7;
  56.         8: assign out3=num_8;
  57.         9: assign out3=num_9;       
  58. endcase

  59. case(num2)
  60.         0: assign out2=num_0;
  61.         1: assign out2=num_1;
  62.         2: assign out2=num_2;
  63.         3: assign out2=num_3;       
  64.         4: assign out2=num_4;
  65.         5: assign out2=num_5;
  66.         6: assign out2=num_6;
  67.         7: assign out2=num_7;
  68.         8: assign out2=num_8;
  69.         9: assign out2=num_9;       
  70. endcase

  71. case(num1)
  72.         0: assign out1=num_0;
  73.         1: assign out1=num_1;
  74.         2: assign out1=num_2;
  75.         3: assign out1=num_3;       
  76.         4: assign out1=num_4;
  77.         5: assign out1=num_5;
  78.         6: assign out1=num_6;
  79.         7: assign out1=num_7;
  80.         8: assign out1=num_8;
  81.         9: assign out1=num_9;       
  82. endcase

  83. endmodule


复制代码



经试验,这种方法无法得到预期效果;需要达到3.3V,数码管才能发亮,但是方法三的实行结果只能是每个引脚都处于一点几伏的状态。

求教!!
发表于 2013-5-9 10:15:00 | 显示全部楼层
电压跟源码没关系,先确认你的CPLD管脚IO是否能输出3.3,能的话驱动能力是否够,配置是否正确,不能的话需要额外的led的驱动芯片,或者拿管子搭了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-23 13:09 , Processed in 0.016353 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表