FPGA——ZYNQ7020学习日记
注意与vivado的关联:比如Notepad,在环境变量中添加。
·
1.VIVADO\MODELSIM\NOTEPAD开发环境的搭建;
注意与vivado的关联:比如Notepad,在环境变量中添加
2.对整体开发流程的实验(LED点亮、MUX2选1数据选择器、流水灯)
野火自带的PL资料包,里面有非常完整的SRC文件和TB文件,甚至还有XRC文件,省去了表格查找对应引脚,再在Schematic的I\O里分配的时间;实际板端验证非常有成就感,当然前提是你对verilog的语法已经比较熟练了,不然还是建议自己敲一敲,对硬件语言的并行思维有所了解。
3.半加器+全加器的实现
这部分自己实现一下,尤其是如何由半加器来构成全加器,可以手动画一画框图、真值表(其实你穷举后assign分配应该也是可以的,想一想三输入的全加器要得到sum是1是不是需要奇数个数的1?对输入奇数个数的计数这部分怎么实现?之前我在图灵完备中遇到过这个问题);
这样在vivado完整地跑一遍流程可以对这种模块如何进行层级设计、例化比较清晰的理解。
可以看到实例化成功是可以在hierarchy中看到结构的:

4.分频和降频的区别
一个是进行计数后然后在计数到指定个数时翻转一次
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
cnt <= 2'b0;
else if(cnt == 2'd2)
cnt <= 2'b0;
else
cnt <= cnt + 1'b1;
//clk_out:6分频50%占空比输出
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
clk_out <= 1'b0;
else if(cnt == 2'd2)
clk_out <= ~clk_out;
endmodule
一个是计数后,使用flag信号来标志;
//cnt:计数器从0到5循环计数
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
cnt <= 3'b0;
else if(cnt == 3'd5)
cnt <= 3'b0;
else
cnt <= cnt + 1'b1;
//clk_flag:脉冲信号指示6分频
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
clk_flag <= 1'b0;
else if(cnt == 3'd4)
clk_flag <= 1'b1;
else
clk_flag <= 1'b0;
虽然后者占空比不是50%,但其频率仍为6分频;
高速系统设计中,尽量采用降频方式,其中涉及到一个全局时钟树的概念,简单地说,降频可以保证更低的时钟偏斜(Skew)和抖动(Jitter)。抖动很好理解,所谓的时钟偏移,指的是从同一时钟源发出的时钟脉冲,通过不同的路径到达每个触发器的时间不同而产生的偏差成为时钟偏移。 千言万语汇成一句话,降频方式好于分频方式。
更多推荐
所有评论(0)