////////////////////////////////////////////////////////////////////////////////// // // Wirtualny komponent konwertera kodu BCD -> BIN // // (C) 2009 Zbigniew Hajduk // http://zh.kia.prz.edu.pl // // ////////////////////////////////////////////////////////////////////////////////// module bcd2bin #(parameter NO_BITS_OUT=16, NO_BCD_DIGITS=4, BIT_CNT_WIDTH=4) (input clk,start, output done, output reg [NO_BITS_OUT-1:0] data_out, input [4*NO_BCD_DIGITS-1:0] data_bcd_in); reg [4*NO_BCD_DIGITS-1:0] temp_bcd; reg [BIT_CNT_WIDTH-1:0] bit_cnt; (* INIT ="0" *) reg busy; function [4*NO_BCD_DIGITS-1:0] BCD_SH (input [4*NO_BCD_DIGITS-1:0] din); integer i; reg SIN; reg [3:0] digit,digit2; begin SIN=1'b0; for (i=NO_BCD_DIGITS-1;i>=0;i=i-1) begin digit2={1'b0,din[(4*i+3)-:3]}; digit=digit2+4'd5; BCD_SH[(4*i+3)-:4]=SIN?digit:digit2; SIN=din[4*i]; end end endfunction always @(posedge clk) begin if(start&~busy) begin busy<=1'b1; bit_cnt<=NO_BITS_OUT-1; data_out<=0; temp_bcd<=data_bcd_in; end if(busy) begin temp_bcd<=BCD_SH(temp_bcd); data_out<={temp_bcd[0],data_out[NO_BITS_OUT-1:1]}; if(bit_cnt!=0) bit_cnt<=bit_cnt-1; else busy<=1'b0; end end assign done=~busy; endmodule