用Verilog语言怎么写一个60进制的计数器然后显示在数码管上

2019-07-16 00:29发布

小弟刚学FPGA用的是EP4CE6  现在想写一个60进制的计数器 然后在数码管上显示出来   用verilog写   但想了好几天没想出来   去大侠指导下   或给个程序看看   小弟感激不尽。。。。。拜托了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
Aiby
1楼-- · 2019-07-17 14:50
module scan_led (sys_clk              ,
                                 sys_rstn                ,
                                 sm_seg                  ,
                                 sm_bit
                                );
input               sys_clk           ;
input               sys_rstn          ;
output     [7:0]    sm_seg            ;
output     [7:0]    sm_bit            ;                               
reg              [7:0]    sm_seg            ;
reg              [7:0]    sm_bit            ;
reg                  [4:0]    dataout_buf       ;
reg                  [3:0]    shi               ;
reg                  [3:0]    ge                ;
reg                  [5:0]    count             ;
reg        [1:0]    disp_dat          ;
reg        [15:0]   delay_cnt         ;
reg        [25:0]   delay_cnt_1hz      ;
always@(posedge sys_clk or negedge sys_rstn)
        begin
                if(!sys_rstn)
                        delay_cnt<=16'd0;
                else if(delay_cnt==16'd49999)
                        delay_cnt<=16'd0;
                else
                        delay_cnt<=delay_cnt+1'b1;       
        end


always@(posedge sys_clk or negedge sys_rstn)
        begin
                if(!sys_rstn)
                        delay_cnt_1hz<=26'd0;
                else if(delay_cnt_1hz==26'd49999999)
                        delay_cnt_1hz<=26'd0;
                else
                        delay_cnt_1hz<=delay_cnt_1hz+1'b1;       
        end       
       

       
always@(posedge sys_clk or negedge sys_rstn)
        begin
                if(!sys_rstn)
                        disp_dat<=4'd0;
                else if(delay_cnt==16'd49999)
                        disp_dat<=disp_dat+1'b1;
                else
                        disp_dat<=disp_dat;       
        end
always@(posedge sys_clk or negedge sys_rstn)
        begin
                if(!sys_rstn)
                        count<=6'd0;
                else if(delay_cnt_1hz==26'd49999999)
                        count<=count+1'b1;
                else if(count==60)
                   count<=6'd0;
                else       
                        count<=count;       
        end
always@(posedge sys_clk or negedge sys_rstn)       
  begin
                if(!sys_rstn)
                        shi<=4'd0;
                else
                   shi<=count/10;
        end
       
always@(posedge sys_clk or negedge sys_rstn)       
  begin
                if(!sys_rstn)
                        ge<=4'd0;
                else
                   ge<=count%10;
        end                     
       
always @(disp_dat)
begin
   case(disp_dat)
       2'b00 :
          sm_bit = 8'b1111_1110;
       2'b01 :
          sm_bit = 8'b1111_1101;
      /* 2'b10 :
          sm_bit = 8'b1111_1110;
       2'b11 :
          sm_bit = 8'b1111_1101;*/

       default :
          sm_bit = 8'b1111_1110;
    endcase
end
always@(sm_bit)
begin
        case(sm_bit)
                8'b1111_1110:
                        dataout_buf<=ge;
                8'b1111_1101:
                        dataout_buf<=shi;
                /*8'b1111_1011:
                        dataout_buf=2;
                8'b1111_0111:
                        dataout_buf=3;       
                8'b1110_1111:
                        dataout_buf=4;
                8'b1101_1111:
                        dataout_buf=5;
                8'b1011_1111:
                        dataout_buf=6;
                8'b0111_1111:
                        dataout_buf=7;*/
                default:
                        dataout_buf=0;
         endcase
end

always@(dataout_buf)
begin
        case(dataout_buf)
                    4'h0 : sm_seg = 8'hc0;   // "0"
                        4'h1 : sm_seg = 8'hf9;   // "1"
                        4'h2 : sm_seg = 8'ha4;   // "2"
                        4'h3 : sm_seg = 8'hb0;   // "3"
                        4'h4 : sm_seg = 8'h99;   // "4"
                        4'h5 : sm_seg = 8'h92;   // "5"
                        4'h6 : sm_seg = 8'h82;   // "6"
                        4'h7 : sm_seg = 8'hf8;   // "7"
                        4'h8 : sm_seg = 8'h80;   // "8"
                        4'h9 : sm_seg = 8'h90;   // "9"
                        4'ha : sm_seg = 8'h88;   // "a"
                        4'hb : sm_seg = 8'h83;   // "b"
                        4'hc : sm_seg = 8'hc6;   // "c"
                        4'hd : sm_seg = 8'ha1;   // "d"
                        4'he : sm_seg = 8'h86;   // "e"
                        4'hf : sm_seg = 8'h8e;   // "f"
                        default :
                                  sm_seg = 8'hc0;   // "0"
         endcase
end
endmodule


唯爱萌meng
2楼-- · 2019-07-17 19:01
好麻烦,六个十进制计数器就ok了
yjzloveyj
3楼-- · 2019-07-17 23:41
写点注释给看看呗
江小祖
4楼-- · 2019-07-18 00:40
楼主 你好,我看了你的 十位和各位取模,直接用的 /和% ,这样不是说不能综合吗?
xqandwn
5楼-- · 2019-07-18 05:14
 精彩回答 2  元偷偷看……
xqandwn
6楼-- · 2019-07-18 05:45
本帖最后由 xqandwn 于 2015-10-18 22:26 编辑

用systemverilog写的,相比于Verilog就多了个logic 变量,其它与Verilog一致。
顶层模块:

`timescale 1ns/1ps

//模块说明:7段数码管显示,一共有8个数码管
//共阳模式,低电平点亮,数码管采用3-8 译码器——74HC138芯片,

module cnt_60
(
        input          logic                       CLK                  ,        //输入时钟,频率:
        input          logic                       RST_n               ,        //复位端口,低电平复位        
        output        logic        [3:0]        DSEL                ,        //7段数码管【8--1】对应选择
        output        logic                       DEN                 ,   //数码管使能,高电平有效
        output        logic        [7:0]        led7_out                //数据输出,最低位为小数点
);                                          

logic [26:0]       num; //待显示的数字
logic [2:0]         dot; //待显示数字的小数点位置

always@(posedge CLK,negedge RST_n)
begin
        if(!RST_n)
                num <= 27'd0;
        else
         num = (num != 59)? (num + 27'd1) : num;
end

LED_7 U_LED_7
(
        .CLK           (CLK                            ),        //输入时钟
        .RST_n        (RST_n                        ),        //复位端口,低电平复位
        .data_num   (num                          ),         //待显示的数据
        .data_dot     (dot                           ),         //输入数据小数点位置
        .DSEL          (DSEL                       ),        //7段数码管【8--1】对应选择
        .DEN           (DEN                        ),        //数码管使能,高电平有效
        .led7_out     (led7_out                  )        //数据输出,最低位为小数点
);

endmodule

一周热门 更多>