|
初学FPGA,自己试着写了一个module,没人教也不知道是不是有错误,或者代码习惯不好的地方,请各位指教:
/*************************************************
2016-11-01 Boen@电航学社 大连海事大学
文件名:degital_led.v
功能:数码管驱动模块(4位)
输入参数:input[15:0] data; //4为16进制显示数据,BCD码
input[1:0] dec; //小数点位置,0为最低位
输出参数:output reg[7:0]seg_db;数码管段选
output reg[3:0]seg_cs;数码管位选
备注:
数码管为共阳,片选0有效(加了反向器)
seg_cs <= 4'b0001; 最低位为最右端数码管的片选
*************************************************/
module digital_led
(clk,rst_n,data,dec,seg_db,seg_cs);
input clk,rst_n;
input[15:0] data; //4为16进制显示数据,BCD码
input[1:0] dec; //小数点位置,0为最低位
output reg[7:0]seg_db;
output reg[3:0]seg_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[15:0] data;//待显示的数据,每四位对应一个数码管仅测试用
reg[1:0] 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[19:0] count;
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
count <= 20'd0;
else
count <= count + 1'b1;
end
/*-------------扫描,片选的同时赋值----------*/
reg[3:0] number;
always @(posedge clk or negedge rst_n ) begin
if(!rst_n)
number <= 4'd0;
else
case(count[19:18])
2'd0: begin number <= data[3:0]; seg_cs <= 4'b1110; end
2'd1: begin number <= data[7:4]; seg_cs <= 4'b1101; end
2'd2: begin number <= data[11:8]; seg_cs <= 4'b1011; end
2'd3: begin number <= data[15:12]; seg_cs <= 4'b0111; end
default:;
endcase
end
/*------段赋值(低7位,第八位是小数点-------*/
//因为使用的是共阳的,所以段码要取反
always @(number)begin
case(number)
4'h0:seg_db[6:0] <= ~SEG_NUM0;
4'h1:seg_db[6:0] <= ~SEG_NUM1;
4'h2:seg_db[6:0] <= ~SEG_NUM2;
4'h3:seg_db[6:0] <= ~SEG_NUM3;
4'h4:seg_db[6:0] <= ~SEG_NUM4;
4'h5:seg_db[6:0] <= ~SEG_NUM5;
4'h6:seg_db[6:0] <= ~SEG_NUM6;
4'h7:seg_db[6:0] <= ~SEG_NUM7;
4'h8:seg_db[6:0] <= ~SEG_NUM8;
4'h9:seg_db[6:0] <= ~SEG_NUM9;
4'hA:seg_db[6:0] <= ~SEG_NUMA;
4'hB:seg_db[6:0] <= ~SEG_NUMB;
4'hC:seg_db[6:0] <= ~SEG_NUMC;
4'hD:seg_db[6:0] <= ~SEG_NUMD;
4'hE:seg_db[6:0] <= ~SEG_NUME;
4'hF:seg_db[6:0] <= ~SEG_NUMF;
default: ;
endcase
end
/*------------小数点位置-----------------*/
always @(dec) begin
case(dec)
2'd0:seg_db[7] <= seg_cs[0];
2'd1:seg_db[7] <= seg_cs[1];
2'd2:seg_db[7] <= seg_cs[2];
2'd3:seg_db[7] <= seg_cs[3];
default: seg_db[7] <= 0;
endcase
end
endmodule
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|