今天开始写一些关于fpga的学习心得,前面的基本语法已经掌握,总结一些代码的实现方法。
关于UART的收发
1.使用两个计数器
一:计数以产生序列机的基本计数单位
二:每当第一个基本计数器计数一轮,这个计数器加一。
第一个计数器是为了控制波特率,可以通过设置参数,实现一个波特率可变的模块。
第二个计数器每次加一,使用状态机进行一次数据的收发。
2.在接受端,仅在一个点进行接受数据,可能会发生数据被冲击信号之类产生干扰,因此需要对每一位的数据进行采样。
根据采样的次数,产生一个计数器,cnt_max与将要采样的次数相关,在每次第二个计数器加一的时候,采集收到的数据值。将所有收到的数据值进行判断。
分频器的使用
默认时钟频率为50M 周期为20ns
always@ (posedge clk or rst_n)
if(rst_n)
cnt<=0;
else if(cnt==1)
cnt<=0;
else
cnt <cnt+1;
默认时钟周期为20ns,cnt在每个下降沿加1,加2次就是40ns
always@ (posedge clk or rst_n)
if(rst_n)
sclk<=0;
else if(cnt==1)
sclk<=~sclk;
每40ns反转一次,周期为80ns,频率为12.5M
如每个下降沿反转,就是2分频,两个下降沿反转是4分频,4个下降沿反转是8分频。
但是由于分频时钟不稳定,所以尽量不要使用
一般写为:(DAC接收为例)
always@(posedge clk)
if()第一个计数器满一轮
case(lsm_cnt)
0:begin din<=data[15];sclk<=1;cs<=0;end
1:sclk<=0;
2:begin din<=data[14];sclk<=1;end
3:sclk<=1;
以此类推