OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7301|回复: 3

[ALTERA] 正点原子uart串口实验求助

[复制链接]

2

主题

2

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2019-7-27
在线时间
5 小时
发表于 2020-1-29 10:52:18 | 显示全部楼层 |阅读模式
3金钱
编写完接受程序后,把接受到的信号写到对应的寄存器中,然后不知道为什么就会清零。这是我写的uart接受的代码:
module RE(
input clk,
input rst_n,
input uart_rxd,
output reg[7:0]data,
output reg uartdone
);
parameter CLK_FREQ=50_000_000;
parameter BPS     =115200;
localparam CNT_BPS =CLK_FREQ/BPS; //一帧数据对应多少个时钟周期
reg[7:0] uart_rxd0;
reg[7:0] uart_rxd1;
reg[11:0] cnt_bps;
reg[3:0]  cnt_data;
reg  read_ctr;
wire flag;


always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
  begin
   uart_rxd0<=8'd0;
   uart_rxd1<=8'd0;
  end
else
  begin
   uart_rxd0 <= uart_rxd;
   uart_rxd1 <= uart_rxd0;
  end
end
assign flag = (~uart_rxd0) & uart_rxd1;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
   cnt_bps <= 12'b0;
else
  if(read_ctr &&(cnt_bps<12'd22))
    cnt_bps <= cnt_bps + 1'b1;
else
  cnt_bps <= 12'b0;   
end
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
   cnt_data <= 4'b0;
else if(read_ctr)
   begin
    if(cnt_bps == (12'd22))
     begin
      if (cnt_data < 4'd10)
       cnt_data <= cnt_data +1;
      else
       cnt_data <= 4'd0;      
     end
    else
     cnt_data <= cnt_data;
   end
  else
   cnt_data <= 4'd0;
end

always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
  begin
   read_ctr <= 1'd0;
   data <= 8'd0;
  end
else
  begin
   case(read_ctr)
   1'd0: begin
           uartdone <= 1'd0;
          if(flag)
           read_ctr <= 1'd1;
          else
           read_ctr <= read_ctr;
         end
   1'd1: begin
            case(cnt_data)
            4'd0 :data    <= 8'd0;
            4'd1 :data[0] <= uart_rxd;
            4'd2 :data[1] <= uart_rxd;
            4'd3 :data[2] <= uart_rxd;
            4'd4 :data[3] <= uart_rxd;
            4'd5 :data[4] <= uart_rxd;
            4'd6 :data[5] <= uart_rxd;
            4'd7 :data[6] <= uart_rxd;
            4'd8 :data[7] <= uart_rxd;
            4'd9 : uartdone <= 1'd1;
            4'd10:begin
                   read_ctr <= 1'd0;
                   uartdone <= 1'd0;
                  end
            default:;
            endcase
          end
      endcase
  end
end
endmodule
它的目的是接受到uart—rxd的信号后把它写到data寄存器里,但不知道为什么接收完之后寄存器会清零,下面是用singal tap 2看到的信号图
屏幕截图(1).png

最佳答案

查看完整内容[请看2#楼]

你这种程序的写法很容易出现亚稳态,导致采集错误的数据。应该在接收每一位数据的中间位置采集一次uart_rxd即可。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1979

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5520
金钱
5520
注册时间
2018-10-21
在线时间
1561 小时
发表于 2020-1-29 10:52:19 | 显示全部楼层
你这种程序的写法很容易出现亚稳态,导致采集错误的数据。应该在接收每一位数据的中间位置采集一次uart_rxd即可。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165186
金钱
165186
注册时间
2010-12-1
在线时间
2106 小时
发表于 2020-2-1 01:21:31 | 显示全部楼层
帮顶
回复

使用道具 举报

8

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2017-1-14
在线时间
48 小时
发表于 2020-2-20 10:08:20 | 显示全部楼层
QinQZ 发表于 2020-1-29 10:52
你这种程序的写法很容易出现亚稳态,导致采集错误的数据。应该在接收每一位数据的中间位置采集一次uart_rxd ...

你是高手,以后要多向你学习。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-10-3 09:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表