因为没有存放在BCD1中num_bin我?这会纠正语法吗?
功能描述
操作必须如下:
代码:
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;
答案 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循环。您的算法可能有其他多个问题,但这是您需要处理的第一个问题。