[FPGA教程] Basys 3 FPGA上的七段LED显示屏

FPGA.教程 将指导您如何在Basys 3上控制4位七段显示 FPGA. 木板。将设计显示控制器 verilog. 在4位7段LED显示屏上显示数字 Basys 3 FPGA。还提供了七段LED显示控制器的完整Verilog代码。

巴斯迪3. FPGA. 有一个常见的阳极4-数字 7段LED显示屏 如下图所示。

FPGA.教程 -  Basys 3 FPGA上的七段LED显示控制器

七个段的七个阳极在单个LED中,S在一个公共阳极节点上连接在一起,而其阴极是分开的,如下图所示。 DP-Segment是为了照亮点,所以我们省略了现在的DP段,因为它没有贡献的数量 七段显示.
FPGA.教程 -  Basys 3 FPGA上的七段LED显示控制器
为了照亮诸如A-G等LED段,这些段的阳极需要处于“高的'逻辑水平和阴极应该是'低的'逻辑级别。因此,常见的阳极节点应该高到 activate a single 七段LED显示屏。阴极的逻辑电平可以从低(照明)到高(未照射)来改变(未照射),以在单个7段LED显示器上显示不同的小数值,如下所述。 
FPGA.教程 -  Basys 3 FPGA上的七段LED显示控制器
如上图所示,我们可以将数字从零显示到九个 七段LED显示屏 通过打开和关闭单个七段LED显示屏的七个部分。例如,显示号码“1“在LED上,区段A,F,G,E和D是未照射的,或者它们的阴极应该高,并且BC段被照亮,或者它们的阴极应该低。类似,我们可以获得以下解码器表在七段LED显示屏上显示十个数字:
[FPGA教程] Basys 3 FPGA上的七段LED显示控制器

该表显示了所需的阴极图案,用于在单个中显示相应的数字 7段LED显示屏 巴斯迪3 FPGA. board.

目前,我们知道如何在单个七段LED显示屏上显示数字 巴斯迪3 FPGA板。然而,Basys 3上的四个七段LED的阴极不分开但连接在一起,如下图所示。

FPGA.教程 -  Basys 3 FPGA上的七段LED显示控制器
因此,在4位七段段LED显示器上显示4个不同的数字,我们必须通过在不同时间激活四个七段LED来单独控制四个七段LED的阴极(CA-CG)。例如,当我们通过驱动A1高电平和其他三个LED(LED 2,LED 3,LED 4)激活LED 1时(A2,A3和A4未驱动),阴极图案(CA-CG)将是用于在LED 1上显示数字1.类似地,可以通过在不同时间使用相同的方式显示LED 2 LED 4。如上图所示,我们可以通过使用4 PNP晶体管AN0-AN3来控制激活四个七段LED。当晶体管接通或基站(W4,U4,V4或U2)低时,相应的阳极被驱动高,以激活或启用相应的七段LED。 

当照亮后,LED停用时,它将变暗。为避免人眼感知的显示不连续性,四个七段LED应在大约1kHz至60Hz的情况下连续刷新,或者应在每100毫秒到16ms时刷​​新。 


在这方面 FPGA.教程,七段LED显示控制器设计用于在Basys 3的四位7段LED显示屏上显示数字。 FPGA. 木板。以下是Basys 3上的七段LED显示控制器的时序图 FPGA.:

FPGA.教程 -  Basys 3 FPGA上的七段LED显示控制器
下面是在Basys 3的4位7段LED显示屏上显示“1234”的示例时序图 FPGA. 刷新速度为60Hz或16ms的时间:
FPGA.教程 -  Basys 3 FPGA上的七段LED显示控制器

现在,我们知道如何在Basys 3上的四位数七段LED显示屏上控制和显示数字 FPGA.。接下来,让我们设计 7段LED显示控制器.

巴斯迪3. FPGA. 具有100MHz的时钟源,我们需要1ms-16ms刷新周期或1kHz-60Hz刷新率。我会选择10.5ms(数字周期= 2.6ms)的刷新周期,以便我们可以使用20位计数器来使用计数器的前2 MSB位创建刷新周期,以便创建LED激活信号(数字时段2.6ms)如上面的时序图所示。

以下是一个例子 verilog. 用于创建刷新信号和LED激活信号的代码:

