Verilog数码显示器00~99循环计数器电路

采用2位7段数码显示器设计一个00~99循环计数器电路。输入包括一个时钟输入端和一个低电平复位端,
复位时输出88,两个输出分别控制高位和低位数码显示器。

7位数码管显示器的结构图如下:
在这里插入图片描述

a~g分别对应输出out中的0-7,由低位到高位,其中out0表示低位,out1表示高位。

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2020/07/24 10:00:19
// Design Name: 
// Module Name: Test1000
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module Test1000(clk,reset,out0,out1);
input clk,reset;
output [6:0] out0,out1;
reg [6:0] out0,out1;
reg [9:0] cnt;
reg [3:0] pr_state,nx_state;
reg [3:0] state;
parameter s0=0,s1=1,s2=2,s3=3,s4=4,s5=5,s6=6,s7=7,s8=8,s9=9;
parameter zero=7'b0111111,one=7'b0000110,two=7'b1011011,three=7'b1001111,four=7'b1100110,five=7'b1101101,
           six=7'b1111101,seven=7'b0000111,eight=7'b1111111,nine=7'b1101111;
         
always @(posedge clk or posedge reset)
   if(!reset)
      begin
         pr_state<=s8;
         state<=s8;
         cnt=0;
      end
   else
      begin
         pr_state<=nx_state;
         state<=cnt;
      end
      
always @(pr_state)
   case(pr_state)
   s0:begin
         nx_state=s1;
         out0=zero;
      end
   s1:begin
         nx_state=s2;
         out0=one;
      end
   s2:begin
         nx_state=s3;
         out0=two;
      end
   s3:begin
         nx_state=s4;
         out0=three;
      end
   s4:begin
         nx_state=s5;
         out0=four;
      end
   s5:begin
         nx_state=s6;
         out0=five;
      end
   s6:begin
         nx_state=s7;
         out0=six;
      end
   s7:begin
         nx_state=s8;
         out0=seven;
      end
   s8:begin
         nx_state=s9;
         out0=eight;
      end
   s9:begin
         nx_state=s0;
         out0=nine;
         cnt=cnt+1;
      end
   default:begin
              nx_state=s0;
              out0=zero;
              state=zero;
           end
   endcase
   
always@(state)
   case(state)
   s0:begin
         out1=zero;
      end
   s1:begin
         out1=one;
      end
   s2:begin
         out1=two;
      end
   s3:begin
         out1=three;
      end
   s4:begin
         out1=four;
      end
   s5:begin
         out1=five;
      end
   s6:begin
         out1=six;
      end
   s7:begin
         out1=seven;
      end
   s8:begin
         out1=eight;
      end
   s9:begin
         out1=nine;
      end
   default:begin
              state=s0;
              out1=zero;
           end
   endcase
endmodule

测试代码

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2020/07/24 10:27:04
// Design Name: 
// Module Name: Test1027
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module Test1027;
reg clk;
reg reset;
wire [6:0] out0,out1;
initial begin
   clk=0;
   reset=0;
   #100;
   reset=1;
end
 
always begin
   #10 clk=1;
   #10 clk=0;
end

Test1000 x1(
            .clk   (clk   ),
            .reset (reset ),
            .out0  (out0  ),
            .out1  (out1  ));
endmodule

仿真波形
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
因为仿真波形较长,这里只展示部分,可以根据输出out信号来对照数码管显示的数字。第一仿真图中,由于复位数为88,因此会直接跳至09,然后到10,之后会正常计数,第二个周期的完整循环将会从00开始。

  • 5
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
Verilog 数码管动态显示的实现方法如下: 首先,需要定义数码管的引脚和位选引脚: ```verilog module digit_display( input clk, // 时钟信号 output reg [6:0] seg, // 数码管引脚 output reg [3:0] sel // 位选引脚 ); ``` 接着,定义一个计数器,用于控制数码管的扫描: ```verilog reg [23:0] counter; // 计数器,用于控制数码管的扫描 ``` 在时钟上升沿处,对计数器进行加一操作,并根据计数器的值来选择要显示的数码管和位选引脚。 ```verilog always @(posedge clk) begin counter <= counter + 1; // 计数器加一 case(counter[23:20]) 4'b0000: begin sel <= 4'b1110; seg <= 7'b1000000; end // 第一位显示0 4'b0001: begin sel <= 4'b1101; seg <= 7'b1111001; end // 第二位显示1 4'b0010: begin sel <= 4'b1011; seg <= 7'b0100100; end // 第三位显示2 4'b0011: begin sel <= 4'b0111; seg <= 7'b0110000; end // 第四位显示3 // ... 可以继续添加其他数字的显示 endcase end ``` 最后,将数码管和位选引脚连接到对应的硬件引脚上即可。 完整代码如下: ```verilog module digit_display( input clk, // 时钟信号 output reg [6:0] seg, // 数码管引脚 output reg [3:0] sel // 位选引脚 ); reg [23:0] counter; // 计数器,用于控制数码管的扫描 always @(posedge clk) begin counter <= counter + 1; // 计数器加一 case(counter[23:20]) 4'b0000: begin sel <= 4'b1110; seg <= 7'b1000000; end // 第一位显示0 4'b0001: begin sel <= 4'b1101; seg <= 7'b1111001; end // 第二位显示1 4'b0010: begin sel <= 4'b1011; seg <= 7'b0100100; end // 第三位显示2 4'b0011: begin sel <= 4'b0111; seg <= 7'b0110000; end // 第四位显示3 // ... 可以继续添加其他数字的显示 endcase end endmodule ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值