FPGA笔记
0赞
这是前几天学习中记在word上的笔记,放到这里来吧,第一篇博客。。
1、提高工作频率的本质就是要减少寄存器到寄存器的时延,最有效的方法就是避免出现大的组合逻辑,也就是要尽量去满足四输入的条件,减少LUT级联的数量。我们可以通过加约束、流水、切割状态的方法提高工作频率。
2、昨天写一个边沿检测电路,仿真几度出现问题,到后来一直在思考触发器的输入输入到底有没有延迟一个节拍。这个问题可以好好思考一下,简单触发器的波形似乎没有,但是对于平常插入的寄存器的延迟又是怎么产生的呢,好好研究时序节拍问题。边沿检测电路比喻在输入输出应该有一个延迟,所以今天改了测试代码,仿真完全正确。下面贴出源代码和测试代码。开始写的不是在initial里面写forever #40 d=~d; 而是在外面写了个always #40 d=~d; 这样出来的结果是输入输出上下完全同步对齐,使检测信号出来时一个没有任何宽度的刺,开始还觉得应该有一个节拍的延迟,现在看来不是的,再思考吧(##其实是仿真代码的问题。。)。改了之后,就在复位信号的基础上把输入信号D比时钟上升沿提早了5ns,故输出D便相对延迟了5ns,因而结果完全正确。。下面也贴出RTL视图和仿真波形图。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
module edge_test(clk,rst_n,d,q,pos_edge,neg_edge);
input clk,rst_n,d;
output reg q;
output pos_edge,neg_edge;
always @(posedge clk )
if(!rst_n)q<=1'b0;
else q<=d;
assign pos_edge= ~q& d;
assign neg_edge= ~d& q;
Endmodule
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
`timescale 1 ps/ 1 ps
module edge_test_tb();
reg clk,rst_n,d;
wire q,neg_edge,pos_edge;
edge_test i1 (.clk(clk),.neg_edge(neg_edge),.pos_edge(pos_edge),.rst_n(rst_n),.d(d),.q(q));
initial
begin clk=1; d=0; rst_n=0;#35 rst_n=1;forever #40 d=~d; end
always #10 clk=~clk;
Endmodul


3、这是用触发器搭起来的一个二分频电路。低电平复位,MUX输出0,第一个时钟上升沿Q段输出0,,与此同时经MUX反相以后,D端马上出现1,下一个时钟上升沿Q段输出1,
同时经MUX反相以后,D端马上出现0,下一个时钟上升沿Q段输出0,这样就实现了一个二分频电路,成功实现了always@(posedge clk_in) clk_out=~clk_out;

4、Gray码计数器以gray码作为编码方式,Gray码每次跳变,只有一位改变由常规的计数器和gray码转换电路两部分组成广泛用于跨时钟域设计,用不同的时钟采样计数值,不会产生毛刺,下面分析二进制码与gray码之间的转换。
Gray码到二进制码的转换:最高位相同二进制码的其余位是gray码的相应位与所有高位异或
如四位gray转换为二进制
Bin[0]=gray[0]^ gray[1]^ gray[2]^ gray[3]
Bin[1]=gray[1]^ gray[2]^ gray[3]
Bin[2]=gray[2]^ gray[3]
Bin[3]=gray[3]
二进制码到gray码的转换 gray最高位和二进制码相同其余位的取值取二进制码的相应位与相邻高位异或 gray[i]=bin[i]^bin[i+1]
如4位二进制码到gray的转换
gray[0]=bin[0]^bin[1]
gray[1]=bin[1]^bin[2]
gray[2]=bin[2]^bin[3]
gray[3]=bin[3]
5、亚稳态 亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状态。当一个触发器进入亚稳态时,既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上,在这个稳定期间,触发器输出一些中间级电平,或者可能处于振荡状态,并且这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去。
解决方法:降低系统时钟频率
用反应时间更快的触发器
引入同步机制,防止亚稳态传播
改变时钟质量,用边沿变化快速的时钟信号
6、复位电路
在FPGA设计中,复位电路是及其重要的,因为一个不正确设计的复位本身可以表现为一个不可重复的逻辑错误.复位电路分为:异步复位和同步复位.
异步复位:无论时钟沿是否到来,只要复位信号有效,就对系统进行复位.
优点:1.节省资源(大多数器件的dff都有异步复位端口, 因此采用异步复位可以节省资源)
2.设计相对简单。
3.异步复位信号识别方便,而且可以很方便的使用FPGA的全局复位端口GSR
缺点:
1.在复位信号释放的时候容易出现问题。具体就是说:倘若复位释放时恰恰在时钟有效沿附近,就很容易使寄存器输出出现亚稳态,从而导致亚稳态。
2.复位信号容易受到毛刺的影响.
同步复位:复位信号在时钟沿到来的时候,才能有效,否则,不复位.
优点:1. 便于系统同步化(同步复位可以使你的系统成为完全的同步时序电路,便于时序分析,而 fmax一般较高)
2.便于滤除高频毛刺(他采用clk打一拍可以消除高频毛刺)
缺点:1. 复位信号的有效时要大于时钟周期,才能真正被系统识别并完成复位任务。同时还要考虑,诸如:clk skew,组合逻辑路径延时,复位延时等因素
2. 浪费资源(由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会耗费较多的逻辑资源)
FPGA设计中复位的处理方法(工程中常用)
异步复位,同步释放 + 复位信号低电平有效
异步复位,同步释放 : 就是在复位信号到来的时候不受时钟信号的同步,而是在复位信号释放的时候受到时钟信号的同步。
现场操作:编写异步复位电路和同步复位电路用quartusII软件中的RTL Viewer查看电路.
7、什么是"线与"逻辑,要实现它,在硬件特性上有什么具体要求?
线与逻辑是两个输出信号相连可以实现与的功能。在硬件上,要用oc门来实现,由于不用 oc门可能使灌电流过大,而烧坏逻辑门. 同时在输出端口应加一个上拉电阻。Oc门就是集电极开路门。
8、常用逻辑电平?TTL与COMS电平连接的问题
常用逻辑电平:TTL、CMOS、LVTTL、LVCMOS、ECL(Emitter Coupled Logic)、PECL(Pseudo/Positive Emitter Coupled Logic)、LVDS(Low Voltage Differential Signaling)、GTL(Gunning Transceiver Logic)、BTL(Backplane Transceiver Logic)、ETL(enhanced transceiver logic)、GTLP(Gunning Transceiver Logic Plus);RS232、RS422、RS485(12V,5V,3.3V);也有一种答案是:常用逻辑电平:12V,5V,3.3V。TTL和CMOS 不可以直接互连,由于TTL是在0.3-3.6V之间,而CMOS则是有在12V的有在5V的。CMOS输出接到TTL是可以直接互连。TTL接到 CMOS需要在输出端口加一上拉电阻接到5V或者12V。
cmos的高低电平为:Vih>=0.7VDD,Vil<=0.3VDD;Voh>=0.9VDD,Vol<=0.1VDD.
ttl的为:Vih>=2.0v,Vil<=0.8v;Voh>=2.4v,Vol<=0.4v.
用cmos可直接驱动ttl;加上拉电阻后,ttl可驱动cmos.
1、当TTL电路驱动COMS电路时,如果TTL电路输出的高电平低于COMS电路的最低高电平(一般为3.5V),这时就需要在TTL的输出端接上拉电阻,以提高输出高电平的值。
2、OC门电路必须加上拉电阻,以提高输出的搞电平值。
3、为加大输出引脚的驱动能力,有的单片机管脚上也常使用上拉电阻。
4、在COMS芯片上,为了防止静电造成损坏,不用的管脚不能悬空,一般接上拉电阻产生降低输入阻抗,提供泄荷通路。
5、芯片管脚加上拉电阻来提高输出电平从而提高芯片输入信号的噪声容限增强抗干扰能力。
6、提高总线的抗电磁干扰能力。管脚悬空就比较容易接受外界的电磁干扰。
7、长线传输中电阻不匹配容易引起反射波干扰,加上下拉电阻是电阻匹配,有效的抑制反射波干扰。
上拉电阻阻值的选择原则包括:
1、从节约功耗及芯片的灌电流能力考虑应当足够大;电阻大,电流小。
2、从确保足够的驱动电流考虑应当足够小;电阻小,电流大。
3、对于高速电路,过大的上拉电阻可能边沿变平缓。综合考虑以上三点,通常在1k到10k之间选取。对下拉电阻也有类似道理。
OC门电路必须加上拉电阻,以提高输出的搞电平值。
OC门电路要输出“1”时才需要加上拉电阻不加根本就没有高电平
在有时我们用OC门作驱动(例如控制一个 LED)灌电流工作时就可以不加上拉电阻
OC门可以实现“线与”运算
OC门就是 集电极 开路 输出
总之加上拉电阻能够提高驱动能力。
