一、模块框图及基本思路

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写入缓冲的串口发送接口封装的更多相关文章

  1. 基于Verilog的带FIFO输出缓冲的串口接收接口封装

    一.模块框图及基本思路 rx_module:串口接收的核心模块,详细介绍请见“基于Verilog的串口接收实验” rx2fifo_module:rx_module与rx_fifo之间的控制模块,其功能 ...

  2. 基于Verilog的简单FIFO读写实验

    一.模块框图及基本思路 fifo_ip:ISE生成的IP fifo_control:在fifo未满情况下不断写入递增的四位数,每隔1s读出一个数据驱动Led显示 fifo_top:前两个模块的组合 二 ...

  3. 基于Zabbix API文档二次开发与java接口封装

    (继续贴一篇之前工作期间写的经验案例) 一.           案例背景 我负责开发过一个平台的监控报警模块,基于zabbix实现,需要对zabbix进行二次开发. Zabbix官方提供了Rest ...

  4. 带发送FIFO缓冲的RX232串口发送以及把众多文件变成“黑匣子”用于其它工程的调用

    如果需要发送端不断地接收新的数据,而发送端的数据传输率低就需要一个缓冲器FIFO来缓冲数据.当你为别人做项目只是想实现功能而不想让自己的代码让别人看到,想保护自己的算法时,你可以用以下的方法.我使用的 ...

  5. 基于Verilog的奇数偶数小数分频器设计

    今天呢,由泡泡鱼工作室发布的微信公共号“硬件为王”(微信号:king_hardware)正式上线啦,关注有惊喜哦.在这个普天同庆的美好日子里,小编脑洞大开,决定写一首诗赞美一下我们背后伟大的团队,虽然 ...

  6. 基于Verilog HDL整数乘法器设计与仿真验证

    基于Verilog HDL整数乘法器设计与仿真验证 1.预备知识 整数分为短整数,中整数,长整数,本文只涉及到短整数.短整数:占用一个字节空间,8位,其中最高位为符号位(最高位为1表示为负数,最高位为 ...

  7. 基于jquery左侧带选项卡切换的焦点图

    今天给大家分享一款基于jquery左侧带选项卡切换的焦点图.这款焦点图左侧有短标题,单击切换并显示长标题.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class ...

  8. 基于Verilog HDL 各种实验

    菜鸟做的的小实验链接汇总:           1.基于Verilog HDL 的数字时钟设计 2.乘法器 3.触发器(基本的SR触发器.同步触发器.D触发器) 4.基于Verilog HDL的ADC ...

  9. 基于Verilog HDL 的数字电压表设计

    本次实验是在“基于Verilog HDL的ADC0809CCN数据采样”实验上进一步改进,利用ADC0809采集到的8位数据,进行BCD编码,以供查表方式相加进行显示,本次实验用三位数码管. ADC0 ...

随机推荐

  1. 第八节 JS运动基础

    运动基础 让Div运动起来 速度——物体运动的快慢 运动中的Bug 不会停止 速度取某些值会无法停止 到达位置后再点击还会运动 重复点击速度加快 匀速运动(速度不变) 运动框架及应用: 运动框架: 在 ...

  2. TCP三次握手与四次分手超简单解析

    关于TCP三次握手四次分手,之前看资料解释的都很笼统,很多地方都不是很明白,所以很难记,前几天看的一个博客豁然开朗,可惜现在找不到了.现在把之前的疑惑总结起来,方便一下大家. 先上个TCP三次握手和四 ...

  3. 【做题】agc006e - Rotate 3x3——分析&思维

    原文链接 https://www.cnblogs.com/cly-none/p/9800105.html 题意:给出一个三行\(n\)列的矩阵.问它能否由满足\(a_{ij} = 3(j-1) + i ...

  4. UVA11019 Matrix Matcher

    思路 AC自动机匹配二维模式串的题目 因为如果矩形匹配,则每一行都必须匹配,考虑对于一个点,设count[i][j]记录以它为左上角的与模式矩形大小相同的矩形中有多少行和模式矩形匹配 然后把模式矩形的 ...

  5. python 基础知识点一

    基础数据类型初始. 数字:int 12,3,45 + - * / **    int: bit_lenth()转化为2进制的最小位数. % 取余数 ps:type() 字符串转化成数字:int(str ...

  6. Python 运行uiKLine.py ,PyQt4错误

    python 开发环境tool: 在运行项目中出现 NO module name PyQt4 错误 解决:

  7. [数据结构]P2.1 二叉搜索树

    二叉树就是每个节点最多有两个分叉的树.这里我们写一写一个典型的例子二叉搜索树,它存在的实际意义是什么呢? 在P1.1链表中,我们清楚了链表的优势是善于删除添加节点,但是其取值很慢:数组的优势是善于取值 ...

  8. hdoj4871

    5 4 21 2 12 3 23 4 34 5 2

  9. 自我学习成长系列之<<FirstHead设计模式>>

    第一章 设计模式入门 1.好词好句: 好的设计是可以应付改变. 2.驱动改变的因素:(a)客户需求不清晰,后期会一直变 (b)遇到坑爹的产品,自己不会全扔给程序员 (c)在开发过程中,产生一个新概念, ...

  10. C# 创建对象的方法

    1.实例化方法,也就是new(): //where T:new () 表示T必须有构造函数 public static T Create<T> where T:new () { retur ...