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位变量各位对应接收即可,移位有些复杂。
还有一个容易犯的错误是,最后接收完最高位后,位计数器不累加。这样会把停止位付给最高位。通过仿真也很容易纠正。
3.Testbench仿真
仿真其实很容易,不管是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 wave。Wave窗口打开。
6 在Wave窗口点击run-all 按钮。
下面就交给你了。
文章评论(0条评论)
登录后参与讨论