reg [19:0] refresh_counter; 
// the first 18-bit for creating 2.6ms digit period
// the other 2-bit for creating 4 LED-activating signals
wire [1:0] LED_activating_counter; 
// count        0    ->  1  ->  2  ->  3
// activates    LED1    LED2   LED3   LED4
// and repeat
always @(posedge clock_100Mhz or posedge reset)
begin 
 if(reset==1)
  refresh_counter <= 0;
 else
  refresh_counter <= refresh_counter + 1;
end 
assign LED_activating_counter = refresh_counter[19:18];
之后,我们需要生成阳极信号 (W4,V4,U4,U2) 对于基于LED激活计数器的四位数7段LED显示器。 LED激活计数器将从零到三次反复计数,以便连续激活和更新四个七段LED。

以下是一个例子 verilog. 用于创建阳极信号的代码以及Basys 3上的四个7段LED的更新值 FPGA.:

    // anode activating signals for 4 LEDs
    // decoder to generate anode signals 
    always @(*)
    begin
        case(LED_activating_counter)
        2'b00: begin
            Anode_Activate = 4'b0111; 
            // activate LED1 and Deactivate LED2, LED3, LED4
            LED_BCD = displayed_number[15:11];
            // the first hex-digit of the 16-bit number
             end
        2'b01: begin
            Anode_Activate = 4'b1011; 
            // activate LED2 and Deactivate LED1, LED3, LED4
            LED_BCD = displayed_number[10:8];
            // the second hex-digit of the 16-bit number
                end
        2'b10: begin
            Anode_Activate = 4'b1101; 
            // activate LED3 and Deactivate LED2, LED1, LED4
            LED_BCD = displayed_number[7:4];
             // the third hex-digit of the 16-bit number
              end
        2'b11: begin
            Anode_Activate = 4'b1110; 
            // activate LED4 and Deactivate LED2, LED3, LED1
             LED_BCD = displayed_number[3:0];
             // the fourth hex-digit of the 16-bit number 
               end   
        default:begin
             Anode_Activate = 4'b0111; 
            // activate LED1 and Deactivate LED2, LED3, LED4
            LED_BCD = displayed_number[15:11];
            // the first hex-digit of the 16-bit number
            end
        endcase
    end

最后但并非最不重要的,例子 verilog.代码 for BCD到7段解码器 基于上面的解码器表:

reg[6:0] LED_out;
// Cathode patterns of the 7段LED显示屏 
always @(*)
begin
 case(LED_BCD)
 4'b0000: LED_out = 7'b0000001; // "0"  
 4'b0001: LED_out = 7'b1001111; // "1" 
 4'b0010: LED_out = 7'b0010010; // "2" 
 4'b0011: LED_out = 7'b0000110; // "3" 
 4'b0100: LED_out = 7'b1001100; // "4" 
 4'b0101: LED_out = 7'b0100100; // "5" 
 4'b0110: LED_out = 7'b0100000; // "6" 
 4'b0111: LED_out = 7'b0001111; // "7" 
 4'b1000: LED_out = 7'b0000000; // "8"  
 4'b1001: LED_out = 7'b0000100; // "9" 
 default: LED_out = 7'b0000001; // "0"
 endcase
end
设计为 7段LED显示控制器 基本完成。让我们使用控制器在Basys 3的四位七段LED显示屏上显示16位计数号码 FPGA. 董事会计数期为1秒。

满的 verilog.代码 of the 七段LED显示控制器 在Basys 3上显示计数编号 FPGA.

