第一次接触安路FPGA开发的朋友可能会觉得无从下手,其实整个过程比想象中简单。我刚开始用TD软件时也走过弯路,这里把最实用的配置方法分享给大家。首先需要下载安装安路官方提供的TD开发套件,这个软件包已经包含了IP核生成器、综合工具和仿真环境,安装过程基本是一路"下一步"就行。
安装完成后打开TD软件,界面布局和常见的IDE类似。新建工程时要注意选择正确的器件型号,比如EF1A650LG144或者EG4S20,这个选项在后续的引脚约束环节非常关键。我建议在工程目录下建立清晰的文件夹结构,比如单独放IP核文件、约束文件和测试代码,避免后期文件混乱。
创建工程时会遇到一个关键选择:Verilog还是VHDL。作为过来人,我建议新手选择Verilog,因为安路的例程和社区资源以Verilog为主,遇到问题更容易找到参考方案。当然如果你有VHDL基础也可以选择后者,两种语言在功能实现上没有本质区别。
在TD软件左侧工具栏找到"IP Generator",这个工具是安路的一大特色,能快速生成各种常用功能模块。选择OSC模块后会弹出配置界面,这里有两个重要参数需要关注:
生成后的IP核文件是只读的,这点需要注意。如果需要修改参数,我的经验是先把文件另存为新文件名,然后在工程中替换引用。这样可以避免直接修改原始IP核文件导致的不可预期问题。
拿到OSC模块后,我们可以先写个简单的测试程序验证功能。下面这个例子展示了如何将60MHz时钟分频到1Hz:
verilog复制module OSC_Test(
output reg clk_out
);
wire osc_clk;
reg [24:0] count;
ELF_PHY_OSC #(
.FREQ("60")
) osc_inst(
.osc_clk(osc_clk),
.osc_dis(1'b0)
);
always @(posedge osc_clk) begin
if (count >= 30000000-1) begin
clk_out <= ~clk_out;
count <= 0;
end else begin
count <= count + 1;
end
end
endmodule
实际调试时我发现一个常见问题:有时候修改代码重新下载后,FPGA行为没有立即更新。这时候不要慌,断电重启开发板就能解决。这是因为安路FPGA的配置存储器需要完全断电才能清除旧配置。
串口通信是嵌入式开发中最常用的功能之一,安路的UART IP核让实现变得非常简单。在IP Generator中选择UART模块后,需要配置几个关键参数:
配置完成后生成的UART模块已经包含了完整的收发逻辑,我们只需要在顶层模块中正确连接信号线即可。
为了验证UART功能是否正常,我设计了一个简单的数据回环测试:FPGA收到数据后将其值加1再发送回去。这个测试可以同时验证收发功能是否正常:
verilog复制module uart_top (
input clk, // 24M
input rst_n, // 低电平复位
input rxd, // 接收引脚
output txd // 发送引脚
);
wire tx_en; // 发送使能
wire rx_err; // 接收错误标志
wire rx_vld; // 接收数据有效
wire tx_rdy; // 发送准备好
wire [7:0] tx_data;
wire [7:0] rx_data;
UART u0(
.clk(clk),
.rst_n(rst_n),
.rxd(rxd),
.tx_data(tx_data),
.tx_en(tx_en),
.rx_data(rx_data),
.rx_err(rx_err),
.rx_vld(rx_vld),
.tx_rdy(tx_rdy),
.txd(txd)
);
assign tx_en = rx_vld & tx_rdy & (!rx_err);
assign tx_data = rx_data + 1'b1;
endmodule
这个例子的巧妙之处在于用组合逻辑实现了即时回复,不需要使用FIFO或状态机。实际测试时可以用串口调试助手发送字符'A',应该会收到字符'B'。
引脚约束是FPGA开发中容易出错的一个环节。对于安路官方开发板,约束文件通常如下:
code复制set_pin_assignment { clk } { LOCATION = P20; }
set_pin_assignment { txd } { LOCATION = P143; }
set_pin_assignment { rxd } { LOCATION = P144; }
set_pin_assignment { rst_n } { LOCATION = P120; }
这里特别要注意时钟引脚的分配,如果分配错误会导致整个系统无法工作。我建议先在开发板原理图上确认各个功能引脚的位置,然后再编写约束文件。
以硬木课堂EG4S20开发板为例,适配时需要修改几个关键参数:
对应的约束文件应该修改为:
code复制set_pin_assignment { clk } { LOCATION = R7; }
set_pin_assignment { rst_n } { LOCATION = A14; }
set_pin_assignment { rxd } { LOCATION = F12; }
set_pin_assignment { txd } { LOCATION = D12; }
在实际项目中,我习惯为不同开发板创建单独的约束文件,通过工程配置来切换,这样可以大大提高代码复用率。遇到引脚不匹配的问题时,第一检查时钟信号,第二检查复位信号,这两个是最常见的出错点。