module seg_drive(
  input         i_clk,

  input  [15:0] i_data,                 // 欲显数据[16    
  
  output reg [7:0] o_seg,                  // 段脚
  output reg [3:0] o_sel                   // 位脚
);

//++++++++++++++++++++++++++++++++++++++
// 分频部分 开始
//++++++++++++++++++++++++++++++++++++++
reg [16:0] cnt;                         // 计数子

always @ (posedge i_clk)
    cnt <= cnt + 1'b1;

wire seg7_clk = cnt[16];                // (2^17/50M = 2.6114)ms 
//--------------------------------------
// 分频部分 结束
//--------------------------------------


//++++++++++++++++++++++++++++++++++++++
// 动态扫描, 生成seg7_addr 开始
//++++++++++++++++++++++++++++++++++++++
reg [1:0]  seg7_addr;                   // 第几个seg7

always @ (posedge seg7_clk)
    seg7_addr <= seg7_addr + 1'b1;      

always
  case (seg7_addr)
    0 : o_sel <= 4'b0001;              
    1 : o_sel <= 4'b0010;               
    2 : o_sel <= 4'b0100;                
    3 : o_sel <= 4'b1000;               
  endcase
//++++++++++++++++++++++++++++++++++++++
// 根据seg7_addr, 选择待译段码 开始
//++++++++++++++++++++++++++++++++++++++
reg [7:0] seg_data_r;                   // 待译段码

always
  case (seg7_addr)
    0 : seg_data_r <= i_data[3:0];
    1 : seg_data_r <= i_data[7:4];
    2 : seg_data_r <= i_data[11:8];
    3 : seg_data_r <= i_data[15:12];
  endcase

 always @ (posedge i_clk)
        case(seg_data_r)                // 无小数点
          4'h0 : o_seg <= 8'hc0;
          4'h1 : o_seg <= 8'hf9;
          4'h2 : o_seg <= 8'ha4;
          4'h3 : o_seg <= 8'hb0;
          4'h4 : o_seg <= 8'h99;
          4'h5 : o_seg <= 8'h92;
          4'h6 : o_seg <= 8'h82;
          4'h7 : o_seg <= 8'hf8;
          4'h8 : o_seg <= 8'h80;
          4'h9 : o_seg <= 8'h90;
          4'ha : o_seg <= 8'hff;
        endcase

endmodule
module seg_drive2(
  input         i_clk,

  input  [15:0] i_data,                 // 欲显数据[16    
  
  output reg [7:0] o_seg,                  // 段脚
  output reg [3:0] o_sel                   // 位脚
);

//++++++++++++++++++++++++++++++++++++++
// 分频部分 开始
//++++++++++++++++++++++++++++++++++++++
reg [16:0] cnt;                         // 计数子

always @ (posedge i_clk)
    cnt <= cnt + 1'b1;

wire seg7_clk = cnt[16];                // (2^17/50M = 2.6114)ms 
//--------------------------------------
// 分频部分 结束
//--------------------------------------


//++++++++++++++++++++++++++++++++++++++
// 动态扫描, 生成seg7_addr 开始
//++++++++++++++++++++++++++++++++++++++
reg [1:0]  seg7_addr;                   // 第几个seg7

always @ (posedge seg7_clk)
    seg7_addr <= seg7_addr + 1'b1;      

always
  case (seg7_addr)
    0 : o_sel <= 4'b0001;              
    1 : o_sel <= 4'b0010;               
    2 : o_sel <= 4'b0100;                
    3 : o_sel <= 4'b1000;               
  endcase
//++++++++++++++++++++++++++++++++++++++
// 根据seg7_addr, 选择待译段码 开始
//++++++++++++++++++++++++++++++++++++++
reg [7:0] seg_data_r;                   // 待译段码

always
  case (seg7_addr)
    0 : seg_data_r <= i_data[3:0];
    1 : seg_data_r <= i_data[7:4];
    2 : seg_data_r <= i_data[11:8];
    3 : seg_data_r <= i_data[15:12];
  endcase

 always @ (posedge i_clk)
        case(seg_data_r)                // 无小数点
          4'h0 : o_seg <= 8'hc0;
          4'h1 : o_seg <= 8'hf9;
          4'h2 : o_seg <= 8'ha4;
          4'h3 : o_seg <= 8'hb0;
          4'h4 : o_seg <= 8'h99;
          4'h5 : o_seg <= 8'h92;
          4'h6 : o_seg <= 8'h82;
          4'h7 : o_seg <= 8'hf8;
          4'h8 : o_seg <= 8'h80;
          4'h9 : o_seg <= 8'h90;
          4'ha : o_seg <= 8'hff;
        endcase

endmodule

原文地址: https://www.cveoy.top/t/topic/nLwp 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录