1.简介
二进制编码的十进制数,简称BCD码(Binarycoded Decimal). 这种方法是用4位二进制码的组合代表十进制数的0,1,2,3,4,5,6 ,7,8,9 十个数符。最常用的BCD码称为8421BCD码,8.4.2.1 分别是4位二进数的位取值。
2.移位加三法
移位加三法实现过程:从二进制的高位开始向BCD寄存器中移入二进制数据,依次经过BCD寄存器的个、十、百等位,直到所有的二进制数移入到BCD寄存器中。每次移位,判断个、十、百等是否大于4,若大于则对应位加3,否则不变。例如:(11110011)转BCD,对应十进制为243,故BCD表示为(0010_0100_0011)。移位过程如下:
需要注意的是最后一次移位不需要在判断是否加三。
Verilog实现
module binary2bcd (
input clk,
input rst_n,
input ready,
input [15:0]data,
output reg done,
output reg [23:0]bcd
);
parameter DATAWIDTH = 8;
parameter IDLE = 4'b0001;
parameter SHIFT = 4'b0010;
parameter ADD = 4'b0100;
parameter DONE = 4'b1000;
reg [27:0]bcd_tmp; //临时移位寄存器
reg [3:0]cnt; //移位计数器
reg [3:0]state, nstate;
always @(posedge clk or negedge rst_n)begin
if(!rst_n)
state <= IDLE;
else
state <= nstate;
end
always @(*)begin
case(state)
IDLE: nstate = (ready) ? SHIFT : IDLE;
SHIFT: nstate = (cnt == DATAWIDTH - 1) ? DONE : ADD; //由于非阻塞赋值延迟一个周期,故需要减1
ADD: nstate = SHIFT;
DONE: nstate = IDLE;
default:nstate = IDLE;
endcase
end
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt <= 'b0;
done <= 'b0;
bcd_tmp <= 'b0;
end
else case(state)
IDLE: begin
cnt <= 'b0;
done <= 0;
bcd_tmp <= {'b0,data};
end
SHIFT: begin
bcd_tmp <= bcd_tmp << 1;
cnt <= cnt + 1;
end
ADD: begin
bcd_tmp[11:8] <= (bcd_tmp[11:8] > 4) ? (bcd_tmp[11:8] + 4'b0011) : bcd_tmp[11:8];
bcd_tmp[15:12] <= (bcd_tmp[15:12] > 4) ? (bcd_tmp[15:12] + 4'b0011) : bcd_tmp[15:12];
bcd_tmp[19:16] <= (bcd_tmp[19:16] > 4) ? (bcd_tmp[19:16] + 4'b0011) : bcd_tmp[19:16];
bcd_tmp[23:20] <= (bcd_tmp[23:20] > 4) ? (bcd_tmp[23:20] + 4'b0011) : bcd_tmp[23:20];
bcd_tmp[27:24] <= (bcd_tmp[27:24] > 4) ? (bcd_tmp[27:24] + 4'b0011) : bcd_tmp[27:24];
end
DONE: begin
done <= 1;
bcd <= {4'b0000,bcd_tmp[27:8]};
end
default:;
endcase
end
endmodule
参考博客:https://blog.csdn.net/Reborn_Lee/article/details/106949149?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170368210016800192283413%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=170368210016800192283413&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-1-106949149-null-null.nonecase&utm_term=bcd&spm=1018.2226.3001.4450