基于NEXYS 4 DDR开发版的verilog实现毫秒计数器

实现设备:
1.笔记本
2.软件:Vivado
3.硬件:NEXYS 4 DDR开发版
实验要求
目的:
1.分时控制:七段数码管显示多个数字 2.分频:从100MHz时钟生成其他频率时钟 3.一个模块包括多个时钟:100MHz, 1KHz, 400Hz 4.二进制转换成十进制
实验要求:

  1. 计数器每毫秒增加1,范围从0~9999 (十进制);
  2. 当reset按钮按下,计数器值清零;
  3. 用4个七段数码管显示计数器的值
    实验原理
    (一)分频原理:
    Nexys开发板的输入时钟是100MHz
    如果我们希望LED每秒闪烁一次,则需要一个2Hz的时钟。 LED每0.5秒改变一次状态 2Hz时钟的周期为0.5秒,高电平时间=低电平时间=0.25秒
    对于100MHz的时钟来说,0.25秒需要25M个周期。 25M个周期意味着从0计算到24,999,999 24,999,999用二进制表示需要25-bit。

(二)实验内容:

  1. 4个七段数码管的刷新频率为100Hz,即每个数码管显示时间为0.0025(1/100/4)秒。
  2. 同一时间只打开一个数码管。定义一个2-bit的计数器,当计数器值为2’b00,打开第1个数码管;当计数器值为2’b01,打开第2个数码管,以此类推;
  3. 定义一个16-bit的变量timer保存计数器的值,该timer[3:0]用于个位,timer[7:4]用于十位,以此类推。

verilog代码:

//
//School: neusoft
// Engineer: yzh
/
module timer(
    input clk,
    input reset_n,
    output reg [15:0] timer,
    output reg [6:0] seg,
    output reg [7:0] AN

    );
reg clk1k;  // 1KHz时钟
reg [15:0] cnt1k;  // 用于产生1KHz时钟的计数器
reg clk400;  // 400Hz时钟
reg [16:0] cnt400;  // 用于产生400Hz时钟的计数器
reg [1:0] cnt_seg;  // 用于控制4个数码管开关
reg [3:0] seg_data;  // 数码管显示的数字