// yl315.net: FPGA.项目, verilog. projects, VHDL projects
// FPGA tutorial: 七段LED显示控制器 on Basys  3 FPGA
module Seven_segment_LED_Display_Controller(
    input clock_100Mhz, // 100 Mhz clock source on Basys 3 FPGA
    input reset, // reset
    output reg [3:0] Anode_Activate, // anode signals of the 7段LED显示屏
    output reg [6:0] LED_out// cathode patterns of the 7段LED显示屏
    );
    reg [26:0] one_second_counter; // counter for generating 1 second clock enable
    wire one_second_enable;// one second enable for counting numbers
    reg [15:0] displayed_number; // counting number to be displayed
    reg [3:0] LED_BCD;
    reg [19:0] refresh_counter; // 20-bit for creating 10.5ms refresh period or 380Hz refresh rate
             // the first 2 MSB bits for creating 4 LED-activating signals with 2.6ms digit period
    wire [1:0] LED_activating_counter; 
                 // count     0    ->  1  ->  2  ->  3
              // activates    LED1    LED2   LED3   LED4
             // and repeat
    always @(posedge clock_100Mhz or posedge reset)
    begin
        if(reset==1)
            one_second_counter <= 0;
        else begin
            if(one_second_counter>=99999999) 
                 one_second_counter <= 0;
            else
                one_second_counter <= one_second_counter + 1;
        end
    end 
    assign one_second_enable = (one_second_counter==99999999)?1:0;
    always @(posedge clock_100Mhz or posedge reset)
    begin
        if(reset==1)
            displayed_number <= 0;
        else if(one_second_enable==1)
            displayed_number <= displayed_number + 1;
    end
    always @(posedge clock_100Mhz or posedge reset)
    begin 
        if(reset==1)
            refresh_counter <= 0;
        else
            refresh_counter <= refresh_counter + 1;
    end 
    assign LED_activating_counter = refresh_counter[19:18];
    // anode activating signals for 4 LEDs, digit period of 2.6ms
    // decoder to generate anode signals 
    always @(*)
    begin
        case(LED_activating_counter)
        2'b00: begin
            Anode_Activate = 4'b0111; 
            // activate LED1 and Deactivate LED2, LED3, LED4
            LED_BCD = displayed_number/1000;
            // the first digit of the 16-bit number
              end
        2'b01: begin
            Anode_Activate = 4'b1011; 
            // activate LED2 and Deactivate LED1, LED3, LED4
            LED_BCD = (displayed_number % 1000)/100;
            // the second digit of the 16-bit number
              end
        2'b10: begin
            Anode_Activate = 4'b1101; 
            // activate LED3 and Deactivate LED2, LED1, LED4
            LED_BCD = ((displayed_number % 1000)%100)/10;
            // the third digit of the 16-bit number
                end
        2'b11: begin
            Anode_Activate = 4'b1110; 
            // activate LED4 and Deactivate LED2, LED3, LED1
            LED_BCD = ((displayed_number % 1000)%100)%10;
            // the fourth digit of the 16-bit number    
               end
        endcase
    end
    // Cathode patterns of the 7段LED显示屏 
    always @(*)
    begin
        case(LED_BCD)
        4'b0000: LED_out = 7'b0000001; // "0"     
        4'b0001: LED_out = 7'b1001111; // "1" 
        4'b0010: LED_out = 7'b0010010; // "2" 
        4'b0011: LED_out = 7'b0000110; // "3" 
        4'b0100: LED_out = 7'b1001100; // "4" 
        4'b0101: LED_out = 7'b0100100; // "5" 
        4'b0110: LED_out = 7'b0100000; // "6" 
        4'b0111: LED_out = 7'b0001111; // "7" 
        4'b1000: LED_out = 7'b0000000; // "8"     
        4'b1001: LED_out = 7'b0000100; // "9" 
        default: LED_out = 7'b0000001; // "0"
        endcase
    end
 endmodule
在Basys 3上的四位数七段LED显示屏的引脚约束文件 FPGA.:
# Clock signal
set_property PACKAGE_PIN W5 [get_ports clock_100Mhz]       
 set_property IOSTANDARD LVCMOS33 [get_ports clock_100Mhz]
set_property PACKAGE_PIN R2 [get_ports reset]     
 set_property IOSTANDARD LVCMOS33 [get_ports reset]
#seven-segment LED display
set_property PACKAGE_PIN W7 [get_ports {LED_out[6]}]                    
   set_property IOSTANDARD LVCMOS33 [get_ports {LED_out[6]}]
set_property PACKAGE_PIN W6 [get_ports {LED_out[5]}]                    
   set_property IOSTANDARD LVCMOS33 [get_ports {LED_out[5]}]
set_property PACKAGE_PIN U8 [get_ports {LED_out[4]}]                    
   set_property IOSTANDARD LVCMOS33 [get_ports {LED_out[4]}]
set_property PACKAGE_PIN V8 [get_ports {LED_out[3]}]                    
   set_property IOSTANDARD LVCMOS33 [get_ports {LED_out[3]}]
set_property PACKAGE_PIN U5 [get_ports {LED_out[2]}]                    
   set_property IOSTANDARD LVCMOS33 [get_ports {LED_out[2]}]
set_property PACKAGE_PIN V5 [get_ports {LED_out[1]}]                    
   set_property IOSTANDARD LVCMOS33 [get_ports {LED_out[1]}]
