这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 60的实现,不知道问题出现在哪里

共5条 1/1 1 跳转至

60的实现,不知道问题出现在哪里

工程师
2012-11-02 22:11:17     打赏
module shixian60(sys_clk,
                sys_rstn,
    sm_seg,
    sm_bit,
    );
//输入、输出信号
input           sys_clk;//全局时钟,50MHZ
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     [2:0]   disp_dat;//显示数据寄存器
reg     [35:0]  delay_cnt;//延时寄存器
reg     ge,shi;//
//------------------------设定扫描1KHZ------------
always@(posedge sys_clk or negedge sys_rstn)
    begin
     if(!sys_rstn)
      delay_cnt<=16'd0;
  else
      begin
       if(delay_cnt==36'd49_999_999_999)
    delay_cnt<=16'd0;
    else
        delay_cnt<=delay_cnt+1'b1;
   end
 end
//--------------秒个位计时器计时------------------------
always@(posedge sys_clk or negedge sys_rstn)
    begin
        if(!sys_rstn)
            begin
                ge<=4'd0;
   end
  else
      begin
   if(delay_cnt==26'd49_999_999)
       begin
     if(ge==4'd10)
         ge<=4'd0;
     else
         ge<=ge+1'b1;
       end
   end
 end
//--------------秒十位计时器计时------------------------
always@(posedge sys_clk or negedge sys_rstn)
    begin
        if(!sys_rstn)
            begin
                shi<=4'd0;
   end
  else
      begin
   if(delay_cnt==36'd49_999_999_999)
       begin
     if(shi==4'd6)
         shi<=4'd0;
     else
         shi<=shi+1'b1;
       end
   end
    end
//------动态扫描位扫描中间变量----------------------
always@(posedge sys_clk or negedge sys_rstn)
    begin
        if(!sys_rstn)
         disp_dat<=1'b0;
  else
      begin
       if(delay_cnt==16'd49_999)
        disp_dat<=disp_dat+1'b1;
    else
        disp_dat<=disp_dat;
   end
 end
 //----------
always@(disp_dat)
    begin
        case(disp_dat)
            1'b0:sm_bit=8'b1111_1110;
   1'b1:sm_bit=8'b1111_1101;
   default:sm_bit=8'b1111_1100;
  endcase
 end
//---------数码管动态显示位选-------------
always@(sm_bit)
    begin
     case(sm_bit)
      8'b1111_1110:dataout_buf=ge;
   8'b1111_1101:dataout_buf=shi;
   default:dataout_buf=8;
  endcase
 end
//-----------------将十进制数转换成BCD七段码---------
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
不知道错误在哪里,希望大神帮一下小弟



关键词: 实现     不知道     问题     出现     在哪里     begin    

工程师
2012-11-02 22:21:08     打赏
2楼
数据不会跑,考虑并行实现6进制跟10进制

工程师
2012-11-04 09:30:20     打赏
3楼
修改过后还是不行,肯定还有其它问题

工程师
2012-11-04 13:00:43     打赏
4楼
module shixian60(sys_clk,
                sys_rstn,
    sm_seg,
    sm_bit,
    );
//输入、输出信号
input           sys_clk;//全局时钟,50MHZ
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     [1:0]   disp_dat;//显示数据寄存器
reg     [27:0]  delay_cnt;//延时寄存器
reg     [3:0]   ge,shi;//
//------------------------设定扫描1KHZ------------
always@(posedge sys_clk or negedge sys_rstn)
    begin
     if(!sys_rstn)
      delay_cnt<=28'd0;
  else
      begin
       if(delay_cnt==28'd49_999)
    delay_cnt<=28'd0;
    else
        delay_cnt<=delay_cnt+1'b1;
   end
 end
//--------------秒个位计时器计时------------------------
always@(posedge sys_clk or negedge sys_rstn)
    begin
        if(!sys_rstn)
            begin
                ge<=4'd0;
   end
  else
      begin
   if(delay_cnt==28'd49_999_999)
       begin
     if(ge==4'd10)
         ge<=4'd0;
     else
         ge<=ge+1'b1;
       end
   end
 end
//--------------秒十位计时器计时------------------------
always@(posedge sys_clk or negedge sys_rstn)
    begin
        if(!sys_rstn)
            begin
                shi<=4'd0;
   end
  else
      begin
   if(delay_cnt==28'd499_999_999)
       begin
     if(shi==4'd6)
         shi<=4'd0;
     else
         shi<=shi+1'b1;
       end
   end
    end
//------动态扫描位扫描中间变量----------------------
always@(posedge sys_clk or negedge sys_rstn)
    begin
        if(!sys_rstn)
         disp_dat<=1'b0;
  else
      begin
       if(delay_cnt==28'd49_999)
        disp_dat<=disp_dat+1'b1;
    else
        disp_dat<=disp_dat;
   end
 end
 //----------
always@(disp_dat)
    begin
        case(disp_dat)
            1'b0:sm_bit=8'b1111_1110;
   1'b1:sm_bit=8'b1111_1101;
   default:sm_bit=8'b1111_1100;
  endcase
 end
//---------数码管动态显示位选-------------
always@(sm_bit)
    begin
     case(sm_bit)
      8'b1111_1110:dataout_buf=ge;
   8'b1111_1101:dataout_buf=shi;
   default:dataout_buf=8;
  endcase
 end
//-----------------将十进制数转换成BCD七段码---------
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
标记颜色的都是改过后的,我的思路是:个位每一秒记一次,十位是每十秒记一次,估计是always的使用方法不会用。好多细节的东西没有注意到

工程师
2012-11-04 14:51:45     打赏
5楼
是啊,我的本意就是让它们各自记各自的,这个思路可不可以实现60呢

共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]