实话讲,你就是想抄个作业而已,小站助人为乐,帮你抄一个
接下来就是利用三段式状态机实现的交通灯部分:
3. 引脚分配
4路按键和4路开关,可以用来作为输入信号分别控制数码管的输出。按照下面表格定义输入输出信号
配置好以后编译下载程序。您也可以试试修改程序,观察修改代码对于FPGA内部电路所造成的影响。
4. 小结
状态机是一类很重要的时序逻辑电路,是许多数字系统的核心部件,掌握状态机的使用是利用FPGA与CPLD进行开发的一项必会技能,本小节的交通灯程序即是利用三段式状态机描述方法实现的,希望读者能够快速掌握这项技能。这个比较简单,就不专门出教程了,我给你贴代码进行说明。
我们提供的DEMO4同时提供了OSC和PLL的用法示便。
1. ELF2 器件包含一个 CMOS 环形振荡器, 环形振荡器的输出可以作为全局时钟的输入, 也可以作为 PLL的参考时钟。 环形振荡器在全局时钟路径上, 插入的可配置分频器可以对 OSC 的频率进行 1-128 任意整数分频。 可以动态配置分频系数, 不使用时可以关闭 OSC 以节省功耗。环形振荡器中心频率 287MHz, 芯片个体之间频率误差较高, 误差范围达到 30%。 即 每一片EF2之间的频率可能在这个频率附近30%范围内,但可以校准。
EF2_PHY_OSCDIV inst(
.rstn(1), //复位,高有效
.stdby(0), // 休眠,高有效
.div(7'b000_0100), //分频系数
.clko(clko)); //出来的时钟
它有一些注意事项:
1. OSC、 OSCDIV 输出可以接 PLL, 但不能直接 Fabric, 可以通过 GCLK 连接到 Fabric。
2. ELF2系列器件不建议使用OSC+PLL的组合方式, 建议使用内部的EF2_PHY_OSCDIV (rstn, stdby, div,clko)。我们的示例工程就是这么个用法。
3. OSC 输出时钟最大偏差在 30%以内, 对时钟精度要求较高的场景不建议使用。
2. 关于PLL的例化其实没有什么要说的,其实在我们的很多demo中都有PLL的用法,
PLL的端口例表如下:
比较简单的如下:
PLL u_pll(
.refclk ( clk_osc ),
.reset ( ~cnt_rst[7] ),
.psclk ( clk_osc ),
.psdown ( S_psdown ),
.psstep ( S_psstep ),
.psclksel( S_psclksel ),
.extlock ( ),
.psdone ( S_psdone ),
.clk0_out( O_clk0 ),
.clk1_out( O_clk1 )
);
而Demo4中的PLL代码由于进行了动态调相,所以看起来相对复杂。
wire clk_osc;
wire clko;
OSC_DIV u_oscdiv(.rstn(1), .stdby(0), .div(7'b000_0100), .clko(clko)); //58.47M
EF2_LOGIC_BUFG BUFG_inst(
.o(clk_osc),
.i(clko)
);
reg [7:0] rst_cnt;
always @(posedge clk_osc) if (!rst_cnt[7]) rst_cnt <= rst_cnt + 1'b1;
wire sys_rst_n;
wire clk100m, clk50m, clk12m;
osc_pll u_osc_pll(
.refclk(clko),
.reset(~rst_cnt[7]),
.stdby(0),
.extlock(sys_rst_n),
.clk0_out(clk100m),
.clk1_out(clk50m),
.clk2_out(clk12m));
相较于上面主要是下面这几个端口的区别: