VHDL FSM控制FIR滤波器编译报错求助:两处语法错误排查
排查你的VHDL FSM语法错误
咱们直接定位你代码里的两处语法问题:
1. 进程(Process)中缺少闭合的end if
你的时钟复位进程里,最外层的if rst='1' then ... else ...结构没有用end if闭合。在rising_edge(clk)对应的end if之后,必须再加一个end if来结束最开始的复位判断逻辑。这就是第83行process附近报错的核心原因——编译器无法正确识别进程的结束边界。
2. 组件实例化时的名称不匹配
你提前定义的组件是filter_rom,但实例化时却写了filter_memory,编译器找不到对应的组件定义,自然会在generic附近抛出错误。另外我顺手把port map改成了显式信号对应写法,这样代码可读性更强,也不容易出现信号错位的问题。
修正后的完整代码
library IEEE; use IEEE.STD_LOGIC_1164.ALL; USE ieee.numeric_std.ALL; entity fsm is generic (n: integer:=4); port( clk: in STD_LOGIC; rst: in STD_LOGIC; a: out STD_LOGIC_VECTOR(2*n-1 downto 0) ); end fsm; architecture fsm_struct of fsm is type state_type is (state0, state1, state2); signal state: state_type; signal rstff, rom_enable, ram_read_enable, ram_write_enable: STD_LOGIC; component filter_rom is generic (n: integer); port ( clk: in STD_LOGIC; rstff: in STD_LOGIC; rom_enable : in STD_LOGIC; ram_read_enable : in STD_LOGIC; ram_write_enable : in STD_LOGIC; a: out STD_LOGIC_VECTOR(2*n-1 downto 0) ); end component; begin process(clk,rst) variable delay1:integer:=0; variable delay2:integer:=0; variable delay3:integer:=0; begin if rst='1' then state<=state0; else if rising_edge(clk) then case state is when state0 => --initialize & input data rom_enable<='1'; rstff<='1'; if delay1=1 then rstff<='0'; state<=state1; delay2:=0; else delay1:=delay1+1; state<=state0; end if; when state1 => --write data to ram if delay2=2 then ram_write_enable<='1'; state<=state2; delay3:=0; else delay2:=delay2+1; state<=state1; end if; when state2 => --read data from ram if delay3=1 then ram_read_enable<='1'; state<=state0; delay1:=0; else delay3:=delay3+1; state<=state2; end if; end case; end if; end if; -- 新增:闭合外层的复位判断if end process; -- 修正组件实例化名称,同时显式指定port映射关系 filter0: filter_rom generic map(n => n) port map( clk => clk, rstff => rstff, rom_enable => rom_enable, ram_read_enable => ram_read_enable, ram_write_enable => ram_write_enable, a => a ); end fsm_struct;
修正点总结:
- 给进程外层的复位判断添加了
end if,解决第83行语法错误 - 将实例化组件名称改为
filter_rom,匹配你定义的组件,解决第85行错误 - 优化
port map为显式信号对应,提升代码可维护性
内容的提问来源于stack exchange,提问作者Bill
相关产品推荐
相关产品推荐

