码迷,mamicode.com
首页 > 其他好文 > 详细

verilog HDL 串口接受程序

时间:2015-03-28 23:01:39      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

module myuart(
input Gclk, //system clock
input rst_n, //glabol reset signal
input rx, //serical data in
output reg tx, //serical data out
output reg DataReady, //a complete byte has been received
output reg[7:0] DataReceived, //Bytes received
output reg gnd=1‘b0
);

/* general sample clock*/
reg[7:0] count;
reg clk16x; //sample clock
always@(posedge Gclk or posedge rst_n)
if(rst_n)
begin
count<=8‘d0;
clk16x<=1‘b0;
end
else if(count>=8‘d125)
begin
count<=8‘d0;
clk16x <= ~clk16x;
end
else count<=count+1‘b1;

/*how to find the negedge*/
reg trigger_r0;
wire neg_tri;
always@(posedge clk16x or posedge rst_n)
begin
if(rst_n) trigger_r0<=1‘b0;
else trigger_r0<=rx;
end
assign neg_tri = trigger_r0 & ~rx;

/* counter control*/
reg cnt_en;
always@(posedge Gclk or posedge rst_n)
begin
if(rst_n) cnt_en<=1‘b0;
else if(neg_tri==1‘b1) cnt_en<=1‘b1;
else if(cnt==8‘d152) cnt_en<=1‘b0;
end

/* counter module*/
reg[8:0] cnt;
always@(posedge clk16x or posedge rst_n)
begin
if(rst_n) cnt<=8‘d0;
else if(cnt_en) cnt<=cnt+1‘b1;
else cnt<=8‘d0;
end
/* receive module*/
reg StopBit_r;
always@(posedge clk16x or posedge rst_n)
begin
if(rst_n)
begin
DataReceived<=8‘b0;
tx <= 1‘b1;
end
else if(cnt_en)
case(cnt)
9‘d24: DataReceived[0] <= rx;
9‘d40: DataReceived[1] <= rx;
9‘d56: DataReceived[2] <= rx;
9‘d72: DataReceived[3] <= rx;
9‘d88: DataReceived[4] <= rx;
9‘d104: DataReceived[5] <= rx;
9‘d120: DataReceived[6] <= rx;
9‘d136: DataReceived[7] <= rx;

endcase
end

always@(posedge Gclk or posedge rst_n)
begin
if(rst_n) DataReady<=1‘b1;
else if(cnt>=8‘d152) DataReady<=1‘b0;
else DataReady<=1‘b1;
end
endmodule

verilog HDL 串口接受程序

标签:

原文地址:http://www.cnblogs.com/Mungbohne/p/4374910.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!