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
FPGA 动态数码管 二进制转8421BCD码
最新推荐文章于 2023-11-28 13:58:01 发布