这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » FPGA实现二进制转BCD码

共2条 1/1 1 跳转至

FPGA实现二进制转BCD码

工程师
2019-07-20 09:16:42     打赏



Verilog代码:
  1. module Binary_to_BCD

  2.   #(parameter INPUT_WIDTH,

  3.     parameter DECIMAL_DIGITS)

  4.   (

  5.    input                         i_Clock,

  6.    input [INPUT_WIDTH-1:0]       i_Binary,

  7.    input                         i_Start,

  8.    //

  9.    output [DECIMAL_DIGITS*4-1:0] o_BCD,

  10.    output                        o_DV

  11.    );

  12.    

  13.   parameter s_IDLE              = 3'b000;

  14.   parameter s_SHIFT             = 3'b001;

  15.   parameter s_CHECK_SHIFT_INDEX = 3'b010;

  16.   parameter s_ADD               = 3'b011;

  17.   parameter s_CHECK_DIGIT_INDEX = 3'b100;

  18.   parameter s_BCD_DONE          = 3'b101;

  19.    

  20.   reg [2:0] r_SM_Main = s_IDLE;

  21.    

  22.   // The vector that contains the output BCD

  23.   reg [DECIMAL_DIGITS*4-1:0] r_BCD = 0;

  24.    

  25.   // The vector that contains the input binary value being shifted.

  26.   reg [INPUT_WIDTH-1:0]      r_Binary = 0;

  27.       

  28.   // Keeps track of which Decimal Digit we are indexing

  29.   reg [DECIMAL_DIGITS-1:0]   r_Digit_Index = 0;

  30.    

  31.   // Keeps track of which loop iteration we are on.

  32.   // Number of loops peRFormed = INPUT_WIDTH

  33.   reg [7:0]                  r_Loop_Count = 0;


  34.   wire [3:0]                 w_BCD_Digit;

  35.   reg                        r_DV = 1'b0;                       

  36.    

  37.   always @(posedge i_Clock)

  38.     begin


  39.       case (r_SM_Main)

  40.   

  41.         // Stay in this state until i_Start comes along

  42.         s_IDLE :

  43.           begin

  44.             r_DV <= 1'b0;

  45.             

  46.             if (i_Start == 1'b1)

  47.               begin

  48.                 r_Binary  <= i_Binary;

  49.                 r_SM_Main <= s_SHIFT;

  50.                 r_BCD     <= 0;

  51.               end

  52.             else

  53.               r_SM_Main <= s_IDLE;

  54.           end

  55.                  

  56.   

  57.         // Always shift the BCD Vector until we have shifted all bits through

  58.         // Shift the most significant bit of r_Binary into r_BCD lowest bit.

  59.         s_SHIFT :

  60.           begin

  61.             r_BCD     <= r_BCD << 1;

  62.             r_BCD[0]  <= r_Binary[INPUT_WIDTH-1];

  63.             r_Binary  <= r_Binary << 1;

  64.             r_SM_Main <= s_CHECK_SHIFT_INDEX;

  65.           end         

  66.          

  67.   

  68.         // Check if we are done with shifting in r_Binary vector

  69.         s_CHECK_SHIFT_INDEX :

  70.           begin

  71.             if (r_Loop_Count == INPUT_WIDTH-1)

  72.               begin

  73.                 r_Loop_Count <= 0;

  74.                 r_SM_Main    <= s_BCD_DONE;

  75.               end

  76.             else

  77.               begin

  78.                 r_Loop_Count <= r_Loop_Count + 1;

  79.                 r_SM_Main    <= s_ADD;

  80.               end

  81.           end

  82.                  

  83.   

  84.         // Break down each BCD Digit individually.  Check them one-by-one to

  85.         // see if they are greater than 4.  If they are, increment by 3.

  86.         // Put the result back into r_BCD Vector.  

  87.         s_ADD :

  88.           begin

  89.             if (w_BCD_Digit > 4)

  90.               begin                                    

  91.                 r_BCD[(r_Digit_Index*4)+:4] <= w_BCD_Digit + 3;  

  92.               end

  93.             

  94.             r_SM_Main <= s_CHECK_DIGIT_INDEX;

  95.           end      

  96.          

  97.          

  98.         // Check if we are done incrementing all of the BCD Digits

  99.         s_CHECK_DIGIT_INDEX :

  100.           begin

  101.             if (r_Digit_Index == DECIMAL_DIGITS-1)

  102.               begin

  103.                 r_Digit_Index <= 0;

  104.                 r_SM_Main     <= s_SHIFT;

  105.               end

  106.             else

  107.               begin

  108.                 r_Digit_Index <= r_Digit_Index + 1;

  109.                 r_SM_Main     <= s_ADD;

  110.               end

  111.           end

  112.          

  113.   

  114.   

  115.         s_BCD_DONE :

  116.           begin

  117.             r_DV      <= 1'b1;

  118.             r_SM_Main <= s_IDLE;

  119.           end

  120.          

  121.          

  122.         default :

  123.           r_SM_Main <= s_IDLE;

  124.             

  125.       endcase

  126.     end // always @ (posedge i_Clock)  


  127.    

  128.   assign w_BCD_Digit = r_BCD[r_Digit_Index*4 +: 4];

  129.       

  130.   assign o_BCD = r_BCD;

  131.   assign o_DV  = r_DV;

  132.       

  133. endmodule // Binary_to_BCD

复制代码VHDL代码:
  1. library ieee;

  2. use ieee.std_logic_1164.all;

  3. use ieee.numeric_std.all;


  4. entity Binary_to_BCD is

  5.   generic (

  6.     g_INPUT_WIDTH    : in positive;

  7.     g_DECIMAL_DIGITS : in positive

  8.     );

  9.   port (

  10.     i_Clock  : in std_logic;

  11.     i_Start  : in std_logic;

  12.     i_Binary : in std_logic_vector(g_INPUT_WIDTH-1 downto 0);

  13.      

  14.     o_BCD : out std_logic_vector(g_DECIMAL_DIGITS*4-1 downto 0);

  15.     o_DV  : out std_logic

  16.     );

  17. end entity Binary_to_BCD;


  18. architecture rtl of Binary_to_BCD is


  19.   type t_BCD_State is (s_IDLE, s_SHIFT, s_CHECK_SHIFT_INDEX, s_ADD,

  20.                        s_CHECK_DIGIT_INDEX, s_BCD_DONE);

  21.   signal r_SM_Main : t_BCD_State := s_IDLE;


  22.   -- The vector that contains the output BCD

  23.   signal r_BCD : std_logic_vector(g_DECIMAL_DIGITS*4-1 downto 0) := (others => '0');


  24.   -- The vector that contains the input binary value being shifted.

  25.   signal r_Binary : std_logic_vector(g_INPUT_WIDTH-1 downto 0) := (others => '0');

  26.    

  27.   -- Keeps track of which Decimal Digit we are indexing

  28.   signal r_Digit_Index : natural range 0 to g_DECIMAL_DIGITS-1 := 0;


  29.   -- Keeps track of which loop iteration we are on.

  30.   -- Number of loops performed = g_INPUT_WIDTH

  31.   signal r_Loop_Count : natural range 0 to g_INPUT_WIDTH-1  := 0;

  32.    

  33. begin


  34.   Double_Dabble : process (i_Clock)

  35.     variable v_Upper     : natural;

  36.     variable v_Lower     : natural;

  37.     variable v_BCD_Digit : unsigned(3 downto 0);

  38.   begin

  39.     if rising_edge(i_Clock) then


  40.       case r_SM_Main is


  41.         -- Stay in this state until i_Start comes along

  42.         when s_IDLE =>

  43.           if i_Start = '1' then

  44.             r_BCD     <= (others => '0');

  45.             r_Binary  <= i_Binary;

  46.             r_SM_Main <= s_SHIFT;

  47.           else

  48.             r_SM_Main <= s_IDLE;

  49.           end if;



  50.         -- Always shift the BCD Vector until we have shifted all bits through

  51.         -- Shift the most significant bit of r_Binary into r_BCD lowest bit.

  52.         when s_SHIFT =>

  53.           r_BCD     <= r_BCD(r_BCD'left-1 downto 0) & r_Binary(r_Binary'left);

  54.           r_Binary  <= r_Binary(r_Binary'left-1 downto 0) & '0';

  55.           r_SM_Main <= s_CHECK_SHIFT_INDEX;



  56.         -- Check if we are done with shifting in r_Binary vector

  57.         when s_CHECK_SHIFT_INDEX =>

  58.           if r_Loop_Count = g_INPUT_WIDTH-1 then

  59.             r_Loop_Count <= 0;

  60.             r_SM_Main    <= s_BCD_DONE;

  61.           else

  62.             r_Loop_Count <= r_Loop_Count + 1;

  63.             r_SM_Main    <= s_ADD;

  64.           end if;




高工
2019-07-23 16:18:48     打赏
2楼

很实用 不错


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]