集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1171|回复: 1

做一个按键自加自减的程序,出现了显示问题。

[复制链接]
pdmonster 发表于 2014-12-4 17:04:27 | 显示全部楼层 |阅读模式
顶层文件




module led_jj_seg(
    input               clock ,
    input               reset ,
    input                                                                key1        ,
    input                                                                key2        ,
   
    output                                                seg_led_a,  
    output                                                seg_led_b,  
    output                                                seg_led_c,  
    output                                                seg_led_d,  
    output                                                seg_led_e,  
    output                                                seg_led_f,  
    output                                                seg_led_g,  
    output                                                seg_led_dp,  
    output                                                seg_led_dig1,
    output                                                seg_led_dig2,
    output                                                seg_led_dig3,
    output                                                seg_led_dig4,
   
    output        [3:0]                        LED

     );

// *************************
// SIGNALS
// *************************
wire  [13:0]    counter;
wire        [3:0]                        seg_s;
wire        [7:0]                        seg;
//wire            clock_200hz;
//wire            clock_10hz;

assign LED[3:0] = 4'b0000;

// *************************
// CODE
// *************************

// *************************
// SUBMODULE   
// *************************
led_jj u_led_jj(
                 .clock      (clock)   ,
                 .reset                  (reset)   ,
                 .counter           (counter) ,
                 .key1                         (key1)           ,
                 .key2       (key2)                 
                );


dyn_seg u_dyn_seg (
                   .clock         (clock_200hz),
                   .reset                      (reset),
                   .data                       (counter),
                   .seg_s               (seg_s),
                   .seg                        (seg)
                                                                         );
                                                                         
// clk_gen u_clk_gen(
//                                      .clock      (clock) ,
//                                      .reset        (reset) ,
//                                      .clock_200hz  (clock_200hz) ,
//                                .clock_10hz   (clock_10hz)
//                   );

assign seg_led_a = seg[0];      
assign seg_led_b = seg[1];      
assign seg_led_c = seg[2];      
assign seg_led_d = seg[3];      
assign seg_led_e = seg[4];      
assign seg_led_f = seg[5];      
assign seg_led_g = seg[6];      
assign seg_led_dp = seg[7];     
assign seg_led_dig1 = seg_s[0];
assign seg_led_dig2 = seg_s[1];
assign seg_led_dig3 = seg_s[2];
assign seg_led_dig4 = seg_s[3];


endmodule








自加、自减文件

module led_jj(
    input               clock ,
    input               reset ,
   
    input                                                                key1        ,
         input                                                                key2        ,
                
                 output                reg [13:0]                counter
                                                );

reg                [1:0]                key_xiaodou;
reg                [1:0]                key_xiaodou_yanchi;

reg                [19:0]        count;

reg                [1:0]                key_cunchu;
reg                [1:0]                key_cunchu_yanchi;

reg                [1:0]                temp;

wire        [1:0]                key_xiaodou_chucun;      
wire        [1:0]                key_cunchu_chucun;

always @(posedge clock or negedge reset)
begin
                if(!reset)begin
                        key_xiaodou        <= 2'b11;
                        key_xiaodou_yanchi        <= 2'b11;
                end
                else begin
                        key_xiaodou <= {key2,key1};
                        key_xiaodou_yanchi <= key_xiaodou;
                end
end


assign                         key_xiaodou_chucun = key_xiaodou_yanchi & (~key_xiaodou);


always @(posedge clock or negedge reset)
begin
                if(!reset)
                        count <= 20'd0;                                //测试下位宽改变有无影响
                else if(key_xiaodou_chucun)
                        count <= 20'd0;       
                else
                        count <= count+1'd1;
end


