学习Verilog串口接收驱动对查找表和时序分析的感悟

@基于Cyclone FPGA的verilog语言开发

我把小梅哥串口接收部分的一个查找表,改成了两个查找表,由此带来的一些问题分享给大家:

查找表(LUT)

我们都只知道LUT(Look Up Table)在数字电路中就是一个MUX数选器。数选器又有多选一,所以常被称MUX(n)。n就是多路待选择信号的数目,在Cyclone IV E芯片上,本人做过的“XMG”开发板串口实验,就使用了这个器件。我发现,n确定的时候,将一级MUX,换成两级MUX,或许能够大大的减少FPGA芯片的逻辑单元的使用。具体的见如下分析。文末附上此次实验的工程文件。

1.两个查找表的好处当然是代码体积变小了,所使用的逻辑单元数目减少了(本质原因是我充分利用了信号之间控制关系,而减少了case语句带来Mux数选模块的大量分支),此外也没有用二维寄存器。

2.缺点就是整个10个串行数据的接收过程中,我要比梅哥的代码延迟一个节拍…除次之外呢?我的输出数据会在一个字节的传输过程中改变10次 =_=! …再除此之外呢?我为了得到正确的数据,控制了只在16个bps_clk中(某一个组)的最后一个(即第12个)bps_clk修改接收的数据(这样就在一个字节时间,对数据的每个位共修改了10次)

综合比较这两个实现方法,比较有用的就是:
1.我们都知道,在0->1->2…15->16中共要采样16次,对,就是说16-?时间段是不采样的。在分析时序设定边界的时候,我们不要嫌麻烦,应该思考到时钟两个跳变沿之间的时间段往往是另外一个信号发生改变的时刻。
2.二级查找表将响应时间延迟一个时钟节拍(因为虽然是10次二级查找表,但是第二级和第一级是分开的,所以我只是慢了最初的那一个节拍)。梅哥的代码在bps_cnt 0->1有一个初始化。而我则不可以,因为我的最小分度值是16而不是梅哥的1个bps_clk,所以只能在0->1(即0->16)时间段放弃初始化,直接进行(又或者在这段时间将初始化和对START_BIT的赋值一块写进去)。前面也说了,较小的MUX给我代码带来了较少的逻辑单元。

文末

在学习FPGA综合实验一个礼拜以来,投入了很多收获的也很多。不是打广告,自认为MG的教程很不赖。但是想想也是基于自己的“不懈追求”。学无止境,请在最美好的日子里,好好给自己以沉淀。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值