FPGA 动态数码管 二进制转8421BCD码

module SHUMAGUAN(
      input rst,
	  input clk,
	  input [6:0] price_all,
	  input [6:0] charge_money,
	  input flag,//0,投的;1,找的;
	  output reg [7:0] num,//段选
	  output reg [3:0] position//位选
	  
    );
	 reg [15:0]ms_count;//1毫秒计数器
	 reg [1:0] po_state;//位选状态
	 reg [3:0] num_1,num_2,num_3,num_4;//num_2,num_3,num_4为2进制对应成BCD码的3个数(num_1让它一直为0)
	 reg [3:0] num_;//要显示的数字状态?
	 reg [18:0]temp;//投的钱的二进制到bcd所需的位宽
	 reg [18:0]temp1;//找的钱的二进制到bcd所需的位宽

    always@(posedge clk or negedge rst)//1毫秒计数器
	begin
		if(!rst)
		ms_count<=0;
		else if(ms_count==49_999)
		ms_count<=0;
		else
		ms_count<=ms_count+1;
	end
	
	always@(posedge clk or negedge rst)//数码管1ms刷新
	begin
		if(!rst)
		po_state<=0;
		else if(ms_count==49_999)
			begin
				if(po_state==3)
					po_state<=0;
				else
					po_state<=po_state+1;
			end
	end
	
	always@(po_state)//数码管位选
	begin
		if(po_state==0)
			position=4'b1110;
		else if(po_state==1)
			position=4'b1101;
		else if(po_state==2)
			position=4'b1011;
		else if(po_state==3)
			position=4'b0111;
	end
	
	always@(*)//加三移位法(二进制转8421BCD码)
	begin
		if(!rst)
			begin
				num_1=4'd0;
				num_2=4'd0;
				num_3=4'd0;
				num_4=4'd0;
			end
		else 
			begin
				temp=19'd0;//投
				temp1=19'd0;//找
				temp[6:0]=price_all;//投
				temp1[6:0]=charge_money;//找
				repeat(7)//将投的钱的二进制转为bcd
					begin
						if(temp[10:7]>4)
							temp[10:7]=temp[10:7]+2'd3;
						if(temp[14:11]>4)
							temp[14:11]=temp[14:11]+2'd3;
						if(temp[18:15]>4)
							temp[18:15]=temp[18:15]+2'd3;
						temp[18:1]=temp[17:0];
					end
				repeat(7)//将找的钱的二进制转为bcd
					begin
						if(temp1[10:7]>4)
							temp1[10:7]=temp1[10:7]+2'd3;
						if(temp1[14:11]>4)
							temp1[14:11]=temp1[14:11]+2'd3;
						if(temp1[18:15]>4)
							temp1[18:15]=temp1[18:15]+2'd3;
						temp1[18:1]=temp1[17:0];
					end
				if(flag==0)//显示投的钱
					begin
						num_1=0;
						num_2=temp[10:7];
						num_3=temp[14:11];
						num_4=temp[18:15];
					end
				else if(flag==1)//显示找的钱
					begin
						num_1=0;
						num_2=temp1[10:7];
						num_3=temp1[14:11];
						num_4=temp1[18:15];
					end
				
			end
	end
always@(*)//依次显示4个数字
	begin
		if(po_state==0)
			num_=num_1;
		else if(po_state==1)
			num_=num_2;
		else if(po_state==2)
			num_=num_3;
		else if(po_state==3)
			num_=num_4;			
	end
always@(*)//数码管段选
	begin
		case(num_)
			4'h0:num[6:0]=7'b1000_000;
			4'h1:num[6:0]=7'b1111_001;
			4'h2:num[6:0]=7'b0100_100;
			4'h3:num[6:0]=7'b0110_000;
			4'h4:num[6:0]=7'b0011_001;
			4'h5:num[6:0]=7'b0010_010;
			4'h6:num[6:0]=7'b0000_010;
			4'h7:num[6:0]=7'b1111_000;
			4'h8:num[6:0]=7'b0000_000;
			4'h9:num[6:0]=7'b0010_000;
			default:num[6:0]=7'b1000_000;
		endcase
	end


endmodule

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值