qq_43622005 2020-04-18 23:00 采纳率: 0%
浏览 531

Warning: There is an 'U'|'X'|'W'|'Z'|'-' in an arithmetic operand, the result will be 'X'(es).

MODELSIM SE 仿真实现不了

错误代码为Warning: There is an 'U'|'X'|'W'|'Z'|'-' in an arithmetic operand, the result will be 'X'(es).

激励和初始值都已经赋予

代码如下

LIBRARY ieee;

USE ieee.std_logic_1164.all;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ADDER16B_vhd_tst IS
END ADDER16B_vhd_tst;
ARCHITECTURE ADDER16B_arch OF ADDER16B_vhd_tst IS
-- constants

-- signals

COMPONENT ADDER16B
PORT (
A : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
B : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
CIN : IN STD_LOGIC;
COUT : OUT STD_LOGIC;
DOUT : OUT STD_LOGIC_VECTOR(15 DOWNTO 0)
);
END COMPONENT;
SIGNAL A1:STD_LOGIC_VECTOR(15 DOWNTO 0):="1111000011110000";
SIGNAL B1:STD_LOGIC_VECTOR(15 DOWNTO 0):="1111000011110000";
SIGNAL CIN1:STD_LOGIC:= '0';
SIGNAL COUT1:STD_LOGIC:='1';
SIGNAL DOUT1:STD_LOGIC_VECTOR(15 DOWNTO 0):="1111000011110000";
CONSTANT CLK_P : TIME:=200 NS;
BEGIN
i1 : ADDER16B
PORT MAP (
-- list connections between master ports and signals
A => A1,
B => B1,
CIN => CIN1,
COUT => COUT1,
DOUT => DOUT1
);
PROCESS

-- variable declarations

BEGIN
CIN1<='0'; WAIT FOR CLK_P;
CIN1<='1'; WAIT FOR CLK_P;

-- code that executes only once

END PROCESS ;
A1<="1111000011110000","0000111100001111"AFTER 1000 NS,"1111000000001111"AFTER 2000 NS,"1111000011110000"AFTER 3000 NS;
B1<="1111000011110000","0000111100001111"AFTER 1000 NS,"1111000000001111"AFTER 2000 NS,"1111000011110000"AFTER 3000 NS;

END ADDER16B_arch;

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-25 14:21
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在你的代码中,你尝试将一个16位的加法器设计成VHDL文件,并且尝试使用不同的信号名和连接。但是,在运行时遇到了警告信息 "There is an 'U'|'X'|'W'|'Z'|'-' in an arithmetic operand, the result will be 'X'(s)." 这个警告表明在进行算术运算的时候发现了不合法的字符。

    这种类型的警告通常是由于你在写代码的过程中不小心遗漏了某个字符或符号造成的。例如,在你试图计算两个十六进制数相加的时候,"X"可能是一个非法的十进制数字(因为十进制没有这样的数字)。

    为了解决这个问题,你需要确保所有的数字都以正确的形式存在,即都是十进制整数或者十六进制数。你可以通过检查输入的字符串是否符合预期的格式来实现这一点。以下是一些建议:

    1. 检查A、B和CIN信号中的每个字符是否是有效的十进制数或十六进制数。
    2. 在执行任何算术操作之前,确保所有输入信号中的字符都是有效的。
    3. 如果发现输入无效,请提供适当的验证机制来处理这种情况。

    下面是一个示例,展示了如何检查输入的有效性并处理无效的情况:

    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    
    entity adder16b_vhdl_tst is
    end entity;
    
    architecture adder16b_arch of adder16b_vhdl_tst is
    signal a1: std_logic_vector(15 downto 0) := "1111000011110000";
    signal b1: std_logic_vector(15 downto 0) := "1111000011110000";
    signal cin1: std_logic := '0';
    signal cout1: std_logic := '1';
    signal dout1: std_logic_vector(15 downto 0) := "1111000011110000";
    
    constant clk_p: time := 200 ns;
    
    begin
    
    adder16b_port_map(a1, b1, cin1, cout1, dout1);
    
    process
    begin
       cin1 <= '0'; wait for clk_p; 
       cin1 <= '1'; wait for clk_p; 
    end process;
    
    a1 <= "1111000011110000", "0000111100001111"; AFTER 1000 ns, "1111000000001111"; AFTER 2000 ns, "1111000011110000"; AFTER 3000 ns;
    
    b1 <= "1111000011110000", "0000111100001111"; AFTER 1000 ns, "1111000000001111"; AFTER 2000 ns, "1111000011110000"; AFTER 3000 ns;
    
    end adder16b_arch;
    

    在这个例子中,我们首先创建了一个实体adder16b_vhdl_tst,然后定义了一个加法器模型adder16b. 我们还定义了一个变量clk_p,它表示系统的工作频率。

    在主流程中,我们定义了四个输入信号a1, b1, cin1cout1,它们分别对应于模拟器的输出端口A, B, CINCOUT。此外,我们还有一个变量dout1,它用于存储最终的结果。

    接下来,我们在主流程中添加了一个过程,这个过程会持续等待一段时间,直到cin1变为'1'。在这个过程中,我们将cin1设置为'1',然后开始计时。当cin1再次变为'0'时,我们就停止计时。

    最后,我们定义了一个加法器模型adder16b,并在它的输入端口处设置了相应的信号。

    这个例子展示了如何检查输入的有效性和如何处理无效的情况。如果你能提供更多的详细信息,我可能会有更具体的建议。

    评论

报告相同问题?