原创 串口接收最小系统

2010-6-8 16:59 2180 15 15 分类: FPGA/CPLD

1 提出


最小系统的概念已经很久了。这里赋予的内涵是从功能上来讲的:通过串口接收一个数据,然后将其并行输出。之所以叫最小系统,是因为它涵盖了串口接收的最基本的知识点,具备板级验证功能,别的都没有。基本的知识点是:


下降沿检测;


波特率时钟生成;


逐位处理。


并行输出验证接收,简单可靠。只需要几个led灯或者数码管就可以。


裁掉的知识点有:


奇偶验证;


多次接收等。


这样的最小系统简单易学。然而一旦掌握,便入了门,后面很容易提高。


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


2 基本知识点


2.1 下降沿检测


要检测下降沿,至少需要2个量。一般用3个,特<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />权老师用了4个,目的是滤波。但是我还没有理解。这里想说的是,除了输入外,其余量应该初始化为1。这符合串口描述,闲置时该路为高电平。监测下降沿的前提是移位,那么实际上监测下降沿的这一路,从输入到最后一个量,应该都是一条线。


下降沿的检测要按系统时钟的频率移位并判断。用波特率时钟频率检测实时性降低,没有必要。


2.2波特率时钟生成


波特率时钟用来和输入帧各位搭接。首先要有一个计数器,对系统时钟计数。每个波特率时钟周期复位一次。可以半周期取反,也可以每个周期置高或置低一次。


2.3逐位处理


下降沿到来后,要推迟一个波特率周期开始接收。有的初学者会在这里小小受挫,比如我。因为是初学,难免遗鞋掉帽子。只要一仿真,马上就明白了。


中间各位依次接收。为便于理解,用8位变量各位对应接收即可,移位有些复杂。


还有一个容易犯的错误是,最后接收完最高位后,位计数器不累加。这样会把停止位付给最高位。通过仿真也很容易纠正。


3Testbench仿真


仿真其实很容易,不管是ISE还是ModelSim,都有简单易学的教程Tutorial


建立波形文件猛一看很容易,其实很烦。为了减少数数的负担,我就让波特率周期等于两个系统时钟周期。结果有一些假象,如果你用了好几个reg变量移位接收,就更是如此。其实一般的系统时钟都是几十兆,常用波特率上限115200bps,差着量级呢。


编写testbench也很容易上手。主要的一点是,它可以让你把程序运行看得更清楚。看到预计的波形的时候,你就会有这样的感觉。


不罗嗦了,上一个我写的Testbench。源文件是小试牛刀那篇。一定要把下降沿检测用的两个reg变量初始化为1


 


`timescale 1ns/1ps


module rxd_test1;


 


reg clk;


reg rx;


wire [7:0]rx_reg;


 


rxd1 d(


                     .clk(clk),


                     .rx(rx),


                     .rx_reg(rx_reg)


              );


             


initial


begin


       clk = 0;


       forever


       #10 clk = ~clk;


end


      


parameter             BPS9600 = 104160;


parameter                     data_given = 8'h01;


integer i;


initial


begin


       rx = 1'b1;


       # BPS9600 rx = 1'b0;


      


       for(i=0;i<8;i=i+1)


       # BPS9600 rx = data_given;


      


       # BPS9600 rx = 1'b1;


       $display("%b recieved",rx_reg);


       # BPS9600 rx = 1'b1;


       $stop;


end


 


endmodule


 


仿真结果如下:


 


点击看大图 


 


最后要感谢特权老师。这个testbench是参考他的串口自收发仿真那篇博文写的。真是一个好课件。


最后,对我的仿真步骤做个小总结:


1 建立一个工程。


2 把源文件和testbench文件添加到该工程。


3 project标签页选中这两个文件,右键菜单选compile all


4 library页点开work,双击testbench文件。


5 sim页选testbench文件,右键add/add to waveWave窗口打开。


6 Wave窗口点击run-all 按钮。


下面就交给你了。

文章评论0条评论)

登录后参与讨论
我要评论
0
15
关闭 站长推荐上一条 /2 下一条