set_property PACKAGE_PIN U7 [get_ports {LED_out[0]}]                    
   set_property IOSTANDARD LVCMOS33 [get_ports {LED_out[0]}]
set_property PACKAGE_PIN U2 [get_ports {Anode_Activate[0]}]                    
   set_property IOSTANDARD LVCMOS33 [get_ports {Anode_Activate[0]}]
set_property PACKAGE_PIN U4 [get_ports {Anode_Activate[1]}]                    
   set_property IOSTANDARD LVCMOS33 [get_ports {Anode_Activate[1]}]
set_property PACKAGE_PIN V4 [get_ports {Anode_Activate[2]}]               
   set_property IOSTANDARD LVCMOS33 [get_ports {Anode_Activate[2]}]
set_property PACKAGE_PIN W4 [get_ports {Anode_Activate[3]}]          
   set_property IOSTANDARD LVCMOS33 [get_ports {Anode_Activate[3]}]
现在,在Vivado创建一个新项目,选择设备部件号 XC7A35T-1cpg236c用于ARIX-7 FPGA 巴斯迪3 FPGA板。然后,添加源和约束文件,并生成 bitstream. 计划FPGA. 使用比特流,看看它如何在Basys 3 FPGA板上工作。

演示视频 七段LED显示控制器 在巴斯多斯3 FPGA板上:

这里 是Basys 3 FPGA上的七段显示的完整VHDL代码。
推荐的 FPGA.项目 for students:
1. 什么是fpga? FPGA如何工作?
2. 什么是fpga编程?
3. 如何将文本文件或图像加载到FPGA中
4. 使用Verilog对FPGA的图像处理
5. FPGA.上的车牌识别
6. 在FPGA的闹钟使用Verilog
7. 使用VHDL的FPGA上的数字时钟
8. FPGA.上的交通灯控制器
9. 在Verilog的FPGA停车系统
10。 FPGA.上微控制器的Verilog实现
11. FPGA. Xilinx上的VHDL矩阵乘法
12. FPGA.上微控制器的VHDL代码
13。 FPGA.上FIR滤波器的VHDL代码
14。 使用Verilog的FPGA上的单周期MIPS处理器
15。 使用Verilog的FPGA上的RISC处理器设计
16。 使用VHDL的FPGA上的PWM发生器
17。 使用Verilog的FPGA上TIC TAC TOE游戏
18。 在Verilog的FPGA上的流水线MIPS处理器
19。 适用于初学者的实惠的Xilinx FPGA板
20。 适用于初学者的Altera FPGA板
21。 巴斯多斯3 FPGA OV7670相机
FPGA. Verilog VHDL课程

