Convertidor二进制转换为BCD

时间:2015-03-11 10:56:16

标签: vhdl

因为没有存放在BCD1中num_bin我?这会纠正语法吗?

功能描述

操作必须如下:

  1. 激活复位将复位所有内部寄存器,并等待启动电路 转换。它也将结束'0'。
  2. 当你开始='1'转换开始。第一步是将值存储在那里 在内部寄存器的num_bin中。
  3. 稍后将在第二条记录上滚动该寄存器的位 包含BCD格式的数字(在我们的例子中,因为我们有四位数注册它是16位)。该操作与时钟的上升沿同步。
  4. 代码:

    entity bin2bcd is
      Port ( clk : in  STD_LOGIC;
             reset : in  STD_LOGIC;
             inicio : in  STD_LOGIC;
             num_bin : in  STD_LOGIC_VECTOR (12 downto 0);
             und : out  STD_LOGIC_VECTOR (3 downto 0);
             dec : out  STD_LOGIC_VECTOR (3 downto 0);
             cen : out  STD_LOGIC_VECTOR (3 downto 0);
             mil : out  STD_LOGIC_VECTOR (3 downto 0);
             fin : out  STD_LOGIC);
    end bin2bcd;
    
    architecture Behavioral of bin2bcd is
      signal bcd1: std_logic_vector (12 downto 0);  
      signal bcd2: std_logic_vector (15 downto 0);
    
    begin
    
      P1: process(reset,clk)   
      begin
    
        if reset = '1' then
          --fin <= '0';
          bcd1 <= (others => '0');   -- registres to 0
          bcd2 <= (others => '0');   -- registres to 0
    
        elsif rising_edge(clk) then
    
    
          if inicio = '1' then  
            bcd1 <= num_bin; 
    
    
            if bcd2(3 downto 0) > "0100" then    -- if >4
              bcd2(3 downto 0) <= bcd2(3 downto 0) or "0011";
            end if;
    
            if bcd2(7 downto 4) > "0100" then -- if >4
              bcd2(7 downto 4) <= bcd2(7 downto 4) or "0011";
            end if;
    
            if bcd2(11 downto 8) > "100" then   -- if >4
              bcd2(11 downto 8) <= bcd2(11 downto 8) or "0011";
            end if;
    
            if bcd2(15 downto 12) > "0100" then      -- if >4
              bcd2(15 downto 12) <= bcd2(15 downto 12) or "0011";
            end if;
    
            for i in 0 to 12 loop
              bcd2 <= bcd2(14 downto 0) & num_bin(12);
              bcd1 <= bcd1(11 downto 0) & '0';
    
              --fin <= '1';
            end loop;
    
            und <= bcd2 (3 downto 0);   -- unidades
            dec <= bcd2 (7 downto 4);   -- decenas
            cen <= bcd2 (11 downto 8);  -- centenas
            mil <= bcd2 (15 downto 12); -- millares
    
    
          end if;
        end if;
      end process P1;
    end Behavioral;
    

2 个答案:

答案 0 :(得分:0)

我遇到的问题是当你假装test_bench时我的num_bin值没有存储在bcd1中,也让我很好的转换并将其保存在bcd2中

答案 1 :(得分:0)

问题在于您的for循环,以及您在此过程中早期分配bcd1这一事实。您似乎打算创建一个移位寄存器,但这不是您编写的代码实际上所做的。

在VHDL中,进程中分配的信号不会立即更改值 - 在具有wait语句的进程中,在进程结束时(或任何wait)调度分配,尽管这些是非-synthesizable)。

因此,如果您的进程在同一进程中“执行”对同一信号的多个赋值,则稍后的赋值将覆盖先前的赋值,并且只有最后一个赋值才会实际生效。所以,既然你有:

bcd1 <= num_bin;

...

for i in 0 to 12 loop
  bcd2 <= bcd2(14 downto 0) & num_bin(12);
  bcd1 <= bcd1(11 downto 0) & '0';
end loop;

初始赋值将被for循环中的赋值覆盖,因此您永远不会向bcd1加载任何值。

您还有第二个问题,即您的for循环不会按预期移位寄存器。时钟进程中的for循环将为进程的每次执行展开,因此:

for i in 0 to 12 loop
  bcd1 <= bcd1(11 downto 0) & '0';
end loop;

相当于:

bcd1 <= bcd1(11 downto 0) & '0';
bcd1 <= bcd1(11 downto 0) & '0';
bcd1 <= bcd1(11 downto 0) & '0';
bcd1 <= bcd1(11 downto 0) & '0';
bcd1 <= bcd1(11 downto 0) & '0';
bcd1 <= bcd1(11 downto 0) & '0';
bcd1 <= bcd1(11 downto 0) & '0';
bcd1 <= bcd1(11 downto 0) & '0';
bcd1 <= bcd1(11 downto 0) & '0';
bcd1 <= bcd1(11 downto 0) & '0';
bcd1 <= bcd1(11 downto 0) & '0';
bcd1 <= bcd1(11 downto 0) & '0';
bcd1 <= bcd1(11 downto 0) & '0';

但是,正如我之前所说,由于只有最后一个分配是影响信号的分配,所以你只需要移动一次。

你可能打算这样做:

      if inicio = '1' then  
        bcd1 <= num_bin; 
      else
        -- rest of your code goes here

需要else,以便后面的逻辑不会覆盖bcd1的初始加载。您还需要修复for循环。您的算法可能有其他多个问题,但这是您需要处理的第一个问题。