1. 串口接收原理
基本原理:通过数据起始位判断要是否要开始接收的数据,通过采样的方式确定每一位数据是0还是1。
如何判断数据起始位到来:通过边沿检测电路检测起始信号的下降沿
如何采样:一位数据采多次,统计得到高电平出现的次数,次数多的就是该位的电平值
2. 自己写的代码(不完善)
设计代码
module uart_byte_rx(
clk,
rstn,
uart_byte_rx,
blaud_set,
data,
rx_done
);
input clk;
input rstn;
input uart_byte_rx;
input blaud_set;
output reg [7:0] data;
output reg rx_done;
//Blaud_set = 0时,波特率 = 9600;
//Blaud_set = 1时,波特率 = 19200;
//Blaud_set = 2时,波特率 = 38400;
//Blaud_set = 3时,波特率 = 57600;
//Blaud_set = 4时,波特率 = 115200;
reg[17:0] bps_dr;
always@(*)
case(blaud_set)
0: bps_dr = 1000000000/9600/20;
1: bps_dr = 1000000000/19200/20;
2: bps_dr = 1000000000/38400/20;
3: bps_dr = 1000000000/57600/20;
4: bps_dr = 1000000000/115200/20;
endcase
reg [1:0] test;
reg get_en;
always@(posedge clk or negedge rstn) //边沿检测,使能后续的采样
if(!rstn) begin
data 4 )data[0] 4 )data[1] 4 )data[2] 4 )data[3] 4 )data[4] 4 )data[5] 4 )data[6] 4 )data[7]
仿真波形
3. 看完视频后写的代码(完善)
设计代码
3.1 需学习的点:
1.将div_cnt划分为最小时间段
2.某些判断信号直接用assign利用,而不需要利用寄存器
3.仿真代码中task的使用
module uart_byte_rx1(
clk,
rstn,
blaud_set,
uart_rx,
data,
rx_done
);
input clk;
input rstn;
input [2:0]blaud_set;
input uart_rx;
output reg [7:0] data;
output rx_done;
reg [8:0] bps_dr;
always@(*)
case(blaud_set)
0:bps_dr = 1000000000/9600/16/20;
1:bps_dr = 1000000000/19200/16/20;
2:bps_dr = 1000000000/38400/16/20;
3:bps_dr = 1000000000/57600/16/20;
服务器托管网 4:bps_dr = 1000000000/115200/16/20;
default : bps_dr = 1000000000/9600/16/20;
endcase
//边沿信号检测
服务器托管网 reg [1:0] uart_rx_r; //用两位寄存器分别存储两个时间沿的uart_rx信号
always@(posedge clk) begin
uart_rx_r[0] = 4 ) ? 1 : 0; //可换种写法,写法如下
data[1] = 4 ) ? 1 : 0;
data[2] = 4 ) ? 1 : 0;
data[3] = 4 ) ? 1 : 0;
data[4] = 4 ) ? 1 : 0;
data[5] = 4 ) ? 1 : 0;
data[6] = 4 ) ? 1 : 0;
data[7] = 4 ) ? 1 : 0;
end
// data[1]
仿真代码
`timescale 1ns/1ns
module uart_byte_rx1_tb();
reg clk;
reg rstn;
reg uart_rx;
wire [2:0]blaud_set;
wire [7:0]data;
wire rx_done;
uart_byte_rx1 uart_byte_rx_inst1(
.clk(clk),
.rstn(rstn),
.blaud_set(blaud_set),
.uart_rx(uart_rx),
.data(data),
.rx_done(rx_done)
);
assign blaud_set = 3'd4;
initial clk = 1;
always #10 clk = ~clk;
initial begin
rstn = 0;
uart_rx = 1;
#201;
rstn = 1;
#200;
uart_tx_byte(8'h5a);
@(posedge rx_done)
#5000;
uart_tx_byte(8'ha5);
@(posedge rx_done)
#5000;
uart_tx_byte(8'h86);
@(posedge rx_done)
#5000;
$stop;
end
task uart_tx_byte;
input [7:0] tx_data;
begin
uart_rx = 1;
#20;
uart_rx = 0;
#8680;
uart_rx = tx_data[0];
#8680;
uart_rx = tx_data[1];
#8680;
uart_rx = tx_data[2];
#8680;
uart_rx = tx_data[3];
#8680;
uart_rx = tx_data[4];
#8680;
uart_rx = tx_data[5];
#8680;
uart_rx = tx_data[6];
#8680;
uart_rx = tx_data[7];
end
endtask
endmodule
仿真波形
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
希尔排序算法详解 一. 引言 1. 背景介绍 1.1 数据排序的重要性 1.2 希尔排序的由来 2. 排序算法的分类 2.1 比较排序和非比较排序 2.2 希尔排序的类型 二. 希尔排序基本概念 1. 希尔排序的定义 1.1 缩小增量排序 1.2 插入排序的变…