基于Verilog的带FIFO写入缓冲的串口发送接口封装
一、模块框图及基本思路
tx_module:串口发送的核心模块,详细介绍请参照前面的“基于Verilog的串口发送实验”
fifo2tx_module:当fifo不为空时,读取fifo中的数据并使能发送
tx_fifo:深度为1024,8位宽度fifo
tx_interface:前面几个模块的组合
tx_interface_control:不断向tx_fifo中写入递增的8位数据(8’d0-8’hff)
tx_interface_top:顶层模块
二、软件部分
tx_bps_module:
module tx_bps_module #(parameter Baud=)(
CLK,RSTn,
Count_Sig,
BPS_CLK
);
input CLK;
input RSTn;
input Count_Sig;
output BPS_CLK; /***************************/
localparam Baud_Div=50_000_000/Baud-;
localparam Baud_Div2=Baud_Div/; reg[:] Count_BPS;
/*************************/
always @(posedge CLK or negedge RSTn)
begin
if(!RSTn)
Count_BPS<='d0;
else if(Count_BPS==Baud_Div)
Count_BPS<='d0;
else if(Count_Sig)
Count_BPS<=Count_BPS+;
else Count_BPS<='d0;
end
/************************/
assign BPS_CLK=(Count_BPS==Baud_Div2)?'b1:1'b0;
endmodule
tx_control_module:
module tx_control_module(
CLK,RSTn,
TX_En_Sig,TX_Data,BPS_CLK,
TX_Done_Sig,TX_Pin_Out
);
input CLK,RSTn;
input TX_En_Sig,BPS_CLK;
input [:]TX_Data;
output TX_Done_Sig,TX_Pin_Out;
/***************************************/
reg rTX;
reg isDone;
reg[:] i;
always @(posedge CLK or negedge RSTn)
begin
if(!RSTn)
begin
rTX<='b1;
isDone<='b0;
i<='d0;
end
else if(TX_En_Sig)
begin
case(i)
'd0:if(BPS_CLK) begin rTX<=0;i<=i+1'b1; end
'd1,4'd2,'d3,4'd4,'d5,4'd6,'d7,4'd8:
if(BPS_CLK) begin rTX<=TX_Data[i-];i<=i+'b1; end
'd9:if(BPS_CLK) begin rTX<=1;i<=i+1'b1; end
'd10:if(BPS_CLK) begin rTX<=1;i<=i+1'b1; end
'd11:if(BPS_CLK) begin isDone<=1;i<=i+1'b1; end
'd12: begin isDone<=0;i<=1'b0; end
endcase
end
end
/***************************************/
assign TX_Pin_Out=rTX;
assign TX_Done_Sig=isDone;
endmodule
tx_module:
module tx_module(
CLK,RSTn,
TX_En_Sig,TX_Data,TX_Pin_Out,TX_Done_Sig
);
input CLK;
input RSTn;
input TX_En_Sig;
input [:] TX_Data;
output TX_Pin_Out;
output TX_Done_Sig; wire BPS_CLK; tx_bps_module U0(.CLK(CLK),.RSTn(RSTn),.Count_Sig(TX_En_Sig),.BPS_CLK(BPS_CLK));
tx_control_module U1(.CLK(CLK),.RSTn(RSTn),.TX_En_Sig(TX_En_Sig),
.BPS_CLK(BPS_CLK),.TX_Data(TX_Data),.TX_Done_Sig(TX_Done_Sig),
.TX_Pin_Out(TX_Pin_Out));
endmodule
fifo2tx_module:
module fifo2tx_module(
input CLK,
input RSTn,
//fifo接口
input Empty_Sig,
input [:] FIFO_Read_Data,
output Read_Req_Sig,
//tx_module接口
input TX_Done_Sig,
output [:]TX_Data,
output TX_En_Sig
); /*************************************************/
reg isRead;
reg isTX;
reg [:]i;
always @(posedge CLK or negedge RSTn)
if(!RSTn)
begin
i<='d0;
isRead<='b0;
isTX<='b0;
end
else
case(i)
'd0:if(!Empty_Sig) begin isRead<=1'b1;i<=i+'b1; end
'd1:begin isRead<=1'b0;i<=+'b1; end
'd2:if(TX_Done_Sig) begin isTX<=1'b0;i<='d0; end
else isTX<='b1;
endcase
/************************************************/
assign Read_Req_Sig=isRead;
assign TX_En_Sig=isTX;
assign TX_Data=FIFO_Read_Data; endmodule
tx_interface:
module tx_interface(
input CLK,
input RSTn,
//FIFO写入接口
input Write_Req_Sig,
input [:]FIFO_Write_Data,
output Full_Sig, output TX_Pin_Out
); wire Empty_Sig;
wire Read_Req_Sig;
wire [:] FIFO_Read_Data; wire TX_En_Sig;
wire TX_Done_Sig;
wire [:]TX_Data; tx_fifo U0 (
.clk(CLK), // input clk
.rst(!RSTn), // input rst
.din(FIFO_Write_Data), // input [7 : 0] din
.wr_en(Write_Req_Sig), // input wr_en
.rd_en(Read_Req_Sig), // input rd_en
.dout(FIFO_Read_Data), // output [7 : 0] dout
.full(Full_Sig), // output full
.empty(Empty_Sig) // output empty
); fifo2tx_module U1 (
.CLK(CLK),
.RSTn(RSTn),
.Empty_Sig(Empty_Sig),
.FIFO_Read_Data(FIFO_Read_Data),
.Read_Req_Sig(Read_Req_Sig),
.TX_Done_Sig(TX_Done_Sig),
.TX_Data(TX_Data),
.TX_En_Sig(TX_En_Sig)
); tx_module U2 (
.CLK(CLK),
.RSTn(RSTn),
.TX_En_Sig(TX_En_Sig),
.TX_Data(TX_Data),
.TX_Pin_Out(TX_Pin_Out),
.TX_Done_Sig(TX_Done_Sig)
); endmodule
tx_interface_control:
module tx_interface_control(
input CLK,
input RSTn,
output Write_Req_Sig,
output [:]FIFO_Write_Data,
input Full_Sig
); /*****************FIFO写入部分********************/
reg [:] i;
reg Write_Req_Sig_r;
reg [:]FIFO_Write_Data_r; always @(posedge CLK or negedge RSTn)
if(!RSTn)
begin
FIFO_Write_Data_r<='d0;
i<='d0;
Write_Req_Sig_r<='b0;
end
else if(!Full_Sig)
case(i)
'd0:begin FIFO_Write_Data_r<=FIFO_Write_Data_r+1'b1;i<=i+'b1;Write_Req_Sig_r<=1'b1;end
'd1:begin i<=2'd0;Write_Req_Sig_r<='b0;end
endcase
assign Write_Req_Sig=Write_Req_Sig_r;
assign FIFO_Write_Data=FIFO_Write_Data_r; endmodule
tx_interface_top:
module tx_interface_top(
input CLK,
input RSTn,
output TX_Pin_Out
); wire Write_Req_Sig;
wire [:]FIFO_Write_Data;
wire Full_Sig; tx_interface_control U0 (
.CLK(CLK),
.RSTn(RSTn),
.Write_Req_Sig(Write_Req_Sig),
.FIFO_Write_Data(FIFO_Write_Data),
.Full_Sig(Full_Sig)
);
tx_interface U1 (
.CLK(CLK),
.RSTn(RSTn),
.Write_Req_Sig(Write_Req_Sig),
.FIFO_Write_Data(FIFO_Write_Data),
.Full_Sig(Full_Sig),
.TX_Pin_Out(TX_Pin_Out)
); endmodule
三、硬件部分
黑金SPARTAN开发板
NET "CLK" LOC = T8;
NET "RSTn" LOC = L3;
NET "TX_Pin_Out" LOC = D12;
基于Verilog的带FIFO写入缓冲的串口发送接口封装的更多相关文章
- 基于Verilog的带FIFO输出缓冲的串口接收接口封装
一.模块框图及基本思路 rx_module:串口接收的核心模块,详细介绍请见“基于Verilog的串口接收实验” rx2fifo_module:rx_module与rx_fifo之间的控制模块,其功能 ...
- 基于Verilog的简单FIFO读写实验
一.模块框图及基本思路 fifo_ip:ISE生成的IP fifo_control:在fifo未满情况下不断写入递增的四位数,每隔1s读出一个数据驱动Led显示 fifo_top:前两个模块的组合 二 ...
- 基于Zabbix API文档二次开发与java接口封装
(继续贴一篇之前工作期间写的经验案例) 一. 案例背景 我负责开发过一个平台的监控报警模块,基于zabbix实现,需要对zabbix进行二次开发. Zabbix官方提供了Rest ...
- 带发送FIFO缓冲的RX232串口发送以及把众多文件变成“黑匣子”用于其它工程的调用
如果需要发送端不断地接收新的数据,而发送端的数据传输率低就需要一个缓冲器FIFO来缓冲数据.当你为别人做项目只是想实现功能而不想让自己的代码让别人看到,想保护自己的算法时,你可以用以下的方法.我使用的 ...
- 基于Verilog的奇数偶数小数分频器设计
今天呢,由泡泡鱼工作室发布的微信公共号“硬件为王”(微信号:king_hardware)正式上线啦,关注有惊喜哦.在这个普天同庆的美好日子里,小编脑洞大开,决定写一首诗赞美一下我们背后伟大的团队,虽然 ...
- 基于Verilog HDL整数乘法器设计与仿真验证
基于Verilog HDL整数乘法器设计与仿真验证 1.预备知识 整数分为短整数,中整数,长整数,本文只涉及到短整数.短整数:占用一个字节空间,8位,其中最高位为符号位(最高位为1表示为负数,最高位为 ...
- 基于jquery左侧带选项卡切换的焦点图
今天给大家分享一款基于jquery左侧带选项卡切换的焦点图.这款焦点图左侧有短标题,单击切换并显示长标题.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div class ...
- 基于Verilog HDL 各种实验
菜鸟做的的小实验链接汇总: 1.基于Verilog HDL 的数字时钟设计 2.乘法器 3.触发器(基本的SR触发器.同步触发器.D触发器) 4.基于Verilog HDL的ADC ...
- 基于Verilog HDL 的数字电压表设计
本次实验是在“基于Verilog HDL的ADC0809CCN数据采样”实验上进一步改进,利用ADC0809采集到的8位数据,进行BCD编码,以供查表方式相加进行显示,本次实验用三位数码管. ADC0 ...
随机推荐
- Electron把网页打包成桌面应用并进行源码加密
前言 最近想把自己用html+css+js做的网页界面打包成桌面应用,网上一搜,发现Electron是一个不错的选择,试了试,发现效果真的不错.这里记录一下打包过程以作记录,便于自己以后查看学习. 一 ...
- Servlet+纯java+MySQL实现课程信息的增删改查
Dbutil: package com.zh.util; import java.sql.Connection; import java.sql.DriverManager; import java. ...
- Node.js学习准备篇
这里写个Node.js 准备篇包含内容有node.js 的安装,命令行运行node.js 文件,使用webStrom 编写 node.js 时有提示功能,并用webStrom 运行 Node.js 其 ...
- dp小总结
写在前面 Just some easy problem solving with dynamic programming. (Given me a dynamic programming table, ...
- DataFrame 行列数据的筛选
一.对DataFrame的认知 DataFrame的本质是行(index)列(column)索引+多列数据. DataFrame默认索引是序号(0,1,2…),可以理解成位置索引. 一般我们用id标识 ...
- 剑指offer(4)重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- Learning-MySQL【3】:数据类型和运算符
一.数据类型 1.数值类型 为每张表的每个字段选择合适的数据类型是数据库设计过程中一个重要的步骤. 数字分为整数和小数.其中整数用整数类型表示,小数用浮点数类型和定点数类型表示. 浮点数类型包括单精度 ...
- Microsoft Visual Studio已停止工作
问题:今天在安装Visual Studio时,提示“Visual Studio installer 已停止工作” 解决办法:卸载原有的 .net framework,在微软官网下载 .net fra ...
- linux中搭建vue-cli
1 安装nvm依赖并配置环境变量在 sudo wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh ...
- 虚拟环境之virtualenvwrapper
原来的virtualenv工具使用特别麻烦,主要体现在以下几点 1 创建虚拟环境的命令太长,太难记 2 管理特别麻烦 3 进入虚拟环境需要找到这个虚拟环境的存放目录才行,如果没有统一的存放目录,很难找 ...