24评论:

  1. 你好;
    我没有'要了解19位= 190Hz的程度如何?

    回复删除
    答案
    1. 19位刷新计数器最多可达2 ^ 19 - 1 = 524287.时钟输入为100MHz。因此,您可以获得刷新率= 100,000,000 / 524,287 = 190 Hz。

      删除
    2. Ahaaa,但如果我这样做与一秒反击结果,结果不是纯1秒!
      100MHz / 2 ^ 27 = 0.75 ---> 1/0.75 = 1.33 sec
      那个钙好吗?而你不能得到纯粹的1秒?但是,如果我想要微秒甚至纳米秒的精确时钟如何?
      谢谢

      删除
    3. 如果使用27位计数器,它将达到134,217,727。因此,当达到100,000,000时,您需要将计数器重置为0。然后,你将获得1秒钟。

      删除
    4. 因此,您正在生成190Hz刷新率,通过在最高可达524287 + 1时受益于变量的溢出?

      删除
    5. 巴斯多斯3 FPGA具有100MHz的时钟源,我们需要1ms-16ms刷新时段或1kHz-60Hz刷新率。我会选择10.5ms(数字周期= 2.6ms)的刷新周期,以便我们可以使用20位计数器来使用计数器的前2 MSB位创建刷新周期,以便创建LED激活信号(数字时段2.6ms)如上面的时序图所示。

      删除
    6. 20bits用于生成10.5ms,如果我想生成8.5ms应该是刷新计数器比特多少?
      如何决定刷新计数器位?

      删除
    7. 20bits刷新计数器用于生成10.5ms,如果我想生成8.5ms应该如何刷新计数器位?

      如何选择刷新计数器位?

      删除
    8. 20bits刷新计数器用于生成10.5ms,如果我想生成8.5ms应该如何刷新计数器位?

      如何选择刷新计数器位?

      删除
    9. 20bits刷新计数器用于生成10.5ms,如果我想生成8.5ms应该如何刷新计数器位?

      如何选择刷新计数器位?

      删除
    10. 20bits刷新计数器用于生成10.5ms,如果我想生成8.5ms应该如何刷新计数器位?

      如何选择刷新计数器位?

      删除
  2. 答案
    1. 使用8位计数器进行MOD 100计数器,并且当计数器达到100(01100100)通过将输出的Q(6),Q(5)和Q(2)位通过输出到AND3栅极和馈送的输入来清除零输出到柜台..

      删除
  3. 先生
    请提供有关LCD(Digilent Pmodclp)的互联网3 FPGA的教程。

    回复删除
  4. 此评论已被作者删除。

    回复删除
    答案
    1. 例如:您有一个4位数字:1234,该代码将取出该号码"4" for displaying.

      删除
  5. 您好,我在哪里可以获得完整的电路图?

    回复删除
  6. 嗨,我有16位输出,我想要在十六进制中显示值到4个七个段的值。多有任何想法来解决这个问题

    回复删除
    答案
    1. 提供的代码是在4位7段LED显示屏上显示16位编号。究竟你需要什么。

      删除
  7. 20位刷新计数器用于生成10.5ms,如果我想生成8.5ms应该是刷新计数器比特多少?

    如何选择刷新计数器位?

    回复删除
  8. 为什么你使用20位刷新计数器进行刷新期,而不是更低的任何东西?此外,你为什么要看一下它的2 MSB。大学教师'要了解为什么你唯一看着这两个人而不是任何其他人。谢谢。

    回复删除
  9. 嗨,非常感谢你。
    我试图在自己的最长的时间内实施它,并认为我理解。但我的解决方案没有 '工作,当我复制你的时候,我得到了PIN规划错误。我有巴斯迪3 FPGA板。我可以做错什么?

    [DRC NSTD-1]未指定的I / O标准:12个逻辑端口中的12个使用I / O标准(iostandard)值'DEFAULT',而不是用户分配特定值。这可能导致I / O与电路板电源或连接影响性能的连接或连接性,信号完整性或极端情况的争请性,导致设备损坏或其连接的组件。要纠正此违规,请指定所有I / O标准。除非所有逻辑端口具有定义的用户指定的I / O标准值,否则此设计将无法生成比特流。要允许使用未指定的I / O标准值(不推荐)的比特流创建,请使用此命令:set_property seriality {warning} [get_drc_checks nstd-1]。注意:使用Vivado运行Infrastructure(例如Launch_runs Tcl命令)时,将此命令添加到.tcl文件,并将该文件添加为Write_BitStream步骤的预挂钩,以实现运行。问题端口:i_binary_num [3:0],i_clk,o_segment_a,o_segment_b,o_segment_c,o_segment_d,o_segment_e,o_segment_f和o_segment_g。

    回复删除
  10. 嗨,非常感谢你。
    我试图在自己的最长的时间内实施它,并认为我理解。但我的解决方案没有 '工作,当我复制你的时候,我得到了PIN规划错误。我有巴斯迪3 FPGA板。我可以做错什么?

    [DRC NSTD-1]未指定的I / O标准:12个逻辑端口中的12个使用I / O标准(iostandard)值'DEFAULT',而不是用户分配特定值。这可能导致I / O与电路板电源或连接影响性能的连接或连接性,信号完整性或极端情况的争请性,导致设备损坏或其连接的组件。要纠正此违规,请指定所有I / O标准。除非所有逻辑端口具有定义的用户指定的I / O标准值,否则此设计将无法生成比特流。要允许使用未指定的I / O标准值(不推荐)的比特流创建,请使用此命令:set_property seriality {warning} [get_drc_checks nstd-1]。注意:使用Vivado运行Infrastructure(例如Launch_runs Tcl命令)时,将此命令添加到.tcl文件,并将该文件添加为Write_BitStream步骤的预挂钩,以实现运行。问题端口:i_binary_num [3:0],i_clk,o_segment_a,o_segment_b,o_segment_c,o_segment_d,o_segment_e,o_segment_f和o_segment_g。

    回复删除

趋势FPGA项目