您的位置:首页 > 其它

NEXYS 3开发板练手--USB UART(三)

2014-01-16 15:11 225 查看

  接着上一篇,今天我们来建立一个能用于实际工程中的DEMO。

  首先,为了使我们的发送机不像上一个DEMO一样无节制的循环发送,我们需要修改代码,增加使发送机停止发送的控制部分,修改后的代码如下:

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:         lwy
//
// Create Date:    23:02:53 11/12/2013
// Design Name:
// Module Name:    PulTri
// Project Name:
// Target Devices:
// Tool versions:
// Description: 这个模块用来产生pulsewide个时钟宽度的脉冲(高电平)而不关心触发信号脉冲宽度是多少,该模块的输出脉冲宽度固定为pulsewide个时钟周期
//
// Port Descriptions:    clk     --  系统时钟,他关系到最后的输出脉冲宽度
//                                reset_n --    系统复位信号,低电平复位
//                                start      --    触发信号端口,高电平触发
//                                pulse      --    输出脉冲,该脉冲宽度固定为
//
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//                                pulsewide这里定义为一常数5,可以根据需要调整
//
//////////////////////////////////////////////////////////////////////////////////
module PulTri(
clk,
reset_n,
start,
pulse
);

input clk,reset_n,start;
output reg pulse;

parameter pulsewide = 50;//调整触发脉冲的宽度,pulsewide*clk

reg counten;
reg [7:0] count;

initial
begin
counten <= 0;
count <= 0;
pulse <= 0;
end

//计数器启动标记,表示一次延时计数开始
always @ ( posedge clk )
begin
if ( reset_n == 1'b0 )
counten <= 1'b0;
else
begin
if ( start == 1'b1 )
counten <= 1'b1;
else if ( start == 1'b0 && count > pulsewide )
counten <= 1'b0;
end
end

//延时计数器,保证延时 pulsewide 个时钟周期
always @ ( posedge clk )
begin
if ( reset_n == 1'b0 )
count <= 0;
else
begin
if ( counten == 1'b0 )
count <= 0;
else if ( counten == 1'b1 && count <= pulsewide )
count <= count + 1;
else if ( counten == 1'b0 && start == 1'b0 )
count <= 0;
end
end

//输出定宽脉冲
always @ ( negedge clk )
begin
if ( reset_n == 'b0 || count >= pulsewide )
pulse <= 1'b0;
else if ( counten == 1'b1 )
pulse <= 1'b1;
end

endmodule
View Code

  为了验证它是否达到了我们预先的目的,我在modelsim中进行了仿真,得到下面的波形图:

      

  start信号是我们的随机触发信号(在这个DEMO中即是按键信号),我们发现无论这个start信号的脉宽是多少,最后得到的pulse信号的宽度都是一定的,在上面的代码中我们知道它的宽度为pulsewide*clk,是我们可以设定的(仿真中pulsewide为5),说明这个模块达到了我们预先的目的。其实,这个模块在实际的应用中是很有价值的,我们可以理解为它将一种非理想的状况转换成了一种接近理想的状况。

  最后,我们的将编译生成的bit数据流文件下载进板子中,能在PC的超级终端(或则串口调试助手)中得到下面的结果:

                    

  可见,上面的DEMO与上一篇文章中的相比已经有了很大的改观,这是一个真正有实用价值的DEMO!如果我们像Quartus中一样将它做成一个SOPC嵌入式IP核,将顶层模块中的string和strLen这两个常数改成能用软件设置的寄存器,这样我们就能在软件中编程完成各种字符的发送工作,这是不是很有意义呢!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: