串口通信控制器的Verilog HDL实现(一) 顶层模块
时间:2022-04-28
本文章向大家介绍串口通信控制器的Verilog HDL实现(一) 顶层模块,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本设计采用分层设计思想,主要由顶层模块、波特率发生器、接收模块和发送模块这4个模块组成,强调功能划分明确,便于系统设计和调试。
本系统要求在Xilinx Spartan 3E Starter开发板上实现波特率为9600,停止位为1比特、不带校验位并且具备复位功能的串口通信控制器,并要求和PC机通过超级终端完成双向通信。不仅要求将板极发送数据显示在PC机的超级终端上,还要求用PC发送数据的ASCII码来驱动电路板的8个LED灯。为了便于测试,要求当按下开发板上的button_s时,板级发送的数值恢复到48,对应着字符0(字符0的ASCII码为48),然后按下一次button_n,发送数据加1。
因此,在系统实现时,不仅要包括完整的串口通信模块,还需要有相应的按键处理模块。这是因为按键按下的持续时间很长,对发送模块来讲,是一个电平信号,而不是脉冲信号,因此需要利用同步整形电路,将其处理成单时钟周期宽度的脉冲信号。
顶层模块作为设计的主干,用于例化各个模块以及响应外部按键,不包含串口收发模块的处理代码。串口通信控制器的顶层模块uart_top的代码如下所列。
module uart_top(
sys_clk_50MHz,rst_p,txd,rxd,LED,button_n,button_s
);
input sys_clk_50MHz;
input rst_p;
input rxd;
output txd;
input button;
input button_s;
output [7:0]LED;
reg [7:0]LED;
wire bclk;
wire [7:0]rx_dout;
wire ready;
reg [7:0]din;
wire tx_ready;
reg tx_cmd;
baud_gen u1(
.clk_50MHz(sys_clk_50MHz),
.rst_p(rst_p),
.bclk(bclk)
);
reg [2:0]bv1,bv2;
wire bv1_posedge,bv2_posedge;
always @(posedge bclk)
begin
bv1<={bv1[1:0],button_n};
bv2<={bv2[1:0],rx_ready};
end
assign bv1_posedge=(!bv1[2])&bv1[1];
assign bv2_posedge=(!bv2[2])&bv2[1];
always@(posedge bclk)
begin
if(button_s==1'b1)
begin
din<=48;//ASCII 0
tx_cmd<=1'b0;
end
else
begin
if(bv1_posedge==1'b1)
begin
din<=din+1'b1;
tx_cmd<=1'b1&tx_ready;
end
else
begin
din<=din;
tx_cmd<=1'b0;
end
end
end
always@(posedge bclk)
begin
if(bv2_posedge==1'b1)
begin
LED<=rx_dout;
end
end
uart_tx u2(
.bclk(bclk),
.reset(rst_p),
.tx_din(din),
.tx_cmd(tx_cmd),
.tx_ready(tx_ready),
.txd(txd)
);
uart_rx u3(
.bclk(bclk),
.reset(rst_p),
.rxd(rxd),
.rx_out(rx_out),
.rx_ready(rx_ready)
);
endmodule
- 挖洞经验 | 看我如何发现“小火车托马斯”智能玩具APP聊天应用漏洞
- Hive 常见问题与技巧【Updating】
- Hive 基础(1):分区、桶、Sort Merge Bucket Join
- 简化你的 java 字符串操作:Guava 之 CharMatcher 用法简介
- WAF绕过技巧浅谈
- flask 流式响应 RuntimeError: working outside of request context
- shell 学习笔记(19)
- HBase 写优化之 BulkLoad 实现数据快速入库
- 玩转 Linux 之:由 Nginx log rotation 聊聊 mv 的妙用
- 玩转 SHELL 脚本之:linux date 知多少?
- Hive 中的 LEFT SEMI JOIN 与 JOIN ON 的前世今生
- Yaffs_guts
- 4大分析工具的代码表白术,520花式秀恩爱!
- yaffsfs.c
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Swift:Lable 高度计算误差
- 基于python检查SSL证书到期情况代码实例
- Python搭建Keras CNN模型破解网站验证码的实现
- PyCharm 在Windows的有用快捷键详解
- Python 自动化测试(三): pytest 参数化测试用例构建
- 基于Android平台实现拼图小游戏
- kotlin项目加入Glide图片加载库并使用GlideApp的方法
- Android实现百分比下载进度条效果
- 实验2 OpenGL交互
- 深入了解OkHttp3之Interceptors
- 实验3.1 直线光栅化(键盘交互版)
- 150行Python代码实现带界面的数独游戏
- 实验4 编码裁剪算法
- 浅谈Python中os模块及shutil模块的常规操作
- Python decorator拦截器代码实例解析