⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bcd_to_binary.v

📁 binary_to_bcd is used for translating from binare to bcd.
💻 V
字号:
//---------------------------------------------------------------------------// BCD to binary converter, serial implementation, 1 clock per input bit.////// Description: See description below (which suffices for IP core//                                     specification document.)//// Copyright (C) 2002 John Clayton and OPENCORES.ORG (this Verilog version)//// This source file may be used and distributed without restriction provided// that this copyright statement is not removed from the file and that any// derivative work contains the original copyright notice and the associated// disclaimer.//// This source file is free software; you can redistribute it and/or modify// it under the terms of the GNU Lesser General Public License as published// by the Free Software Foundation;  either version 2.1 of the License, or// (at your option) any later version.//// This source is distributed in the hope that it will be useful, but WITHOUT// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public// License for more details.//// You should have received a copy of the GNU Lesser General Public License// along with this source.// If not, download it from http://www.opencores.org/lgpl.shtml////-----------------------------------------------------------------------------//// Author: John Clayton// Date  : Nov. 24, 2003// Update: Nov. 24, 2003  Copied this file from "binary_to_bcd.v" and//                        modified it.// Update: Nov. 25, 2003  Tested this module.  It works!// Update: Nov. 25, 2003  Changed bit_counter and related logic so that long//                        start pulses produce correct results at the end of//                        the pulse.////-----------------------------------------------------------------------------// Description://// This module takes a BCD input, and converts it into binary output, with each// binary coded decimal input digit (of course) occupying 4-bits.// The user can specify the number of input digits separately from the number// of output bits.  Be sure that you have specified enough output bits to// represent the largest input number you expect to convert, or else the// most significant portion of the BCD input will never be processed.// This module processes the BCD digits starting with the least significant// and working its way through to the more significant digits, until the binary// output register is "fully stuffed" with output bits.// This means that a particular BCD input digit might only be processed half// way!// Also, there is no checking for invalid BCD digit contents...  Behavior is// undefined for "BCD" input values outside the range [0..9], although it would// be very easy to add error checking with an error indicator output bit.////-----------------------------------------------------------------------------module bcd_to_binary (  clk_i,  ce_i,  rst_i,  start_i,  dat_bcd_i,  dat_binary_o,  done_o  );parameter BCD_DIGITS_IN_PP   = 5;  // # of digits of BCD inputparameter BITS_OUT_PP        = 16; // # of bits of binary outputparameter BIT_COUNT_WIDTH_PP = 4;  // Width of bit counter// I/O declarationsinput  clk_i;                      // clock signalinput  ce_i;                       // clock enable inputinput  rst_i;                      // synchronous resetinput  start_i;                    // initiates a conversioninput  [4*BCD_DIGITS_IN_PP-1:0] dat_bcd_i;  // input busoutput [BITS_OUT_PP-1:0] dat_binary_o;      // output busoutput done_o;                     // indicates conversion is donereg [BITS_OUT_PP-1:0] dat_binary_o;// Internal signal declarationsreg  [BITS_OUT_PP-1:0] bin_reg;reg  [4*BCD_DIGITS_IN_PP-1:0] bcd_reg;wire [BITS_OUT_PP-1:0] bin_next;reg  [4*BCD_DIGITS_IN_PP-1:0] bcd_next;reg  busy_bit;reg  [BIT_COUNT_WIDTH_PP-1:0] bit_count;wire bit_count_done;//--------------------------------------------------------------------------// Functions & Tasks//--------------------------------------------------------------------------function [4*BCD_DIGITS_IN_PP-1:0] bcd_asr;  input [4*BCD_DIGITS_IN_PP-1:0] din;  integer k;  reg cin;  reg [3:0] digit;  reg [3:0] digit_more;  begin    cin = 1'b0;    for (k=BCD_DIGITS_IN_PP-1; k>=0; k=k-1) // From MS digit to LS digit    begin      digit[3] = 1'b0;      digit[2] = din[4*k+3];      digit[1] = din[4*k+2];      digit[0] = din[4*k+1];      digit_more = digit + 5;      if (cin)      begin        bcd_asr[4*k+3] = digit_more[3];        bcd_asr[4*k+2] = digit_more[2];        bcd_asr[4*k+1] = digit_more[1];        bcd_asr[4*k+0] = digit_more[0];      end      else      begin        bcd_asr[4*k+3] = digit[3];        bcd_asr[4*k+2] = digit[2];        bcd_asr[4*k+1] = digit[1];        bcd_asr[4*k+0] = digit[0];      end      cin = din[4*k+0];    end  // end of for loop  endendfunction//--------------------------------------------------------------------------// Module code//--------------------------------------------------------------------------// Perform proper shifting, binary ASL and BCD ASLassign bin_next = {bcd_reg[0],bin_reg[BITS_OUT_PP-1:1]};always @(bcd_reg)begin  bcd_next <= bcd_asr(bcd_reg);//  bcd_next <= bcd_reg >> 1;  Just for testing...end// Busy bit, input and output registersalways @(posedge clk_i)begin  if (rst_i)  begin    busy_bit <= 0;  // Synchronous reset    dat_binary_o <= 0;  end  else if (start_i && ~busy_bit)  begin    busy_bit <= 1;    bcd_reg <= dat_bcd_i;    bin_reg <= 0;  end  else if (busy_bit && ce_i && bit_count_done && ~start_i)  begin    busy_bit <= 0;    dat_binary_o <= bin_next;  end  else if (busy_bit && ce_i & ~bit_count_done)  begin    bin_reg <= bin_next;    bcd_reg <= bcd_next;  endendassign done_o = ~busy_bit;// Bit counteralways @(posedge clk_i)begin  if (~busy_bit) bit_count <= 0;  else if (ce_i && ~bit_count_done) bit_count <= bit_count + 1;endassign bit_count_done = (bit_count == (BITS_OUT_PP-1));endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -