第1 页, 共6 页 Au thor:Lanre Verilog实现8位8端数码管显示 1 原理图 2个4位的数码管,组成的8位8段数码管,每个4位数码管的数据线独立,其实是可以以总线形式连接在一起的,可以减少IO。共阳极的供电端用了三极管增加驱动,否则IO供电驱动多个数码管时有困难。 2 CPLD 代码 module LED_8segment ( clk_24m, reset_n, Bit_line, //数码管位选择线。 Data_line_h, //高4位数码管数据线。 Data_line_l //低4位数码管数据线。 ); input w ire clk_24m; input w ire reset_n; output w ire [7:0] Bit_line; //8位位选择线,对应8位的数码管。 output w ire [0:7] Data_line_h; //8位数据线,对应abcdefg和dp共8段LED。 output w ire [0:7] Data_line_l; /****************************************************************************** 24M时钟分频,用于内部控制及计数等。 第2 页, 共6 页 Au thor:Lanre ******************************************************************************/ reg [16:0] count_div1; wire condition_183; //183 Hz时钟信号。 always @ (posedge clk_24m or negedge reset_n) begin if(reset_n == 1'b0) count_div1 <= 16'h00000; else count_div1 <= count_div1 + 16'h00001; end /****************************************************************************** condition_183: 183Hz时钟信号,高电平持续一个24MHz时钟周期,其余时间为低电平。 ******************************************************************************/ assign condition_183 = &count_div1[16:0]; //24MHz/2^17=183Hz。 /****************************************************************************** 二次计数: 当需要时钟频率较低时,采用24M时钟计数的值很大,计数器位数会很多,容易因每位延迟不同导致计数器翻转错误,从而引起计数错误,所以在已分频的时钟基础上,再次分频。 ******************************************************************************/ reg [4:0] count_div2; wire condition_5; //5Hz时钟 always @ (posedge clk_24m or negedge reset_n) begin if(reset_n == 1'b0) count_div2 <= 5'h00; else if (condition_183 == 1'b1) count_div2 <= count_div2 + ...