位置环反馈手记2
0赞
划清模块,了解功能,理清思路,就开始。
先完成了以前我所的芯片结构,用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 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; //状态机参数
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
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 inhibit_n = inhibit_n_r;
assign AZ_en = AZ_en_r;
assign bs = bs_r;
//assign s_en_n = s_en_n_r;
endmodule

