mage100

位置环反馈手记2

0
阅读(32952)

 

 

划清模块,了解功能,理清思路,就开始。

先完成了以前我所的芯片结构,用fpga写了一个简单的逻辑控制程序。

芯片,AD2S80A。 等片子板子回来着手这次用的ad2s1210和ad2s1200。

 

资源图。

rtl 图,在planhaed里还有个rtl级的原理图,那个类似altrea的rtl图。这个点开每个模块能看到里面具体结构,结合planhead更深层理解里面和lut 资源分布。ise还不错。

 

tech级别图。不能放大了,具体可以分到每个逻辑块内部查看。

仿真图,直接用的ise自带的仿真器。

 

源代码:

欢迎拍砖

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date:    14:51:11 01/04/2012
// Design Name:    AD2S80A
// Module Name:    AD2S80A
// Project Name:   AD2S80A
// Target Devices: SPARTAN3E
// Tool versions:  ISE13.3
// Description:   
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module AD2S80A(clk,rst_n,
               data_AZ,//data_EL,data_POL,
     data,bs,inhibit_n,
     AZ_en,s_en_n//,EL_en,POL_en,
     //AZ_dir,EL_dir,POL_dir,
     //AZ_busy,EL_busy,POL_busy
    );
input clk;                                           //系统时钟
input rst_n;                                         //系统复位,低电平有效
//input sc1;                                           //
//input sc2;
input [15:0] data;                                    //输出的8位数据
//input AZ_busy,EL_busy,POL_busy;                      //忙信号,转换过程进行时的繁忙信号
input s_en_n;                                          //启动转换使能
output bs;                                           //字节输出使能,高为高位有效数据到1-8口,低为低字节有效数据到1-8口
output inhibit_n;                                   //数据输出至锁存器
output AZ_en;                                        //数据输出至io口
//output EL_en;
//output POL_en;
output [15:0] data_AZ;
//output [15:0] data_EL;
//output [15:0] data_POL;

//wire sc1 = 1'b1;
//wire sc2 = 1'b0;                                     //sc1=0,sc2=0 10位,sc1=0,sc2=1,12位,sc1=1,sc2=0,14位,sc1=1,sc2=1,16位
//---------------------------------------------------------------------------------------------------------------------------
reg [9:0] count;                                    //计数器 系统时钟为50mhz,一个周期为20ns
reg [6:0] state;
reg [15:0] data_temp;
reg inhibit_n_r;
//reg s_en_n_r;
reg AZ_en_r;
reg bs_r;
parameter IDLE =  7'b000_0001;
parameter START = 7'b000_0010;
parameter DO    = 7'b000_0100;
parameter RSTART = 7'b000_1000;
parameter ESTART = 7'b001_0000;
parameter BYTESTART = 7'b010_0000;
parameter READ = 7'b100_0000;                   //状态机参数
//系统时钟50MHz,1个周期20ns
 

always @(posedge clk or negedge rst_n)
       if(!rst_n) begin
      inhibit_n_r <= 1'b0;
    count <= 10'b0;
   
    state <= IDLE;
    end
       else begin
        case(state)
           IDLE: begin
            inhibit_n_r <= 1'b0;
        AZ_en_r <= 1'b1;
        bs_r <= 1'b0;
              if(s_en_n == 1'b0) 
               state <= START;
          else state <= IDLE;
        end
         START:begin
                    if(count == 10'd5)begin            //启动转换,inhibit拉高到busy高70-140ns
             state <= DO;
         count <= 10'b0;
         end
        else begin
             state <= START;
             count <= count + 1'b1;
         inhibit_n_r <= 1'b1;
         end
                    end     
          DO   :begin
        if(count ==  10'd20) begin     //转换期间,200ns-600ns 这个时间和转速有关
         state <= RSTART;
         count <= 10'b0;
         end
        else begin
         state <= DO;
         count <= count + 1'b1;
         inhibit_n_r <= 1'b1;
         end     
                    end
                  RSTART: begin                       //数据锁存,inhibit拉低600ns后数据稳定
         if(count == 10'd30)begin
            state <= ESTART;
          count <= 10'b0;
          end
         else begin
            state <= RSTART;
          count <= count + 1'b1;
          inhibit_n_r <= 1'b0;
          end
              end
                 ESTART: begin                      //数据输出至io口,en拉低后120ns 数据稳定
                 if(count == 10'd6)begin
             state <= BYTESTART;
           count <= 10'b0;
          end
           else begin
             state <= ESTART;
           count <= count + 1'b1;
           AZ_en_r <= 1'b0;
           end
               end
     BYTESTART: begin                         //字节模式选择,拉高bs 高位数据出现在1-8io上,拉高140ns后数据稳定
                if(count == 10'd7) begin
               state <= READ;
           count <= 10'd0;
           end
          else begin
             state <= BYTESTART;
           count <= count + 1'b1;
           bs_r <= 1'b1;
           end
          end
               READ:     begin                         //直接在数据口采集16位数据
                 if(count == 10'd10) begin
                 state <= IDLE;
            end
         else begin
              data_temp <= data;
            state <=  READ;
            count <= count + 1'b1;
            end
               end
               default: state <=  IDLE;
    endcase
           end
assign  data_AZ = data_temp;
assign  inhibit_n = inhibit_n_r;
assign  AZ_en = AZ_en_r;
assign  bs = bs_r;
//assign  s_en_n = s_en_n_r;
endmodule
 
附上ad2s80a的时序图
 
 
不得不说,
ise新加的planhead 还不太熟悉,不过几个图形界面很喜欢,很直观。
ise虽然没有A家的那么便利,不过对于底层更直观,后期优化起来更方便。本程序还未进行具体硬件验证,也没经过任何优化,欢迎看客指出不足。