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;
以上是采用VHDL编写,当然也是很容易转换成用Verilog描述,这个就留给各位来做了!! |