微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > verilog如何实现十进制数按个位十位拆开?

verilog如何实现十进制数按个位十位拆开?

时间:10-02 整理:3721RD 点击:
verilog有没有什么方法把一个十进制数按个位十位拆开,不用除法和取余?求大神讲解

二进制码转BCD码,可以看看下面这段代码://==================================================================================================
//  Filename      : bin2bcd.v
//  Created On    : 2017-01-02 20:54:28
//  Last Modified : 2017-01-03 14:28:27
//  Revision      :
//  Author        :
//  Email         : zeng4long@qq.com
//
//  Description   :
//
//
//==================================================================================================
`timescale 1ns / 1ps
module bin2bcd (
        input clk,
        input rst_n,
        input [23:0] bin,
        output reg [3:0] bcdU,
        output reg [3:0] bcdT,
        output reg [3:0] bcdH,
        output reg [3:0] bcdTh,
        output reg [3:0] bcdTth,
        output reg [3:0] bcdHth,
        output reg [3:0] bcdMill,
        output reg [3:0] bcdTmill
        );
reg [2:0] state;
reg [4:0] cnt;
reg [23:0] binTemp;
reg [31:0] bcdTemp;
parameter s0 = 3'd0;
parameter s1 = 3'd1;
parameter s2 = 3'd2;
parameter s3 = 3'd3;
always        @ (posedge        clk ) begin
        if (!rst_n) begin
                cnt 4'd4) ? bcdTemp[3:0]   + 4'd3 : bcdTemp[3:0]  ;
                                bcdTemp[7:4]    4'd4) ? bcdTemp[7:4]   + 4'd3 : bcdTemp[7:4]  ;
                                bcdTemp[11:8]   4'd4) ? bcdTemp[11:8]  + 4'd3 : bcdTemp[11:8] ;
                                bcdTemp[15:12] 4'd4) ? bcdTemp[15:12] + 4'd3 : bcdTemp[15:12];
                                bcdTemp[19:16] 4'd4) ? bcdTemp[19:16] + 4'd3 : bcdTemp[19:16];
                                bcdTemp[23:20] 4'd4) ? bcdTemp[23:20] + 4'd3 : bcdTemp[23:20];
                                bcdTemp[27:24] 4'd4) ? bcdTemp[27:24] + 4'd3 : bcdTemp[27:24];
                                bcdTemp[31:28] 4'd4) ? bcdTemp[31:28] + 4'd3 : bcdTemp[31:28];
                                state <= s1;
                        end
                        s3: begin
                                state <= s0;
                        end
                        default: begin
                                state <= s0;
                        end
                endcase        
        end
end
always        @ (posedge        clk) begin
        if (!rst_n) begin
                bcdU <= 4'd0;
                bcdT <= 4'd0;
                bcdH <= 4'd0;
                bcdTh <= 4'd0;
                bcdTth <= 4'd0;
                bcdHth <= 4'd0;
                bcdMill <= 4'd0;
                bcdTmill <= 4'd0;
        end
        else if((cnt == 5'd24) && (state == s2)) begin
                bcdU <= bcdTemp[3:0];
                bcdT <= bcdTemp[7:4];
                bcdH <= bcdTemp[11:8];
                bcdTh <= bcdTemp[15:12];
                bcdTth <= bcdTemp[19:16];
                bcdHth <= bcdTemp[23:20];
                bcdMill <= bcdTemp[27:24];
                bcdTmill <= bcdTemp[31:28];               
        end
end
endmodule       

verilog不能取余取模吗

二进制转bcd,记得有个算法叫左移加三法,你可以搜一下

取除、取余比较耗FPGA资源,而且编译器有时候会综合不出来

查表吧,如果两位数的话也就10种情况,占不了多少资源

左移加三  循环

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top