提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
任务介绍
设计一个串口发送模块,发送用户的数据给电脑。
一、内容解释
所需设计的模块端口。
计数一轮,所需的时间为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;