论坛元老
 
- 积分
- 6539
- 金钱
- 6539
- 注册时间
- 2015-8-25
- 在线时间
- 1024 小时
|
发表于 2017-4-8 10:41:28
|
显示全部楼层
FPGA的串口是要自己实现的,这就是为啥它难了。实现个啥功能都得自己从时序开始一点一点实现,不像单片机,几句话配置下就可以用了
这个程序,50M晶振,波特率9600,串口接收
module RS485_Recv (
//input
input sys_clk ,
input sys_rst_n ,
input RO ,
//output
output wire RE_DE ,
output reg[7:0] LED
);
//parameter define
parameter WIDTH1 = 8 ;
parameter WIDTH2 = 16 ;
//reg define
reg[WIDTH1-1:0] buff ;
reg[WIDTH1-1:0] data_out ;
reg[WIDTH2-1:0] counter ;
reg rxd_din1 ;
reg rxd_din2 ;
reg rxd_negedge_sig_flag ;
//wire define
wire rxd_negedge_sig ;
assign RE_DE = 1'b0 ;
always @(posedge sys_clk or negedge sys_rst_n)
begin
if(sys_rst_n == 1'b0)
begin
rxd_din1 <= 1'b0 ;
rxd_din2 <= 1'b0 ;
end
else
begin
rxd_din1 <= RO ;
rxd_din2 <= rxd_din1 ;
end
end
assign rxd_negedge_sig = (~rxd_din2) & (rxd_din1) ;
always @(posedge sys_clk or negedge sys_rst_n)
begin
if(sys_rst_n == 1'b0)
rxd_negedge_sig_flag <= 1'b0 ;
else
rxd_negedge_sig_flag <= rxd_negedge_sig ;
end
always @(posedge sys_clk or negedge sys_rst_n)
begin
if(sys_rst_n == 1'b0)
counter <= 16'b0 ;
else if(rxd_negedge_sig_flag == 1'b1 && counter > 16'd57200)
counter <= 16'b0 ;
else if(counter <= 16'd57200)
counter <= counter + 16'b1;
else ;
end
always @(posedge sys_clk or negedge sys_rst_n)
begin
if(sys_rst_n == 1'b0)
buff <= 8'b0;
else
begin
case(counter)
7800 : buff[0] <= rxd_din1 ;
13000 : buff[1] <= rxd_din1 ;
18200 : buff[2] <= rxd_din1 ;
23400 : buff[3] <= rxd_din1 ;
28600 : buff[4] <= rxd_din1 ;
33800 : buff[5] <= rxd_din1 ;
39000 : buff[6] <= rxd_din1 ;
44200 : buff[7] <= rxd_din1 ;
default: buff <= buff ;
endcase
end
end
always @(posedge sys_clk or negedge sys_rst_n)
begin
if(sys_rst_n == 1'b0)
LED <= 8'b0 ;
else
LED <= ~buff;
end
endmodule
|
|