搜索
bottom↓
回复: 3

七段数码管x8动态显示带熄灭和小数点控制(verilog)

[复制链接]

出0入0汤圆

发表于 2009-11-14 10:36:40 | 显示全部楼层 |阅读模式
新近写的,水平有限,欢迎拍砖。

原理图

(原文件名:seg7 x 8.jpg)

源代码
--------------------------------------------------
/*
* seg7 x 8 查找表测试文件
*/

module seg7_test(
  input         CLOCK_50,
  
  output [7:0]  SEG7_DIG,
  output [7:0]  SEG7_SEG
);

seg7_8_LUT u0(
  .i_clock(CLOCK_50),
  .i_turn_off(8'b1100_0000),  // 熄灭位[此处取第7、6位
  .i_dp(8'b0000_0100),        // 小数点位[此处取第2位
  .i_data(32'hAB_CDEF),       // 欲显数据[16进制
  
  .o_dig(SEG7_DIG),
  .o_seg(SEG7_SEG)
);

endmodule
--------------------------------------------------

--------------------------------------------------
/*
* Name       : seg7_8_LUT
* Description: seg7 x 8 look up table; dynamic display;
*              with turn-off control and digit-point control
* Compiler   : Quartus II 9.0
* Author     : Yuphone Chang 张亚峰
* Aacademy   :Inner Mongolia University of Technology
* Blog       : http://blog.ednchina.com/2006tx_yafeng
* Version    : 1.0
* Change History:Revision 1.0  11.14, 2009
*                first edition
*/

module seg7_8_LUT(
    input           i_clock,    // 50MHz左右
    input   [7:0]   i_turn_off, // 熄灭位
    input   [7:0]   i_dp,       // 小数点位
    input   [31:0]  i_data,     // 欲显数据[16进制
   
    output wire        [7:0]   o_dig,  // 位脚
    output wire        [7:0]   o_seg   // 段脚
);

reg [7:0] o_dig_r;      // 位选码缓存器
reg [7:0] o_seg_r;      // 段码缓存器

reg [2:0] seg7_addr_r;  // 第?个seg7

reg       turn_off_r;   // 熄灭flag
reg       dp_r;         // 小数点flag
reg [3:0] seg_data_r;   // 待译段码
                       
reg        [16:0]        delay_cnt;  // 延时计数子


// 动态扫描, 每2.5ms换一个seg7
always@ (posedge i_clock)
begin
    delay_cnt <= delay_cnt + 17'b1;
        if(delay_cnt >= 125_000)   // 125000/50M = 2.5ms
        begin
       seg7_addr_r  <=seg7_addr_r + 3'b1;
        delay_cnt   <= 17'b0;
        end               
end

// 根据seg7_addr_r, 译出位码
always@ (posedge i_clock)
begin
    case(seg7_addr_r)
        0 : o_dig_r = 8'b0000_0001;         
        1 : o_dig_r = 8'b0000_0010;
        2 : o_dig_r = 8'b0000_0100;
        3 : o_dig_r = 8'b0000_1000;
        4 : o_dig_r = 8'b0001_0000;
        5 : o_dig_r = 8'b0010_0000;
        6 : o_dig_r = 8'b0100_0000;
        7 : o_dig_r = 8'b1000_0000;
    endcase
end


// 根据seg7_addr_r, 选择熄灭flag/小数点flag/待译段码
always@ (posedge i_clock)
begin
    case(seg7_addr_r)
        0 : begin
              turn_off_r  = i_turn_off[0];
              dp_r        = i_dp[0];
              seg_data_r  = i_data[3:0];
            end
        1 : begin
              turn_off_r  = i_turn_off[1];
              dp_r        = i_dp[1];
              seg_data_r  = i_data[7:4];
            end
        2 : begin
              turn_off_r  = i_turn_off[2];
              dp_r        = i_dp[2];
              seg_data_r  = i_data[11:8];
            end
        3 : begin
              turn_off_r  = i_turn_off[3];
              dp_r        = i_dp[3];
              seg_data_r  = i_data[15:12];
            end
        4 : begin
              turn_off_r  = i_turn_off[4];
              dp_r        = i_dp[4];
              seg_data_r  = i_data[19:16];
            end
        5 : begin
              turn_off_r  = i_turn_off[5];
              dp_r        = i_dp[5];
              seg_data_r  = i_data[23:20];
            end
        6 : begin
              turn_off_r  = i_turn_off[6];
              dp_r        = i_dp[6];
              seg_data_r  = i_data[27:24];
            end
        7 : begin
              turn_off_r  = i_turn_off[7];
              dp_r        = i_dp[7];
              seg_data_r  = i_data[31:28];
            end
    endcase
end

/*
*     0
*  -------
*  |     |
* 5|  6  |1
*  -------
*  |     |
* 4|     |2
*  -------   . 7
*    3
*/
// 根据熄灭flag/小数点flag/待译段码, 译出段码
always@ *
begin
  if(turn_off_r)        // 送熄灭码
      o_seg_r = 8'hFF;
  else
  begin
    if(dp_r)
    begin
      case(seg_data_r)  // 加小数点
        4'h0 : o_seg_r = 8'hC0 ^ 8'h80;
        4'h1 : o_seg_r = 8'hF9 ^ 8'h80;
        4'h2 : o_seg_r = 8'hA4 ^ 8'h80;
        4'h3 : o_seg_r = 8'hB0 ^ 8'h80;
        4'h4 : o_seg_r = 8'h99 ^ 8'h80;
        4'h5 : o_seg_r = 8'h92 ^ 8'h80;       
        4'h6 : o_seg_r = 8'h82 ^ 8'h80;          
        4'h7 : o_seg_r = 8'hF8 ^ 8'h80;       
        4'h8 : o_seg_r = 8'h80 ^ 8'h80;
        4'h9 : o_seg_r = 8'h90 ^ 8'h80;
        4'hA : o_seg_r = 8'h88 ^ 8'h80;
        4'hB : o_seg_r = 8'h83 ^ 8'h80;
        4'hC : o_seg_r = 8'hC6 ^ 8'h80;
        4'hD : o_seg_r = 8'hA1 ^ 8'h80;
        4'hE : o_seg_r = 8'h86 ^ 8'h80;
        4'hF : o_seg_r = 8'h8E ^ 8'h80;
      endcase
    end
    else
    begin
      case(seg_data_r)  // 不熄灭, 无小数点
        4'h0 : o_seg_r = 8'hC0;
        4'h1 : o_seg_r = 8'hF9;
        4'h2 : o_seg_r = 8'hA4;
        4'h3 : o_seg_r = 8'hB0;
        4'h4 : o_seg_r = 8'h99;
        4'h5 : o_seg_r = 8'h92;
        4'h6 : o_seg_r = 8'h82;
        4'h7 : o_seg_r = 8'hF8;
        4'h8 : o_seg_r = 8'h80;
        4'h9 : o_seg_r = 8'h90;
        4'hA : o_seg_r = 8'h88;
        4'hB : o_seg_r = 8'h83;
        4'hC : o_seg_r = 8'hC6;
        4'hD : o_seg_r = 8'hA1;
        4'hE : o_seg_r = 8'h86;
        4'hF : o_seg_r = 8'h8E;
      endcase
    end
  end
end

/*
*        | c[1]
* b[in] -|
*        | e[out]
*/
assign o_dig = ~o_dig_r; // 共阳,但经过三极管反向  
assign o_seg = o_seg_r;

endmodule
--------------------------------------------------

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2009-11-15 01:07:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-14 23:38:18 | 显示全部楼层
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 17:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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