verilog HDL 串口接受程序

module myuart_rece(
    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  50MHz分频成3.125MHz*/
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

 

//

转载于:https://www.cnblogs.com/Mungbohne/p/4374910.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值