UART串口设计实验

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


任务介绍

设计一个串口发送模块,发送用户的数据给电脑。
在这里插入图片描述

一、内容解释

在这里插入图片描述
所需设计的模块端口。

在这里插入图片描述
计数一轮,所需的时间为1/9600s的时间。

在这里插入图片描述
所需发送的数据形式
在这里插入图片描述
先用D触发器的结构做一个暂存,对应r_Data暂存部分。
// r_Data暂存部分

always@(posedge Clk or negedge Reset_n)
if(!Reset_n)
    r_Data <= 0;
else if(delay_cnt == MCNT_DLY)
	r_Data <= Data;
else
	r_Data <= r_Data;

case语句和触发器就有点关系了。

在这里插入图片描述
并用LED显示数据发送的状态。
//位发送逻辑。自己没有思路的地方。用的是case逻辑。
always@( posedge Clk or negedge Reset_n)
if(!Reset_n)
uart_tx <= 1’d1;
else if(en_baud_cnt ==0 ) //当en_baud_cnt ==0时 就一定处于空闲状态。
uart_tx <= 1’d1;
else begin
case(bit_cnt)
0: uart_tx <= 1’d0; //起始位是低电平。
1: uart_tx <= r_Data[0]; //1的时候发送数据的Bit0位。发送的是Data位。
2: uart_tx <= r_Data[1];
3: uart_tx <= r_Data[2];
4: uart_tx <= r_Data[3];
5: uart_tx <= r_Data[4];
6: uart_tx <= r_Data[5];
7: uart_tx <= r_Data[6];
8: uart_tx <= r_Data[7];
9: uart_tx <= 1’d1; //停止位为什么是1?根据信号传输的波形来的。
default:uart_tx <= uart_tx;
endcase
end
在这里插入图片描述
在发送的过程中,将拨码开关的值存储下来。让他只发送我存储的值。而不管我拨码开关当前的值。
什么时候发送数据呢?是每当延时计数器计满的时候。1s时刻。
发送位为0,停止位为1是根据波形图来看的。

二、模块构建

1.模块构建

代码如下(示例):

module uart_byte_tx(
    Clk,
    Reset_n,
    Data,
    uart_tx,
    Led    
    );
    input Clk;
    input Reset_n;
    input [7:0]Data;
    output reg uart_tx;
    output reg Led;
    
    parameter MCNT_BAUD = 5208 - 1;      //波特率的计数器。1/9600=0.0001041667*10^9等于10416667。还需要除以20,自己忘记了。
    parameter MCNT_DLY = 50_000_000 - 1;    //1s对应的时间值。
    parameter MCNT_BIT = 10 - 1;  //10个周期
   
    //en_baud_cnt对应的是控制信 号。用来使用不同的计数器。过程赋值,所以使用reg。
    reg [12:0]baud_div_cnt; //波特率计数   
    reg en_baud_cnt;        //波特率使能信号
    reg [3:0]bit_cnt;       //10对应的是1010,计数输出第几个LED状态的计数器
    reg [25:0]delay_cnt;  //延时计数器
    reg [7:0]r_Data;      //Data的暂存
          
    //延时计数器
    // delay_cnt部分,计数1s。  延时计数器    
    always@(posedge Clk or negedge Reset_n)
    if(Reset_n)
        delay_cnt <= 0;
    else if(delay_cnt == MCNT_DLY)
        delay_cnt <= 0;
    else
        delay_cnt <= delay_cnt + 1'd1;
 //   r_Data暂存部分
    
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        r_Data <= 0;
    else if(delay_cnt == MCNT_DLY)
		r_Data <= Data;
	
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值