uartreceivev源码及测试代码.docx
- 文档编号:7078152
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:16
- 大小:18.62KB
uartreceivev源码及测试代码.docx
《uartreceivev源码及测试代码.docx》由会员分享,可在线阅读,更多相关《uartreceivev源码及测试代码.docx(16页珍藏版)》请在冰豆网上搜索。
uartreceivev源码及测试代码
顶层文件uart_receive.v,实现串口接收功能,里面例化四个子文件,分别是detect.v,baud.v,rx_receive.v,odd_even_detect.v,各个模块功能如下:
Detect.v功能简介:
实现串行输入数据(i_rxdata)电平检测(在i_rxdata由高电平向低电平转换时产生检测脉冲o_h2l),为后面检测起始位做准备(此文件可综合)
综合软件:
quartusii11.0
代码如下:
//===========================
//Author:
wsc
//Time:
2013/12/02
//FileName:
detect.v
//==========================
moduledetect(
i_clk,
i_rst_n,
i_rxdata,
o_h2l
);
inputi_clk;
inputi_rst_n;
inputi_rxdata;
outputo_h2l;
parameterYES=1'b1;
parameterNO=1'b0;
regh2l_r1;
regh2l_r2;
always@(posedgei_clkornegedgei_rst_n)
if(!
i_rst_n)
begin
h2l_r1<=YES;
h2l_r2<=YES;
end
else
begin
h2l_r1<=i_rxdata;
h2l_r2<=h2l_r1;
end
wireo_h2l;
assigno_h2l=h2l_r2&&(!
h2l_r1);/*在i_rxdata由高电平向低电平换时产生检测脉冲o_h2*/
endmodule
Baud.v模块简介:
根据波特率,产生传输1bit所需的固定时间周期,并在合适的时间输出采样脉冲(此文件可综合)
综合软件:
quartusii11.0
代码如下:
//===========================
//Author:
wsc
//Time:
2013/12/02
//FileName:
baud.v
//==========================
modulebaud(
i_clk,
i_rst_n,
i_baud_en,
o_baud_clk
);
inputi_clk;
inputi_rst_n;
inputi_baud_en;
outputo_baud_clk;
parameterbaud_count_data2=16'd1000;/*待定,可根据实际baud,来确定计数长度*/
parameterbaud_count_data=16'd500;/*待定,可根据实际baud,确定采样时间*/
//-------------------------------------------
reg[15:
0]baud_count;//定义16位计数器
always@(posedgei_clk,negedgei_rst_n)
if(!
i_rst_n)
baud_count<=16'd0;
elseif(baud_count==baud_count_data2)
baud_count<=16'd0;
elseif(i_baud_en)
baud_count<=baud_count+16'd1;
else
baud_count<=16'd0;
//-------------------------------------------
wireo_baud_clk;
assigno_baud_clk=(baud_count==baud_count_data)?
1'b1:
1'b0;/*采样脉冲输*/
endmodule
rx_receive.v功能简介:
此模块主要有一个状态机组成,采集串口输入数据(i_rxdata),并储存数据位与校验位到ov_rx_data_r寄存器,然后输出(此文件可综合)
综合软件:
quartusii11.0
代码:
//===========================
//Author:
wsc
//Time:
2013/12/02
//FileName:
rx_receive.v
//==========================
modulerx_receive(
i_clk,
i_rst_n,
i_h2l,
i_en,
i_rxdata,
i_baud_clk,
iv_oe,/*odd_even*/
o_baud_en,
o_rx_done,
ov_oe,
ov_rx_data_r
);
inputi_clk;
inputi_rst_n;
inputi_h2l;
inputi_en;
inputi_rxdata;
inputi_baud_clk;
input[1:
0]iv_oe;
outputo_baud_en;
outputo_rx_done;
output[1:
0]ov_oe;
output[8:
0]ov_rx_data_r;
parameterYES=1'b1;
parameterNO=1'b0;
rego_baud_en;
rego_rx_done;
reg[1:
0]oe_r;
reg[3:
0]i;/*state*/
reg[8:
0]rx_data;
reg[8:
0]ov_rx_data_r;
reg[1:
0]ov_oe;
always@(posedgei_clk,negedgei_rst_n)
if(!
i_rst_n)
begin
o_baud_en<=NO;
o_rx_done<=NO;
i<=4'd0;
oe_r<=2'd0;
rx_data<=9'd0;
ov_rx_data_r<=9'd0;
ov_oe<=2'd0;
end
elseif(i_en)
case(i)
4'd0:
if(i_h2l==YES)/*下降沿,由Detect.提供v*/
begin
i<=i+4'd1;
o_baud_en<=YES;
end
4'd1:
if(i_baud_clk==YES)/*start_bit*/
i<=i+4'd1;
4'd2,4'd3,4'd4,4'd5,4'd6,4'd7,4'd8,4'd9:
/*data_bit*/
if(i_baud_clk==YES)
begin
i<=i+4'd1;
rx_data[i-4'd2]<=i_rxdata;
oe_r<=iv_oe;
end
4'd10:
/*根据奇偶校验输入使能进行输出设置,00无校验,01,11奇校验,10偶校验*/
if(iv_oe==2'b00)
i<=4'd12;
elseif(iv_oe==2'b10)/*odd*/
i<=4'd11;
else/*even*/
i<=4'd11;
4'd11:
if(i_baud_clk==YES)/*odd_evev_bit*/
begin
i<=i+4'd1;
rx_data[8]<=i_rxdata;
end
4'd12:
if(i_baud_clk==YES)/*end_bit*/
i<=i+4'd1;
4'd13:
begin/*输出done信号,为奇偶校验做准备*/
o_baud_en<=NO;
o_rx_done<=YES;
i<=i+4'd1;
ov_oe<=oe_r;
ov_rx_data_r<=rx_data;/*储存数据到ov_rx_data_r*/
end
4'd14:
begin
o_baud_en<=NO;
o_rx_done<=NO;
i<=4'd0;
end
default:
begin
o_baud_en<=NO;
o_rx_done<=NO;
i<=4'd0;
oe_r<=2'd0;
rx_data<=9'd0;
end
endcase
endmodule
odd_even_detect.v简介:
奇偶校验检测模块,对收到的数据进行奇偶校验,奇偶校验出错输出为8’d0,否则原数据输出(此文件可综合)
综合软件:
quartusii11.0
代码:
//===========================
//Author:
wsc
//Time:
2013/12/02
//FileName:
odd_even_detect.v
//==========================
moduleodd_even_detect(
i_clk,
i_rst_n,
i_rx_receive_done,
iv_rx_receive_oe,
iv_rx_receive_data,
o_oe_done,
ov_rxdata
);
inputi_clk;
inputi_rst_n;
inputi_rx_receive_done;
input[1:
0]iv_rx_receive_oe;
input[8:
0]iv_rx_receive_data;
outputo_oe_done;
output[7:
0]ov_rxdata;
rego_oe_done;
reg[7:
0]ov_rxdata;
reg[2:
0]i;
always@(posedgei_clk,negedgei_rst_n)
if(!
i_rst_n)
begin
o_oe_done<=1'b0;
ov_rxdata<=8'd0;
i<=3'd0;
end
else
case(i)
3'd0:
if(i_rx_receive_done==1'b1)
i<=i+3'd1;
3'd1:
case(iv_rx_receive_oe)
2'b00:
begin/*无校验,原数据输出*/
ov_rxdata<=iv_rx_receive_data[7:
0];
i<=i+3'd1;
end
2'b10:
if(^iv_rx_receive_data==1'b0)/*odd校验,iv_rx_receive_data缩位异或为0,则正确,原数据输出,产生done信号,否则输出为0,不产生done信号*/
begin
ov_rxdata<=iv_rx_receive_data[7:
0];
i<=i+3'd1;
end
else
begin
ov_rxdata<=8'd0;
i<=3'd3;
end
2'b01,2'b11:
/*even校验,iv_rx_receive_data缩位异或为1,则正确,原数据输出,产生done信号,否则输出为0,不产生done信号*/
if(^iv_rx_receive_data==1'b1)
begin
ov_rxdata<=iv_rx_receive_data[7:
0];
i<=i+3'd1;
end
else
begin
ov_rxdata<=8'd0;
i<=3'd3;
end
default:
ov_rxdata<=8'd0;
endcase
3'd2:
begin
o_oe_done<=1'b1;
i<=i+3'd1;
end
3'd3:
begin
o_oe_done<=1'b0;
i<=3'd0;
end
default:
i<=3'd0;
endcase
endmodule
顶层文件uart_receive.v:
顶层文件,实现串口接收功能,串行数据输入,并行输出(此文件可综合)
综合软件:
quartusii11.0
代码:
//===========================
//Author:
wsc
//Time:
2013/12/02
//FileName:
uart_receive.v
//==========================
moduleuart_receive(
i_clk,
i_rst_n,
i_en,
iv_oe,/*odd_even*/
i_rxdata,
o_done,
ov_data
);
inputi_clk;
inputi_rst_n;
inputi_en;
input[1:
0]iv_oe;
inputi_rxdata;
outputo_done;
output[7:
0]ov_data;
wireo_h2l;
detectu1(
.i_clk(i_clk),
.i_rst_n(i_rst_n),
.i_rxdata(i_rxdata),
.o_h2l(o_h2l)
);
wirei_baud_en,o_baud_clk;
baudu2(
.i_clk(i_clk),
.i_rst_n(i_rst_n),
.i_baud_en(i_baud_en),
.o_baud_clk(o_baud_clk)
);
wireo_rx_done;
wire[1:
0]ov_oe;
wire[8:
0]ov_rx_data_r;
rx_receiveu3(
.i_clk(i_clk),
.i_rst_n(i_rst_n),
.i_h2l(o_h2l),
.i_en(i_en),
.i_rxdata(i_rxdata),
.i_baud_clk(o_baud_clk),
.iv_oe(iv_oe),/*odd_even*/
.o_baud_en(i_baud_en),
.o_rx_done(o_rx_done),
.ov_oe(ov_oe),
.ov_rx_data_r(ov_rx_data_r)
);
odd_even_detectu4(
.i_clk(i_clk),
.i_rst_n(i_rst_n),
.i_rx_receive_done(o_rx_done),
.iv_rx_receive_oe(ov_oe),
.iv_rx_receive_data(ov_rx_data_r),
.o_oe_done(o_done),
.ov_rxdata(ov_data)
);
endmodule
测试文件uart_receive_tb.v简介:
对uart_receive.v做简单测试,以确保uart_receive.v逻辑功能设计无误(此文件不可综合)
仿真软件:
modelsim6.5
代码:
//===========================
//Author:
wsc
//Time:
2013/12/03
//FileName:
uart_receive_tb.v
//==========================
`timescale1ns/1ns
moduleuart_receive_tb;
regi_clk;
regi_rst_n;
regi_en;
reg[1:
0]iv_oe;
regi_rxdata;
wireo_done;
wire[7:
0]ov_data;
initial
begin
i_clk<=1'b0;
i_rst_n<=1'b1;
i_en<=1'b0;
#23i_rst_n<=1'b0;
#45i_rst_n<=1'b1;
end
always#10i_clk<=!
i_clk;
/*以上实现功能为产生时钟周期为20ns的时钟信号i_clk,及复位信号i_rst_n(低电平有效)*/
initial/*产生i_rxdata数据,(由于波特率未定,暂时假设传输一位需要时间为20000ns)*/
begin
iv_oe<=2'b00;
i_rxdata<=1'b1;
#200i_en<=1'b1;
iv_oe<=2'b00;/*无校验位*/
i_rxdata<=1'b0;
#20000i_rxdata<=1'b0;/*传输数据为00111010*/
#20000i_rxdata<=1'b1;
#20000i_rxdata<=1'b0;
#20000i_rxdata<=1'b1;
#20000i_rxdata<=1'b1;
#20000i_rxdata<=1'b1;
#20000i_rxdata<=1'b0;
#20000i_rxdata<=1'b0;
#20000i_rxdata<=1'b1;
#20000i_en<=1'b0;
#200;
//--------------------------
i_en<=1'b1;
iv_oe<=2'b01;/*奇校验,传输数据为11001000*/
i_rxdata<=1'b0;
#20000i_rxdata<=1'b0;
#20000i_rxdata<=1'b0;
#20000i_rxdata<=1'b0;
#20000i_rxdata<=1'b1;
#20000i_rxdata<=1'b0;
#20000i_rxdata<=1'b0;
#20000i_rxdata<=1'b1;
#20000i_rxdata<=1'b1;
#20000i_rxdata<=1'b0;
#20000i_rxdata<=1'b1;
#20000i_en<=1'b0;
#200;
//------------------------
i_en<=1'b1;
iv_oe<=2'b10;/*偶校验,传输数据为11001000*/
i_rxdata<=1'b0;
#20000i_rxdata<=1'b0;
#20000i_rxdata<=1'b0;
#20000i_rxdata<=1'b0;
#20000i_rxdata<=1'b1;
#20000i_rxdata<=1'b0;
#20000i_rxdata<=1'b0;
#20000i_rxdata<=1'b1;
#20000i_rxdata<=1'b1;
#20000i_rxdata<=1'b1;
#20000i_rxdata<=1'b1;
#20000i_en<=1'b0;
#200;
//-----------------------
i_en<=1'b1;
iv_oe<=2'b11;/*奇校验,传输数据为11001010*/
i_rxdata<=1'b0;
#20000i_rxdata<=1'b0;
#20000i_rxdata<=1'b1;
#20000i_rxdata<=1'b0;
#20000i_rxdata<=1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- uartreceivev 源码 测试 代码