always @(posedge clock or negedge reset)
begin
                if(!reset)begin
                        key_cunchu                <= 2'b11;
                        key_cunchu_yanchi <= 2'b11;
                end
                else if(count == 20'hfffff)begin
                        key_cunchu <= {key2,key1};
                end
                else begin
                        key_cunchu_yanchi <= key_cunchu;
                end
end                                         

assign                         key_cunchu_chucun = key_cunchu_yanchi & (~key_cunchu);                    


always @ (posedge clock or negedge reset)
begin
    if (!reset) begin
        counter    <= 14'b0;
    end
    else begin
        if (counter==14'd9999) begin
            counter    <= 14'b0;
                    end
        else begin
                temp = key_cunchu_chucun;
            case(temp)
            2'b01 : counter <= counter+14'b1 ;       
                               2'b10 : counter <= counter-14'b1 ;
                               default:;
                                endcase
        end
    end
end
endmodule






显示文件
//****************************************Copyright 2014[c]************************// *
// ************************Declaration***************************************//      
// File name:        dyn_seg.v                                                                                            //
// Author:           buck.feng@link-real.com.cn                             //         
// Date:             2014-03-21 15:18                                        //      
// Version Number:   1.0                                                     //      
// Abstract:                           
// Modification history:[including time, version, author and abstract]        //      
// 2014-03-21 15:18         version 1.0     xxx                                //   
// Abstract: Initial                                                          //      
//                                                                   //               
// *********************************end************************************** //     
`timescale      1ns/100ps

// *************************
// MODULE DEFINTION
// *************************
module dyn_seg(
    input               clock     ,
    input               reset ,
    input       [13:0]  data    ,
    output  reg [3:0]   seg_s   ,
    output  reg [7:0]   seg
);


     
   
// *************************
// SIGNALS
// *************************
reg     [1:0]   count_show    ;

wire    [3:0]   data0       ;
wire    [3:0]   data1       ;
wire    [3:0]   data2       ;
wire    [3:0]   data3       ;
reg     [3:0]   hex         ;

// *************************
// CODE
// *************************

assign data0 = data/1000;
assign data1 = data%1000/100;
assign data2 = data%100/10;
assign data3 = data%10;

always @ (negedge reset or posedge clock)
begin
    if (!reset) begin
        count_show    <= 2'b0;
    end
    else begin
        count_show    <= count_show+2'b1;
    end
end

always @ (negedge reset or posedge clock)
begin
    if(!reset) begin
        seg_s   <= 4'b0;
    end
    else begin
        case(count_show[1:0])
            2'b00 : seg_s <= 4'b0001;
            2'b01 : seg_s <= 4'b0010;
            2'b10 : seg_s <= 4'b0100;
            2'b11 : seg_s <= 4'b1000;
            default: ;
        endcase
    end
end

always @ (*)
begin
    case(count_show[1:0])
        2'b00 : hex <= data0;
        2'b01 : hex <= data1;       
        2'b10 : hex <= data2;
        2'b11 : hex <= data3;
        default:hex <= 4'b0;
    endcase
end

always @ (negedge reset or posedge clock)
begin
    if (!reset) begin
        seg     <= 8'b0;
    end
    else begin
        case(hex)
            4'h0: seg   <= 8'b11000000;
            4'h1: seg   <= 8'b11111001;
            4'h2: seg   <= 8'b10100100;
            4'h3: seg   <= 8'b10110000;
            4'h4: seg   <= 8'b10011001;
            4'h5: seg   <= 8'b10010010;
            4'h6: seg   <= 8'b10000010;
            4'h7: seg   <= 8'b11111000;
            4'h8: seg   <= 8'b10000000;
            4'h9: seg   <= 8'b10010000;
            4'hA: seg   <= 8'b01110111;
            4'hB: seg   <= 8'b01111100;
            4'hC: seg   <= 8'b00111001;
            4'hD: seg   <= 8'b01011110;
            4'hE: seg   <= 8'b01111001;
            4'hF: seg   <= 8'b01110001;
            default: ;
        endcase
    end
end
//// *************************
//// SUBMODULE   
//// *************************
endmodule









程序在上面,但是显示出来后 数码管的数字不对
Cherrycar 该用户已被删除
Cherrycar 发表于 2014-12-6 10:08:41 | 显示全部楼层
试一试把二进制转bcd码模块改一下,直接相除取余速度是非常慢的
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-5-7 05:38 , Processed in 0.089561 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表