1FPGA数码管动态显示(BCD)//smg_top.Vmodulesmg_top(clk,rst_n,sm_cs,sm_db,num,//用于仿真dis_data_in//用于仿真);inputclk;//50MHzinputrst_n;//复位信号,低有效input[9:0]dis_data_in;//用于仿真//reg[9:0]dis_data_in;//显示数据wire[11:0]dis_data_out;//显示数据output[2:0]sm_cs;//数码管片选信号,低有效output[3:0]num;//用于仿真output[6:0]sm_db;//7段数码管(不包括小数点)smg_displaysmg_display(.clk(clk),.rst_n(rst_n),.dis_data(dis_data_out),.sm_cs(sm_cs),.num(num),.sm_db(sm_db));bin_BCDbin_BCD(.clk(clk),.rst_n(rst_n),.bin(dis_data_in),.BCD_out(dis_data_out));endmodule2//bin_BCD.V`timescale1ns/1psmodulebin_BCD(clk,bin,rst_n,BCD_out);input[9:0]bin;inputclk,rst_n;output[11:0]BCD_out;//十进制BCD码reg[3:0]count;reg[11:0]BCD_out;reg[21:0]shift_reg=22'd0;//////////////////////计数部分////////////////////////always@(posedgeclkornegedgerst_n)beginif(!rst_n)count=4'd0;elseif(count==11)count=4'd0;elsecount=count+1'b1;end//////////////////////二进制转换为十进制BCD码/////////////////always@(posedgeclkornegedgerst_n)beginif(!rst_n)shift_reg=22'd0;elseif(count==0)shift_reg={12'd0,bin};elseif(count=10)//实现8次移位操作beginif(shift_reg[13:10]=5)//判断个位是否5,如果是则+3beginif(shift_reg[17:14]=5)//判断十位是否5,如果是则+3beginshift_reg[17:14]=shift_reg[17:14]+2'b11;shift_reg[13:10]=shift_reg[13:10]+2'b11;shift_reg=shift_reg1'd1;//对个位和十位操作结束后,整体左移end3elsebeginshift_reg[17:14]=shift_reg[17:14];shift_reg[13:10]=shift_reg[13:10]+2'b11;shift_reg=shift_reg1'd1;endendelsebeginif(shift_reg[17:14]=5)beginshift_reg[17:14]=shift_reg[17:14]+2'b11;shift_reg[13:10]=shift_reg[13:10];shift_reg=shift_reg1'd1;endelsebeginshift_reg[17:14]=shift_reg[17:14];shift_reg[13:10]=shift_reg[13:10];shift_reg=shift_reg1'd1;endendendend/////////////////输出赋值//////////////////////////always@(posedgeclkornegedgerst_n)beginif(!rst_n)BCD_out=12'd0;elseif(count==11)//此时8次移位全部完成,将对应的值分别赋给个,十,百位BCD_out={shift_reg[21:18],shift_reg[17:14],shift_reg[13:10]};endendmodule4//smg_display.V`timescale1ns/1psmodulesmg_display(clk,rst_n,dis_data,//需要显示的数字sm_cs,sm_db,num//用于仿真,选择需要显示的数字);inputclk;//50MHzinputrst_n;//复位信号,低有效input[11:0]dis_data;//显示数据output[3:0]num;//用于仿真output[2:0]sm_cs;//数码管片选信号,低有效output[6:0]sm_db;//7段数码管(不包括小数点)reg[2:0]sm_cs;//数码管片选信号,低有效(共阴)reg[15:0]cnt;//1ms计数=65536*20nsreg[1:0]cnt_dis;//每毫秒刷新一次显示always@(posedgeclkornegedgerst_n)if(!rst_n)begincnt=16'd0;cnt_dis=2'd1;endelsebegincnt=cnt+1'b1;if(cnt==16'hffff)cnt_dis=cnt_dis+1'd1;end//-------------------------------------------------------------------------------parameterseg0=7'h3f,seg1=7'h06,seg2=7'h5b,seg3=7'h4f,seg4=7'h66,5seg5=7'h6d,seg6=7'h7d,seg7=7'h07,seg8=7'h7f,seg9=7'h6f,sega=7'h77,segb=7'h7c,segc=7'h39,segd=7'h5e,sege=7'h79,segf=7'h71;reg[6:0]sm_dbr;//7段数码管(不包括小数点)reg[3:0]num;//显示数据always@(posedgeclk)case(cnt_dis)2'd1:beginnum=dis_data[11:8];sm_cs=3'b011;end2'd2:beginnum=dis_data[7:4];sm_cs=3'b101;end2'd3:beginnum=dis_data[3:0];sm_cs=3'b110;enddefault:sm_cs=3'b111;endcasealways@(posedgeclk)case(num)//NUM值显示在两个数码管上64'h0:sm_dbr=seg0;4'h1:sm_dbr=seg1;4'h2:sm_dbr=seg2;4'h3:sm_dbr=seg3;4'h4:sm_dbr=seg4;4'h5:sm_dbr=seg5;4'h6:sm_dbr=seg6;4'h7:sm_dbr=seg7;4'h8:sm_dbr=seg8;4'h9:sm_dbr=seg9;4'ha:sm_dbr=sega;4'hb:sm_dbr=segb;4'hc:sm_dbr=segc;4'hd:sm_dbr=segd;4'he:sm_dbr=sege;4'hf:sm_dbr=segf;default:;endcaseassignsm_db=sm_dbr;endmodule7//smg_top.vt`timescale1ns/1psmodulesmg_top_vlg_tst();regclk;regrst_n;reg[9:0]dis_data_in;//用于仿真wire[2:0]sm_cs;wire[3:0]num;//用于仿真wire[6:0]sm_db;smg_topi1(.clk(clk),.rst_n(rst_n),.num(num),.sm_cs(sm_cs),.dis_data_in(dis_data_in),.sm_db(sm_db));initialbeginclk=1'b0;rst_n=1'b0;dis_data_in=10'd987;#100rst_n=1'b1;endalways#10clk=~clk;endmodule仿真图: