549646150 发表于 2016-11-2 10:23:59

FPGA数码管module,请大家点评

初学FPGA,自己试着写了一个module,没人教也不知道是不是有错误,或者代码习惯不好的地方,请各位指教:



/*************************************************
                2016-11-01 Boen@电航学社 大连海事大学
文件名:degital_led.v
功能:数码管驱动模块(4位)
输入参数:input data;        //4为16进制显示数据,BCD码
          input dec;        //小数点位置,0为最低位
输出参数:output regseg_db;数码管段选
          output regseg_cs;数码管位选
备注:
        数码管为共阳,片选0有效(加了反向器)
        seg_cs <= 4'b0001;        最低位为最右端数码管的片选                       
*************************************************/
module digital_led
        (clk,rst_n,data,dec,seg_db,seg_cs);

input clk,rst_n;
input data;        //4为16进制显示数据,BCD码
input dec;        //小数点位置,0为最低位
output regseg_db;
output regseg_cs;

parameter SEG_NUM0 = 7'h3f,//c0, //前面是共阴的,后面是共阳的;第一位是小数点
                       SEG_NUM1 = 7'h06,//f9,
                       SEG_NUM2 = 7'h5b,//a4,
                       SEG_NUM3 = 7'h4f,//b0,
                       SEG_NUM4 = 7'h66,//99,
                       SEG_NUM5 = 7'h6d,//92,
                       SEG_NUM6 = 7'h7d,//82,
                       SEG_NUM7 = 7'h07,//f8,
                       SEG_NUM8 = 7'h7f,//80,
                       SEG_NUM9 = 7'h6f,//90,
                       SEG_NUMA = 7'h77,//88,
                       SEG_NUMB = 7'h7c,//83,
                       SEG_NUMC = 7'h39,//c6,
                       SEG_NUMD = 7'h5e,//5e,
                       SEG_NUME = 7'h79,//86,
                       SEG_NUMF = 7'h71;//8e;


/*/————————————————————仅测试用————————————————————//
reg data;//待显示的数据,每四位对应一个数码管仅测试用
reg dec; //小数点位数
always @(posedge clk or negedge rst_n ) begin
        if(!rst_n)
                begin data <= 16'h123f;        dec <= 2'd2; end//注意data内存的是BCD码
//        else if(count == 20'hfffff)
//                data <= data + 1'b1;
end
——————————————————————————————————————————————*/



/*-------------扫描频率计数器---------------*/
//19位计数器 系统时钟50M 扫描频率47.6HZ
reg count;       
always @(posedge clk or negedge rst_n) begin
        if(!rst_n)
                count <= 20'd0;
        else
                count <= count + 1'b1;       
end


/*-------------扫描,片选的同时赋值----------*/
reg number;
always @(posedge clk or negedge rst_n ) begin
        if(!rst_n)
                number <= 4'd0;
        else        
                case(count)
                2'd0: begin number <= data; seg_cs <= 4'b1110; end
                2'd1: begin number <= data; seg_cs <= 4'b1101; end
                2'd2: begin number <= data; seg_cs <= 4'b1011; end
                2'd3: begin number <= data; seg_cs <= 4'b0111; end
                default:;
                endcase
end



/*------段赋值(低7位,第八位是小数点-------*/
//因为使用的是共阳的,所以段码要取反
always @(number)begin
        case(number)
        4'h0:seg_db <= ~SEG_NUM0;
        4'h1:seg_db <= ~SEG_NUM1;
        4'h2:seg_db <= ~SEG_NUM2;
        4'h3:seg_db <= ~SEG_NUM3;
        4'h4:seg_db <= ~SEG_NUM4;
        4'h5:seg_db <= ~SEG_NUM5;
        4'h6:seg_db <= ~SEG_NUM6;
        4'h7:seg_db <= ~SEG_NUM7;
        4'h8:seg_db <= ~SEG_NUM8;
        4'h9:seg_db <= ~SEG_NUM9;
        4'hA:seg_db <= ~SEG_NUMA;
        4'hB:seg_db <= ~SEG_NUMB;
        4'hC:seg_db <= ~SEG_NUMC;
        4'hD:seg_db <= ~SEG_NUMD;
        4'hE:seg_db <= ~SEG_NUME;
        4'hF:seg_db <= ~SEG_NUMF;
        default: ;
        endcase
end

/*------------小数点位置-----------------*/
always @(dec) begin
        case(dec)
        2'd0:seg_db <= seg_cs;
        2'd1:seg_db <= seg_cs;
        2'd2:seg_db <= seg_cs;
        2'd3:seg_db <= seg_cs;
        default: seg_db <= 0;
        endcase
end



endmodule

我是谁712 发表于 2016-11-4 12:41:09

弱弱问一下,是不是没有消影?

passage110 发表于 2016-11-4 13:07:44

尽量同步    注意复位处理
(个人见解)

gxh470873852 发表于 2016-11-20 12:34:41

异步复位,同步释放

549646150 发表于 2017-5-12 14:28:50

passage110 发表于 2016-11-4 13:07
尽量同步    注意复位处理
(个人见解)

谢谢{:lol:}

7802848 发表于 2017-5-12 15:52:08

data没动,差评
页: [1]
查看完整版本: FPGA数码管module,请大家点评