CPU与FPGA的最简单接口就是总线,通常总线包括有:地址总线,数据总线,读控制信号,写控制信号,以及片选信号。 在做设计的过程中,看到不少同事在实现FPGA寄存器的过程中,代码显得很混乱。以下是本人的小小经验,抛砖引玉!! 通常地址译码以及读写控制信号生成: aReg <= '1' when Addr=Reg_addr else '0'; rdReg <= (not rd_n) and wr_n and aReg and (not cs_n); wrReg <= (not wr_n) and rd_n and aReg and (not cs_n); 读寄存器,采取异步读的办法,这个好处就是响应快,而且读不会改写寄存器,不会引起颠覆性错误,因此是不用担心毛刺: Data <= Reg when rdReg='1' else (others=>'Z'); 写寄存器就建议采用同步电路,因为出现写控制信号出现毛刺会引起非法改写FPGA片内寄存器,这是很危险的: Write_Register:process(clk,rst_n) begin if rst_n='0' then Reg <= (others=>'0'); elsif rising_edge(clk) then if wrReg='1' then Reg <= Data; end if; end if; end process;
|