uart串行通信接收接口(LED)Verilog代码Quartus仿真

名称:uart串行通信接收接口(LED)Verilog代码Quartus仿真(文末获取)

软件:Quartus

语言:Verilog

代码功能:

uart串行通信接收接口(LED)    基本要求:掌握RS232串口的协议,运

用DE2的串口进行接收PC的数据。波特率

为9600,8位数据位,无奇偶校验,一个停止位

调试助手”软件发送数据,DE2通过串口    硬件验证要求:在PC机通过“串行通信接收数据,完成接收数据后在LED上面进    行显示。

在完成基本要求的基础上,可以通过拨码开关来选择奇偶校验的类别。

1. 工程文件

2. 程序文件

3. 程序编译

4. 管脚分配

5. Testbench

6. 仿真图

部分代码展示:

//UART串口接收
module uart_recv(
    input  sys_clk,                  //系统时钟
    input             sys_rst_n,                //系统复位,低电平有效
input             sw,                       //奇偶校验控制切换
    output            parity_errors,            //校验错误指示
    input             uart_rxd,                 //UART接收端口
    output  reg       uart_done,                //接收一帧数据完成标志信号
    output  reg [7:0] uart_data                 //接收的数据
    );
    
//波特率9600
localparam BPS_CNT  = 5208;        //为得到指定波特率,50000000/9600=系统时钟频率/串口波特=5208
                                                //需要对系统时钟计数BPS_CNT次
//reg define
reg        uart_rxd_d0;
reg        uart_rxd_d1;
reg [15:0] clk_cnt;                             //系统时钟计数器
reg [ 3:0] rx_cnt;                              //接收数据计数器
reg        rx_flag;                             //接收过程标志信号
reg [ 7:0] rxdata;                              //接收数据寄存器
//wire define
wire       start_flag;
//*****************************************************
//**                    main code
//*****************************************************
//捕获接收端口下降沿(起始位),得到一个时钟周期的脉冲信号
assign  start_flag = uart_rxd_d1 & (~uart_rxd_d0);    
&&(clk_cnt == BPS_CNT/2))
            rx_flag <= 1'b0;                    //计数到停止位中间时,停止接收过程
        else
            rx_flag <= rx_flag;
    end
end
//进入接收过程后,启动系统时钟计数器与接收数据计数器
always @(posedge sys_clk or negedge sys_rst_n) begin         
    if (!sys_rst_n) begin                             
        clk_cnt <= 16'd0;                                  
        rx_cnt  <= 4'd0;
    end                                                      
    else if ( rx_flag ) begin                   //处于接收过程
            if (clk_cnt < BPS_CNT - 1) begin
                clk_cnt <= clk_cnt + 1'b1;
                rx_cnt  <= rx_cnt;
            end
            else begin
                clk_cnt <= 16'd0;               //对系统时钟计数达一个波特率周期后清零
                rx_cnt  <= rx_cnt + 1'b1;       //此时接收数据计数器加1
            end
        end
        else begin                              //接收过程结束,计数器清零
            clk_cnt <= 16'd0;
            rx_cnt  <= 4'd0;
        end
end
reg verify_bit=0;//校验
//根据接收数据计数器来寄存uart接收端口数据
always @(posedge sys_clk or negedge sys_rst_n) begin 
    if ( !sys_rst_n)  
        rxdata <= 7'd0;                                     
    else if(rx_flag)                            //系统处于接收过程
        if (clk_cnt == BPS_CNT/2) begin         //判断系统时钟计数器计数到数据位中间
            case ( rx_cnt )
             4'd1 : rxdata[0] <= uart_rxd_d1;   //寄存数据位最低位
             4'd2 : rxdata[1] <= uart_rxd_d1;
             4'd3 : rxdata[2] <= uart_rxd_d1;
             4'd4 : rxdata[3] <= uart_rxd_d1;
             4'd5 : rxdata[4] <= uart_rxd_d1;
             4'd6 : rxdata[5] <= uart_rxd_d1;
             4'd7 : rxdata[6] <= uart_rxd_d1;
 4'd8 : rxdata[7] <= uart_rxd_d1;
             4'd9 : verify_bit <= uart_rxd_d1;   //寄存数据位最高位
             default:;                                    
            endcase
        end
        else 
            rxdata <= rxdata;
    else
        rxdata <= 7'd0;
end
//数据接收完毕后给出标志信号并寄存输出接收到的数据
reg verify_led=0;
assign parity_errors=verify_led;
always @(posedge sys_clk or negedge sys_rst_n) begin        
    if (!sys_rst_n) begin
        uart_data <= 7'd0;                               
        uart_done <= 1'b0;
  verify_led<=0;
    end
    else if(rx_cnt == 4'd10) begin               //接收数据计数器计数到停止位时 
if(sw==1'b1) //奇偶校验控制
  if(verify_bit!=^rxdata)begin 
  uart_data <= rxdata;                    //寄存输出接收到的数据
  uart_done <= 1'b1;                      //并将接收完成标志位拉高
  verify_led<=0;
     end
  else begin
  uart_data <= rxdata;                                   
  uart_done <= 1'b0; 
  verify_led<=1;//检验错误led灯亮  
  end
else //奇偶校验控制切换
  if(verify_bit==^rxdata)begin 
  uart_data <= rxdata;                    //寄存输出接收到的数据
  uart_done <= 1'b1;                      //并将接收完成标志位拉高
  verify_led<=0;
     end
  else begin
  uart_data <= rxdata;                                   
  uart_done <= 1'b0; 
           verify_led<=1;//检验错误led灯亮  
  end
    end
    else begin
        uart_data <= uart_data;                                   
        uart_done <= 1'b0; 
    end    
end
endmodule
完整代码

 扫描文章末尾的公众号二维码

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值