大家。我试图在VHDL中制作一个4位乘法器。它将在Spartan 3E主板上使用内置2x16 LCD和3x4键盘通过C922 IC实现。
使用它是这样的:用户通过键盘输入一个数字,按下确认按钮,输入第二个数字,再次按下确认按钮,产品显示在液晶显示屏上。
到目前为止,键盘+ c922和LCD的代码都可以。乘数的代码几乎没问题。问题是确认按钮仅在按下另一个号码(最终未使用)时才有效。
这是我的代码。以下是Xilinx仿真的截图
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity multi_4bit is
Port ( CLK : in STD_LOGIC;
RESET : in STD_LOGIC;
Input : in STD_LOGIC_VECTOR (3 downto 0);
DAVBL : in STD_LOGIC;
Confirm : in STD_LOGIC;
Output : out STD_LOGIC_VECTOR (7 downto 0));
end multi_4bit;
architecture Behavioral of multi_4bit is
type state is (R,S0,S1,S2,S3,S4);
signal pstate, nstate: state;
signal A_sig, B_sig: STD_LOGIC_VECTOR(3 downto 0);
begin
state_transition: process(CLK,RESET)
begin
if RESET = '1' then
pstate <= R;
elsif rising_edge(CLK) then
pstate <= nstate;
end if;
end process;
nstate_output: process(pstate,DAVBL,Input)
variable temp_var: STD_LOGIC_VECTOR(3 downto 0);
variable tempMult_var,tempProd_var: STD_LOGIC_VECTOR(7 downto 0);
begin
case pstate is
when R =>
nstate <= S0;
tempMult_var := (others => '0');
tempProd_var := (others => '0');
A_sig <= (others => '0');
B_sig <= (others => '0');
Output <= (others => '0');
when S0 =>
nstate <= S0;
if (DAVBL = '1') then
A_sig <= Input;
nstate <= S1;
end if;
when S1 =>
nstate <= S1;
if (Confirm = '1') then
nstate <= S2;
end if;
when S2 =>
nstate <= S2;
if (DAVBL = '1') then
B_sig <= Input;
nstate <= S3;
end if;
when S3 =>
nstate <= S3;
if (Confirm = '1') then
nstate <= S4;
end if;
when S4 =>
nstate <= S0;
for x in 0 to 3 loop
temp_var := (A_sig AND (B_sig(x)&B_sig(x)&B_sig(x)&B_sig(x) ) );
tempMult_var := "0000" & temp_var;
if (x=0) then tempMult_var := tempMult_var;
elsif (x=1) then tempMult_var := tempMult_var(6 downto 0)&"0";
elsif (x=2) then tempMult_var := tempMult_var(5 downto 0)&"00";
elsif (x=3) then tempMult_var := tempMult_var(4 downto 0)&"000";
end if;
tempProd_var := tempProd_var + tempMult_var;
end loop;
Output <= tempProd_var;
tempProd_var := (others => '0');
end case;
end process;
end Behavioral;
我一直在查看我的代码一小时,但仍然看不出有什么问题。 提前感谢任何可以提供帮助的人。
答案 0 :(得分:0)
正如fru1tbat,Brian和David所提到的,你的状态机的组合部分中的敏感列表有问题。具体来说,您缺少Confirm
输入。由于Confirm
输入不在灵敏度列表中,因此状态机在确认更改状态时不会“唤醒”以评估新输出/状态转换。您需要等待另一个条件(按下不同的按钮)才能正确评估并更新输出。
有多种方法可以解决这个问题。
process(all)
自动列出灵敏度列表中的所有必要输入(您的编译器支持可能会有所不同)。