我有以下代码:
entity wave_select is
port( address:in std_logic_vector(6 downto 0);
ws1: in std_logic;
ws0: in std_logic;
wave_out: out std_logic_vector(6 downto 0));
end wave_select;
architecture choose_arch of wave_select is
signal internal_sine:std_logic_vector(6 downto 0);
signal internal_tri:std_logic_vector(6 downto 0);
signal internal_sqr:std_logic_vector(6 downto 0);
begin
U0: entity sine_tbl port map(addr=>address, sine_val=>internal_sine);
U1: entity triangle_tbl port map(addr=>address, tri_val=>internal_tri);
U2: entity square_tbl port map(addr=>address, square_val=>internal_sqr);
process (std_logic_vector'(ws1, ws0))
begin
case ws_combo is
when "01" => wave_out<=internal_sine;
when "10" => wave_out<=internal_tri;
when "11" => wave_out<=internal_sqr;
when others =>wave_out<=(others => '-');
end case;
end process;
end choose_arch;`
每当我尝试编译时,都会出现以下错误:
修正问题
答案 0 :(得分:0)
目前看来,这有很多问题,主要是基本的语法。
虽然看起来很可能意味着将ws0和ws1的组合视为ws_combo
,但你没有做任何事情来告诉合成器,因此它将ws_combo
视为未定义。< / p>
至少据我所知,你不能像过去那样在过程灵敏度列表中组合信号。灵敏度列表用于说明此过程响应的外部信号,而不是其他信号。
您没有wave_out
的定义(除非它也在您的实体声明中)。
您没有internal_sine
,internal_tri
或internal_sqr
的定义。如果不知道wave_out
的类型,很难猜出它们应该是什么类型。
作为对此可能结果的临时想法,我修复了一些语法错误,添加了声明ws0,ws1和wave_out的实体声明,然后将wave_out
设置为适合I类型的值已经给出它(在这种情况下,只是采用二进制输入并产生格雷码输出)。
entity controller1 is
port (
ws1 : in std_logic;
ws0 : in std_logic;
wave_out : out std_logic_vector(1 downto 0)
);
end;
architecture whatever of controller1 is
begin
impl: process(ws0, ws1)
begin
case std_logic_vector'(ws1,ws0) is
when "01" => wave_out<="01";
when "10" => wave_out<="11";
when "11" => wave_out<="10";
when others =>wave_out<=(others => '-');
end case;
end process;
end whatever;
当然,这也需要典型的library
和using
来获取std_logic
和std_logic_vector
的声明,但是添加后,合成器似乎接受了它。当然,其他一些合成器(我用Synplify检查过)可能会发现我错过的一个问题,但我认为这可能至少涵盖了大多数明显的问题。
答案 1 :(得分:0)
您试图通过此行中的std_logic_vector'
尝试实现什么目标?
process (std_logic_vector'(ws1, ws0))
如果您只是为了更传统的
而改变它process (ws1, ws0)
我想它会有所帮助。
但我认为ws_combo
是一个像
ws_combo = ws1&ws0;
所以
process (ws_combo)
会更好。