always @(posedge clk) begin
   if (reset_n == 1'b0) begin
           cnt1k <= 0; clk1k <= 1'b0;
   end
   else begin
            if (cnt1k >= 49999) begin
               cnt1k <= 16'd0; clk1k = ~clk1k;
            end
            else begin cnt1k <= cnt1k + 1;
            end
    end
 end

always @(posedge clk) begin
   if (reset_n == 1'b0) begin
           cnt400 <= 0; clk400 <= 1'b0;
   end
   else begin
            if (cnt400 >= 124999) begin
               cnt400 <= 17'd0; clk400 = ~clk400;
            end
            else begin
             cnt400 <= cnt400 + 1;
            end
   end
 end
    
always @(posedge clk1k,negedge reset_n) begin
   if  ( reset_n == 1'b0) begin
        timer <= 16'd0;
   end
   else  begin
       
        timer[3:0] <= timer[3:0] + 1;
  
        if(timer[3:0]==10) begin
           timer[7:4]<=timer[7:4]+1;
           timer[3:0]<= 0;
        end
        else if(timer[7:4]==10) begin
           timer[11:8]<=timer[11:8]+1;
           timer[7:4]<= 0;
       end
       else if(timer[11:8]==10) begin
           timer[15:12]<=timer[15:12]+1;
           timer[11:8]<= 0;
        end
        else if(timer[15:12]==10)begin
      
            timer[15:12]<= 0;
         end
    end
end

always @(posedge clk400  ) begin
    if (reset_n == 1'b0) begin
        cnt_seg <= 2'b00;
      
    end
    else begin
        cnt_seg <= cnt_seg + 1;
      
    end
end

always @(cnt_seg)
begin
  
  case (seg_data )
  4'd0 : seg <= 7'b0000001;   //0
  4'd1 : seg <= 7'b1001111;   //1
  4'd2 : seg <= 7'b0010010;   //2
  4'd3 : seg <= 7'b0000110;   //3
  4'd4 : seg <= 7'b1001100;   //4
  4'd5 : seg <= 7'b0100100;   //5
  4'd6 : seg <= 7'b0100000;   //6
  4'd7 : seg <= 7'b0001111;   //7
  4'd8 : seg <= 7'b0000000;   //8
  4'd9 : seg <= 7'b0000100;   //9
  default : seg <= 7'b0000001;   //0
        endcase
 
 case (cnt_seg)
  2'b00: begin AN<= 8'b11111110;seg_data<=timer[3:0] ; end
  2'b01: begin AN<= 8'b11111101;seg_data<=timer[7:4]; end
  2'b10: begin AN <= 8'b11111011;seg_data<=timer[11:8] ; end
  2'b11: begin  AN <= 8'b11110111; seg_data<=timer[15:12]; end
   default:AN <= 8'b11110000;
   endcase
   
  if(reset_n == 1'b0) 
  begin
       AN <= 8'b11110000;
       seg_data<=0;
  end
  
end
endmodule

约束文件:

## Clock signal
set_property -dict { PACKAGE_PIN E3    IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_35 Sch=clk100mhz
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {clk}];
## LEDs

set_property -dict { PACKAGE_PIN H17   IOSTANDARD LVCMOS33 } [get_ports {timer[0] }];# IO_L18P_T2_A24_15 Sch=led[0]
set_property -dict { PACKAGE_PIN K15   IOSTANDARD LVCMOS33 } [get_ports {timer[1] }];# IO_L24P_T3_RS1_15 Sch=led[1]
set_property -dict { PACKAGE_PIN J13   IOSTANDARD LVCMOS33 } [get_ports {timer[2] }];# IO_L17N_T2_A25_15 Sch=led[2]
set_property -dict { PACKAGE_PIN N14   IOSTANDARD LVCMOS33 } [get_ports {timer[3] }];# IO_L8P_T1_D11_14 Sch=led[3]
set_property -dict { PACKAGE_PIN R18   IOSTANDARD LVCMOS33 } [get_ports {timer[4] }];# IO_L7P_T1_D09_14 Sch=led[4]
set_property -dict { PACKAGE_PIN V17   IOSTANDARD LVCMOS33 } [get_ports {timer[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5]
set_property -dict { PACKAGE_PIN U17   IOSTANDARD LVCMOS33 } [get_ports { timer[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6]
set_property -dict { PACKAGE_PIN U16   IOSTANDARD LVCMOS33 } [get_ports {timer[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7]
set_property -dict { PACKAGE_PIN V16   IOSTANDARD LVCMOS33 } [get_ports {timer[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8]
set_property -dict { PACKAGE_PIN T15   IOSTANDARD LVCMOS33 } [get_ports { timer[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9]
set_property -dict { PACKAGE_PIN U14   IOSTANDARD LVCMOS33 } [get_ports {timer[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10]
set_property -dict { PACKAGE_PIN T16   IOSTANDARD LVCMOS33 } [get_ports {timer[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11]
set_property -dict { PACKAGE_PIN V15   IOSTANDARD LVCMOS33 } [get_ports {timer[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12]
set_property -dict { PACKAGE_PIN V14   IOSTANDARD LVCMOS33 } [get_ports {timer[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13]
set_property -dict { PACKAGE_PIN V12   IOSTANDARD LVCMOS33 } [get_ports {timer[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14]
set_property -dict { PACKAGE_PIN V11   IOSTANDARD LVCMOS33 } [get_ports {timer[15]}];
##7 segment display

set_property -dict { PACKAGE_PIN T10   IOSTANDARD LVCMOS33 } [get_ports { seg[6] }];# IO_L24N_T3_A00_D16_14 Sch=ca
set_property -dict { PACKAGE_PIN R10   IOSTANDARD LVCMOS33 } [get_ports { seg[5] }]; #IO_25_14 Sch=cb
set_property -dict { PACKAGE_PIN K16   IOSTANDARD LVCMOS33 } [get_ports { seg[4] }]; #IO_25_15 Sch=cc
set_property -dict { PACKAGE_PIN K13   IOSTANDARD LVCMOS33 } [get_ports { seg[3] }]; #IO_L17P_T2_A26_15 Sch=cd
set_property -dict { PACKAGE_PIN P15   IOSTANDARD LVCMOS33 } [get_ports { seg[2] }]; #IO_L13P_T2_MRCC_14 Sch=ce
set_property -dict { PACKAGE_PIN T11   IOSTANDARD LVCMOS33 } [get_ports { seg[1] }]; #IO_L19P_T3_A10_D26_14 Sch=cf
set_property -dict { PACKAGE_PIN L18   IOSTANDARD LVCMOS33 } [get_ports { seg[0] }]; #IO_L4P_T0_D04_14 Sch=cg
set_property -dict { PACKAGE_PIN J17   IOSTANDARD LVCMOS33 } [get_ports { AN[0] }];# IO_L23P_T3_FOE_B_15 Sch=an[0]
set_property -dict { PACKAGE_PIN J18   IOSTANDARD LVCMOS33 } [get_ports { AN[1] }];# IO_L23N_T3_FWE_B_15 Sch=an[1]
set_property -dict { PACKAGE_PIN T9    IOSTANDARD LVCMOS33 } [get_ports { AN[2] }];# IO_L24P_T3_A01_D17_14 Sch=an[2]
set_property -dict { PACKAGE_PIN J14   IOSTANDARD LVCMOS33 } [get_ports { AN[3] }];# IO_L19P_T3_A22_15 Sch=an[3]
set_property -dict { PACKAGE_PIN P14   IOSTANDARD LVCMOS33 } [get_ports { AN[4] }];# IO_L8N_T1_D12_14 Sch=an[4]
set_property -dict { PACKAGE_PIN T14   IOSTANDARD LVCMOS33 } [get_ports { AN[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5]
set_property -dict { PACKAGE_PIN K2    IOSTANDARD LVCMOS33 } [get_ports { AN[6] }];# IO_L23P_T3_35 Sch=an[6]
set_property -dict { PACKAGE_PIN U13   IOSTANDARD LVCMOS33 } [get_ports { AN[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值