OpenEdv-开源电子网

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

简单的计数程序输出结果总是不对,求大牛帮忙

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2018-4-16
在线时间
8 小时
发表于 2019-7-13 17:09:41 | 显示全部楼层 |阅读模式
25金钱
我的程序是自己编写第一个通讯端口,其中FPGAtoAD_state是数据输出端口,PGAtoAD_clk_in是时钟输入端口,FPGAtoAD_data是数据输入端口,位宽为8位,FPGAtoAD_clk_out是时钟输出端口程序的主要流程如下:一开始是向上位机传一次数据,首先FPGAtoAD_clk_out拉低,等待上位机的PGAtoAD_clk_in时钟信号拉低表示上位机准备就绪,然后FPGAtoAD_clk_out置高,等待上位机的PGAtoAD_clk_in时钟信号置高就表示上位机读取成功,然后开始上位机向FPGA开始传输66次数据,每次传输以上位机的PGAtoAD_clk_in时钟信号拉低,然后FPGAtoAD_clk_out拉低表示准备好接受数据,之后PGAtoAD_clk_in时钟信号置高,等FPGAtoAD_clk_out也置高表示一次数据传输完成,反复66次
现在的问题就是FPGA计数有问题,用示波器看了,要不是到64次就不响应,要不就是中间丢两个数据,又或者是传输66次之后还在等待传输,有时偶尔能正常传输几次,但很快就又会漏数据。
求各位大牛帮我看看程序,看问题在哪
不胜感谢,小弟这里只有29个币,尽数奉上
系统时钟频率为50 MHz
具体程序如下
  1. /*******************************************
  2.                                                 FPGAtoAD
  3.         *******************************************/
  4.        
  5.         reg        [1:0]                FPGAtoAD_rw;
  6.         reg        [7:0]        n;
  7.         reg        [7:0]                x;
  8.         parameter outime=50_000_000;
  9.         //reg ADCdata
  10.         /*
  11.         //
  12.         //FPGA_R
  13.         //
  14.         */
  15.        
  16. //        wire        FPGAtoAD_clk_out_w;
  17. //        reg        FPGAtoAD_clk_out_r;
  18. //       
  19. //        assign FPGAtoAD_clk_out= FPGAtoAD_rw ? FPGAtoAD_clk_out_r:FPGAtoAD_clk_out_w;
  20.        
  21.        
  22.         reg        [3:0] FPGA_r_state;
  23.        
  24.         parameter R_idel        = 4'b0000;
  25.         parameter R_start        = 4'b0001;
  26.         parameter R_GetD        = 4'b0011;
  27.         parameter R_WaitD        = 4'b0010;
  28.         parameter R_over        = 4'b0110;
  29.         parameter R_Busy        = 4'b1000;
  30.        
  31.         /*
  32.         //
  33.         //FPGA_W
  34.         //
  35.         */
  36.        
  37.         reg         [3:0] FPGA_w_state;
  38.        
  39.         parameter W_idel        = 4'b0000;
  40.         parameter w_start        = 4'b0001;
  41.         parameter w_adbusy= 4'b1000;
  42.         parameter w_sclk_L= 4'b0011;
  43.         parameter w_buftim= 4'b0010;
  44.         parameter w_sdata        = 4'b0110;
  45.         parameter w_sover = 4'b0111;
  46.        
  47.         /*
  48.         //
  49.         //
  50.         //
  51.         */
  52.        
  53.         reg [7:0] inset_time;
  54.         reg [7:0] sent_time;
  55.        
  56.         always [url=home.php?mod=space&uid=95564]@[/url] (posedge sys_clk or negedge sys_rst)
  57.         if(!sys_rst)
  58.                 begin
  59.                 FPGAtoAD_rw <= 2'b00;
  60.                 inset_time<=8'd0;
  61.                 sent_time<=8'd0;
  62.                 end
  63.         else if(FPGAtoAD_rw == 2'b11)
  64.                 begin
  65.                 if(inset_time>=8'd100)
  66.                         begin
  67.                         FPGAtoAD_rw <= 2'b00;
  68.                         inset_time<=8'd0;
  69.                         end
  70.                 else
  71.                         inset_time<=inset_time+1'b1;
  72.                 end
  73.         else if((FPGA_r_state == R_over)&(FPGAtoAD_rw == 2'b10))
  74.                 begin
  75.                 FPGAtoAD_rw <= 2'b11;
  76.                 sent_time<=sent_time+1'b1;
  77.                 end
  78.         else if((FPGA_w_state == w_sover)&(FPGAtoAD_rw == 2'b01))
  79.                 FPGAtoAD_rw <= 2'b10;
  80.         else if(FPGAtoAD_rw == 2'b00)
  81.                 FPGAtoAD_rw <= 2'b01;
  82.         else ;

  83.                
  84.         reg [7:0] pre_state;
  85.        
  86.         reg [25:0] to_cnt;                                //timeout
  87.        
  88.         wire [7:0] n_add;
  89.        
  90.         reg [7:0] n_buf;
  91.        
  92.         assign n_add=n+1'b1;

  93.        
  94.         always @ (posedge sys_clk or negedge sys_rst)
  95.         if(!sys_rst)
  96.                 begin
  97.                 FPGA_r_state                <= R_idel;
  98.                 FPGA_w_state                <= W_idel;
  99.                 //FPGAtoAD_clk_out        <= 1'b1;
  100.                 n                                                <= 8'h0;
  101.                 to_cnt                                <= 26'd0;
  102.                 pre_state                        <= 8'd0;
  103.                 FPGAtoAD_clk_out        <= 1'b1;
  104.                 FPGAtoAD_state                <= 5'd0;
  105.                 n_buf                                        <= 8'h0;
  106.                
  107.                 for(x=8'd0;x<8'd66;x=x+1'b1)
  108.                         ADCdata[x] <= 8'd0;
  109.                 end
  110.         else if(FPGAtoAD_rw == 2'b10)
  111.                 begin
  112.                
  113.                 case(FPGA_r_state)
  114.                         R_idel:
  115.                                 if(!FPGAtoAD_clk_in)
  116.                                         begin
  117.                                         n <= 8'h0;
  118.                                         FPGA_r_state <= R_start;
  119.                                         to_cnt <= 26'd0;
  120.                                         FPGAtoAD_clk_out        <= 1'b1;
  121.                                         end
  122.                                 else
  123.                                         FPGA_r_state <= R_idel;
  124.                                        
  125.                         R_start:
  126.                                 if(FPGAtoAD_clk_in)
  127.                                         begin
  128.                                         FPGAtoAD_clk_out        <= 1'b0;
  129.                                         FPGA_r_state <= R_GetD;
  130.                                         to_cnt <= 26'd0;
  131.                                         end
  132.                                 else        if(to_cnt<=26'd1000)
  133.                                         begin
  134.                                         FPGAtoAD_clk_out        <= 1'b0;
  135.                                         FPGA_r_state <= R_start;
  136.                                         to_cnt<= to_cnt +1'b1;
  137.                                         end
  138.                                 else
  139.                                         begin
  140.                                         to_cnt <= 26'd0;
  141.                                         FPGA_r_state <= R_Busy;
  142.                                         pre_state        <=R_start;
  143.                                         end
  144.                                        
  145.                                        
  146.                         R_GetD:
  147.                                 begin
  148.                                 n_buf <= n_add;
  149.                                 FPGAtoAD_clk_out        <= 1'b1;
  150.                                

  151.                                 ADCdata[n] <= FPGAtoAD_data;

  152.                                
  153.                                 if(n == 8'h41)
  154.                                         begin
  155.                                         n <= 8'h0;
  156.                                         FPGA_r_state <= R_over;
  157.                                         end
  158.                                 else
  159.                                         begin
  160.                                         FPGA_r_state <= R_WaitD;
  161.                                         end
  162.                                
  163.                                 end
  164.                                
  165.                         R_WaitD:
  166.                                 if(!FPGAtoAD_clk_in)
  167.                                         begin
  168.                                         n<=n_buf;
  169.                                         FPGA_r_state <= R_start;
  170.                                         to_cnt <= 26'd0;
  171.                                        
  172.                                         end
  173.                                 else if(to_cnt<=26'd1000)
  174.                                         begin
  175.                                         to_cnt<= to_cnt +1'b1;
  176.                                         FPGA_r_state <= R_WaitD;
  177.                                         end
  178.                                 else
  179.                                         begin
  180.                                         to_cnt <= 26'd0;
  181.                                         FPGA_r_state <= R_Busy;
  182.                                         pre_state        <=R_WaitD;
  183.                                         end
  184.                                        
  185.                         R_Busy: FPGAtoAD_clk_out        <= 1'b1;//FPGA_r_state <= R_over;
  186.                                        
  187.                         R_over:
  188.                                
  189.                                 begin
  190.                                 n <= 8'h0;
  191.                                 to_cnt <= 26'd0;
  192.                                 FPGAtoAD_clk_out        <= 1'b1;
  193.                                 end
  194.                
  195.                         default:
  196.                                 FPGA_r_state <= R_idel;
  197.                
  198.                 endcase
  199.                
  200.                 end
  201.         else        if(FPGAtoAD_rw == 2'b01)
  202.                 begin
  203.                
  204.                 case(FPGA_w_state)
  205.                
  206.                         W_idel:       
  207.                                 begin
  208.                                 FPGAtoAD_clk_out        <= 1'b1;
  209.                                 FPGAtoAD_state                <= 5'd0;
  210.                                 FPGA_w_state <= w_start;
  211.                                 end
  212.                        
  213.                         w_start:                                                                                //确认AD模块空闲
  214.                                 begin
  215.                                 FPGAtoAD_clk_out        <= 1'b1;
  216.                                 FPGAtoAD_state                <= 5'd0;
  217.                                
  218.                                 if(to_cnt< 26'd1000)                                                        //ensure AD MOD free
  219.                                         begin
  220.                                         if(!FPGAtoAD_clk_in)
  221.                                                 begin
  222.                                                 FPGA_w_state <= w_adbusy;
  223.                                                 pre_state        <=w_start;
  224.                                                 to_cnt <= 26'd0;
  225.                                                 end
  226.                                         else
  227.                                                 to_cnt<=to_cnt+1'b1;
  228.                                         end
  229.                                 else
  230.                                         begin
  231.                                         FPGA_w_state <= w_sclk_L;
  232.                                         to_cnt <= 26'd0;
  233.                                         end
  234.                                 end
  235.                                
  236.                                
  237.                         w_adbusy:
  238.                                 FPGA_w_state <= W_idel;
  239.                        
  240.                         w_sclk_L:                                                                        //确认AD模块空闲后拉低FPGA写时钟
  241.                                 begin                                                                                //并等待AD模块时钟拉低
  242.                                
  243.                                 FPGAtoAD_clk_out        <= 1'b0;
  244.                                 FPGAtoAD_state                <= FPGAtoAD_commd;
  245.                                
  246.                                 if(!FPGAtoAD_clk_in)                                        //AD模块时钟拉低后等待数据读取
  247.                                         begin
  248.                                         //FPGA_w_state <= w_sdata;
  249.                                         to_cnt <= 26'd0;
  250.                                         FPGA_w_state <= w_buftim;                //
  251.                                         end
  252.                                 else if(to_cnt<outime)
  253.                                         begin
  254.                                         FPGA_w_state <= w_sclk_L;
  255.                                         to_cnt <= to_cnt+1'b1;
  256.                                         end
  257.                                 else
  258.                                         begin
  259.                                         FPGA_w_state <= w_adbusy;
  260.                                         pre_state        <=w_sclk_L;
  261.                                         to_cnt <= 26'd0;
  262.                                         end
  263.                                        
  264.                                 end
  265.                                
  266.                         w_buftim:
  267.                                
  268.                                 begin
  269.                                 FPGAtoAD_clk_out        <= 1'b0;
  270.                                 FPGAtoAD_state                <= FPGAtoAD_commd;
  271.                                 FPGA_w_state <= w_sdata;
  272.                                 end
  273.                                
  274.                         w_sdata:
  275.                                 begin
  276.                                
  277.                                 FPGAtoAD_clk_out        <= 1'b1;
  278.                                 FPGAtoAD_state                <= FPGAtoAD_commd;
  279.                                
  280.                                 if(FPGAtoAD_clk_in)
  281.                                         begin
  282.                                         FPGA_w_state <= w_sover;
  283.                                         to_cnt <= 26'd0;
  284.                                         end
  285.                                 else if(to_cnt<26'd1010)
  286.                                         begin
  287.                                         FPGA_w_state <= w_sdata;
  288.                                         to_cnt <= to_cnt+1'b1;
  289.                                         end
  290.                                 else
  291.                                         begin
  292.                                         FPGA_w_state <= w_adbusy;
  293.                                         pre_state        <=w_sdata;
  294.                                         to_cnt <= 26'd0;
  295.                                         end
  296.                                 end
  297.                                
  298.                         w_sover:
  299.                                 begin
  300.                                 to_cnt <= 26'd0;
  301.                                 FPGAtoAD_clk_out        <= 1'b1;
  302.                                 FPGAtoAD_state                <= 5'd0;
  303.                                 n                                                <= 8'h0;
  304.                                 end
  305.                                 //FPGA_w_state <= W_idel;
  306.                
  307.                         default:
  308.                                
  309.                                 begin
  310.                                 FPGAtoAD_clk_out        <= 1'b1;
  311.                                 FPGAtoAD_state                <= 5'd0;
  312.                                 FPGA_w_state <= W_idel;
  313.                                 end
  314.                
  315.                 endcase
  316.                        
  317.                 end
  318.         else
  319.                 begin
  320.                 FPGA_r_state                <= R_idel;
  321.                 FPGA_w_state                <= W_idel;
  322.                 n                                                <= 8'h0;
  323.                 to_cnt <= 26'd0;
  324.                 FPGAtoAD_clk_out        <= 1'b1;
  325.                 FPGAtoAD_state                <= 5'd0;
  326.                 end
复制代码


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2018-4-16
在线时间
8 小时
 楼主| 发表于 2019-7-13 17:18:50 | 显示全部楼层
补充说明一下:
计数的是n
其实原来的计数我是简单的通过n<= n+1'b1;
这个语句来实现的,但是计数有问题我才改成现在这样的
原来的程序没有
wire [7:0] n_add;
reg [7:0] n_buf;
这两个参数,但是计数还是有问题
除此之外,我写的部分程序利用计数来实现时序控制,有时也是会有时序抖动的问题,估计问题也是出在计数输出结果不对。
求大牛指点
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2019-7-10
在线时间
1 小时
发表于 2019-7-13 23:06:32 | 显示全部楼层
您可以把工程文件上传大家看看
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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