vivado工程编写的双Dout线路的AD7606串行输出,串口打印八通道数据

1 篇文章 0 订阅
1 篇文章 0 订阅

AD7606续上一篇,硬件介绍方面就简单略过。
相关时序图参考如下:
在这里插入图片描述
在这里插入图片描述

串行输出接线如下:(此图少了DB8接数据线)
在这里插入图片描述
实物接线如下:
在这里插入图片描述

代码引脚定义如下:除了定义的引脚外,记得SER引脚接高电平,可以接FPGA的3.3V或5.0V。此外AD7606模块还需要供电5V。
在这里插入图片描述
程序组成同样,AD7606_UART为顶层,包含两个子模块。
在这里插入图片描述
AD7606_UART代码:

`timescale 1ns / 1ps
module AD7606_UART(
clk     ,
rst_n   ,
ad_os ,
ad_busy ,
ad_dataA,
ad_dataB,
ad_rst  ,
ad_cvAB ,
ad_cs_n ,
ad_sclk,

uart_tx
    );
     input            clk    ;  // 模块时钟输入 _ 50MHz
    input            rst_n  ;  // 输入复位(低电平有效)
    input            ad_busy ;  // AD忙信号
    input            ad_dataA;  // AD_DB7,SPI_MISO模式逐位输出通道1-通道4 _ 双Dout线路
    input            ad_dataB;  // AD_DB8,SPI_MISO模式逐位输出通道5-通道8 _ 双Dout线路
   output        uart_tx;
    output [2:0]  ad_os   ;  // AD过采样模式选择引脚

    output    ad_rst  ;  // AD芯片复位(高电平有效),器件上电后应先复位50ns以上 
    output    ad_cvAB ;  // AD_启动AD转换控制信号,(CONVST A + CONVST B)接到一块使用
    output    ad_cs_n ;  // AD片选信号(低电平有效)_ SPI CS_N
    output    ad_sclk ;  // AD串行时钟线(SPI模式) _ SPI SCLK _ 设置为12.5MHz
    // AD转换数据输出             
   wire ad_done ;  // AD所有通道转换完输出一次,持续一时钟周期_50MHz
   wire[15:0] ad_ch1  ;  // AD第1通道输出数据
   wire[15:0] ad_ch2  ;  // AD第2通道输出数据
   wire[15:0] ad_ch3  ;  // AD第3通道输出数据
   wire[15:0] ad_ch4  ;  // AD第4通道输出数据
   wire[15:0] ad_ch5  ;  // AD第5通道输出数据
   wire[15:0] ad_ch6  ;  // AD第6通道输出数据
   wire[15:0] ad_ch7  ;  // AD第7通道输出数据
   wire[15:0] ad_ch8   ;  // AD第8通道输出数据
 wire[15:0] data1     ;
 wire[15:0] data2     ;
 wire[15:0] data3     ;
 wire[15:0] data4     ;
 wire[15:0] data5     ;
 wire[15:0] data6     ;
 wire[15:0] data7     ;
 wire[15:0] data8     ;
   AD7606_drive AD7606_drive(
    . clk (clk)    ,  // 模块时钟输入 _ 50MHz
    . rst_n   (rst_n   ),  // 输入复位(低电平有效)
    . ad_busy (ad_busy),  // AD忙信号
    . ad_dataA(ad_dataA),  // AD_DB7,SPI_MISO模式逐位输出通道1-通道4 _ 双Dout线路
    . ad_dataB(ad_dataB),  // AD_DB8,SPI_MISO模式逐位输出通道5-通道8 _ 双Dout线路
    . ad_os   (ad_os   ),  // AD过采样模式选择引脚
    . ad_rst  (ad_rst  ),  // AD芯片复位(高电平有效),器件上电后应先复位50ns以上 
    . ad_cvAB (ad_cvAB ),  // AD_启动AD转换控制信号,(CONVST A + CONVST B)接到一块使用
    . ad_cs_n (ad_cs_n ),  // AD片选信号(低电平有效)_ SPI CS_N
    . ad_sclk (ad_sclk ),  // AD串行时钟线(SPI模式) _ SPI SCLK _ 设置为12.5MHz
    . ad_done (ad_done ),  // AD所有通道转换完输出一次,持续一时钟周期_50MHz
    . ad_ch1  (ad_ch1  ),  // AD第1通道输出数据
    . ad_ch2  (ad_ch2  ),  // AD第2通道输出数据
    . ad_ch3  (ad_ch3  ),  // AD第3通道输出数据
    . ad_ch4  (ad_ch4  ),  // AD第4通道输出数据
    . ad_ch5  (ad_ch5  ),  // AD第5通道输出数据
    . ad_ch6  (ad_ch6  ),  // AD第6通道输出数据
    . ad_ch7  (ad_ch7  ),  // AD第7通道输出数据
    . ad_ch8  (ad_ch8  )   // AD第8通道输出数据
    );
    
    
   uart_test uart_test(
        .sys_clk(clk),       //system clock 50Mhz on board
        .rst_n(rst_n),        //reset ,low active
    	.data1 (ad_ch1)  ,
        .data2 (ad_ch2)  ,
        .data3 (ad_ch3)  ,
        .data4 (ad_ch4)  ,
        .data5 (ad_ch5)  ,
        .data6 (ad_ch6)  ,
        .data7 (ad_ch7)  ,
        .data8 (ad_ch8)  ,
    	.uart_tx(uart_tx)
    ); 
endmodule

AD7606_drive代码:

///
// Module Name: AD7606_drive
// Description: AD7606_SPI模式,驱动模块
//              输入时钟频率:50MHz      SPI_SCLK:12.5MHz
//              设置采样频率约为2Ksps(每采样完成一次停一会儿)_对应50MHz频率下6250个时钟周期
///

module AD7606_drive(
 clk     ,  // 模块时钟输入 _ 50MHz
 rst_n   ,  // 输入复位(低电平有效)
 ad_busy ,  // AD忙信号
 ad_dataA,  // AD_DB7,SPI_MISO模式逐位输出通道1-通道4 _ 双Dout线路
 ad_dataB,  // AD_DB8,SPI_MISO模式逐位输出通道5-通道8 _ 双Dout线路

 ad_os   ,  // AD过采样模式选择引脚
 ad_rage ,  // AD模拟输入范围选择, 1:+-10V  0:+-5V
 ad_rst  ,  // AD芯片复位(高电平有效),器件上电后应先复位50ns以上 
 ad_cvAB ,  // AD_启动AD转换控制信号,(CONVST A + CONVST B)接到一块使用
 ad_cs_n ,  // AD片选信号(低电平有效)_ SPI CS_N
 ad_sclk ,  // AD串行时钟线(SPI模式) _ SPI SCLK _ 设置为12.5MHz

 ad_done ,  // AD所有通道转换完输出一次,持续一时钟周期_50MHz
 ad_ch1  ,  // AD第1通道输出数据
 ad_ch2  ,  // AD第2通道输出数据
 ad_ch3  ,  // AD第3通道输出数据
 ad_ch4  ,  // AD第4通道输出数据
 ad_ch5  ,  // AD第5通道输出数据
 ad_ch6  ,  // AD第6通道输出数据
 ad_ch7  ,  // AD第7通道输出数据
 ad_ch8     // AD第8通道输出数据
    );
   input            clk     ;// 模块时钟输入 _ 50MHz
    input            rst_n   ; // 输入复位(低电平有效)
    input            ad_busy ; // AD忙信号
    input            ad_dataA; // AD_DB7,SPI_MISO模式逐位输出通道1-通道4 _ 双Dout线路
    input            ad_dataB; // AD_DB8,SPI_MISO模式逐位输出通道5-通道8 _ 双Dout线路
                           
    output    [2:0]  ad_os   ; // AD过采样模式选择引脚
    output           ad_rage ; // AD模拟输入范围选择, 1:+-10V  0:+-5V
    output reg       ad_rst  ; // AD芯片复位(高电平有效),器件上电后应先复位50ns以上 
    output reg       ad_cvAB ; // AD_启动AD转换控制信号,(CONVST A + CONVST B)接到一块使用
    output reg       ad_cs_n ; // AD片选信号(低电平有效)_ SPI CS_N
    output reg       ad_sclk ; // AD串行时钟线(SPI模式) _ SPI SCLK _ 设置为12.5MHz
    // AD转换数据输出              ;
    output reg       ad_done ; // AD所有通道转换完输出一次,持续一时钟周期_50MHz
    output reg[15:0] ad_ch1  ; // AD第1通道输出数据
    output reg[15:0] ad_ch2  ; // AD第2通道输出数据
    output reg[15:0] ad_ch3  ; // AD第3通道输出数据
    output reg[15:0] ad_ch4  ; // AD第4通道输出数据
    output reg[15:0] ad_ch5  ; // AD第5通道输出数据
    output reg[15:0] ad_ch6  ; // AD第6通道输出数据
    output reg[15:0] ad_ch7  ; // AD第7通道输出数据
    output reg[15:0] ad_ch8  ; // AD第8通道输出数据
// reg define    
reg [15:0] init_cnt      ;  // 上电AD复位计数器  
reg [15:0] state         ;  // 状态机
reg [15:0] state_cnt     ;  // 状态机中的等待计数器
reg [ 1:0] cnt_spi_clk   ;  // 分频计数器,0-3循环计数
reg        cnt_spi_clk_en;  // cnt_spi_clk计数器使能信号
reg        spi_start     ;  // SPI接收计数循环开始,创造SCLK

// parameter define 
parameter AD_IDLE  = 16'b0000_0000_0000_0001;  // 初始状态
parameter AD_CVAB  = 16'b0000_0000_0000_0010;  // AD全部通道开始转换状态
parameter AD_BUSY1 = 16'b0000_0000_0000_0100;  // 等待一段时间,待busy信号为高电平状态
parameter AD_BUSY2 = 16'b0000_0000_0000_1000;  // 然后等待busy信号下降沿(为低电平)状态
parameter AD_CSN   = 16'b0000_0000_0001_0000;  // 拉低AD(SPI)_CS_N片选信号
parameter AD_CH1_5 = 16'b0000_0000_0010_0000;  // 读取通道1和通道5的AD转换值
parameter AD_CH2_6 = 16'b0000_0000_0100_0000;  // 读取通道2和通道6的AD转换值
parameter AD_CH3_7 = 16'b0000_0000_1000_0000;  // 读取通道3和通道7的AD转换值
parameter AD_CH4_8 = 16'b0000_0001_0000_0000;  // 读取通道4和通道8的AD转换值 
parameter AD_STOP  = 16'b0000_0010_0000_0000;  // 读取结束 
 
/* `````````````````````````````````````````````````````*/
/* ``````````````````````main code``````````````````````*/
/* `````````````````````````````````````````````````````*/
 
assign ad_os   = 3'b000;  // 不使用AD过采样   

// cnt_spi_clk_en:cnt_spi_clk计数器使能信号
always@(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        cnt_spi_clk_en <= 1'b0;
    else if(state == AD_STOP)   // 结束状态,拉低使能信号,停止cnt_spi_clk的计数
        cnt_spi_clk_en <= 1'b0;
    else if(spi_start == 1'b1)  // SPI_CS_N拉低,开始SPI数据接收,拉高cnt_spi_clk计数使能信号
        cnt_spi_clk_en <= 1'b1;
end      
// 分频计数器,0-3循环计数
always@(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        cnt_spi_clk <= 2'd0;
    else if(cnt_spi_clk_en == 1'b1)
        cnt_spi_clk <= cnt_spi_clk + 1'b1;
    else if(cnt_spi_clk_en == 1'b0)
        cnt_spi_clk <= 2'd0;    
end    
    
// 上电先复位_拉高AD芯片一段时间  
always@(posedge clk or negedge rst_n)   
begin    
    if(!rst_n) begin
        init_cnt <= 16'd0;
        ad_rst   <= 1'b1 ;  // 上电首先把AD芯片拉高复位
    end    
    else if(init_cnt < 16'hffff) begin
        init_cnt <= init_cnt + 1'b1;    
        ad_rst   <= 1'b1           ;  
    end
    else
        ad_rst   <= 1'b0           ;  // 一段时间后,AD芯片复位结束
end      
 
// AD转换开始 + AD_SPI读取数据状态机  
always@(posedge clk or negedge rst_n) 
begin
    if(!rst_n) begin
        state     <= AD_IDLE;
        ad_cvAB   <= 1'b1   ;
        ad_cs_n   <= 1'b1   ;
        spi_start <= 1'b0   ;
        state_cnt <= 16'd0  ;
        ad_ch1    <= 16'd0  ;
        ad_ch2    <= 16'd0  ;
        ad_ch3    <= 16'd0  ;
        ad_ch4    <= 16'd0  ;
        ad_ch5    <= 16'd0  ;
        ad_ch6    <= 16'd0  ;
        ad_ch7    <= 16'd0  ;
        ad_ch8    <= 16'd0  ;
        ad_done   <= 1'b0   ;
    end
    else case(state)
        AD_IDLE:  begin
            ad_cvAB   <= 1'b1;
            ad_cs_n   <= 1'b1;
            ad_done   <= 1'b0;
            if(state_cnt == 16'd6000) begin  // 采样频率2KHz:为6250个时钟周期(50MHz)采集一次,采集完一次约等6000个时钟周期,再进行下一次采集
                state_cnt <= 16'd0  ;
                state     <= AD_CVAB;    
            end
            else
                state_cnt <= state_cnt + 1'b1;
        end
        AD_CVAB:  begin
            if(state_cnt == 16'd2) begin
                state_cnt <= 16'd0   ;
                state     <= AD_BUSY1;
                ad_cvAB   <= 1'b1    ;  // 间隔一段时间后拉高AD_CONVSTA+CONVSTB
            end
            else begin
                state_cnt <= state_cnt + 1'b1;
                ad_cvAB   <= 1'b0;      // 拉低AD_CONVSTA+CONVSTB,启动采集
            end
        end
        AD_BUSY1: begin 
            if(state_cnt == 16'd5) begin  // 等5个时钟周期,待busy信号为高
                state_cnt <= 16'd0   ;
                state     <= AD_BUSY2;    
            end
            else
                state_cnt <= state_cnt + 1'b1;       
        end 
        AD_BUSY2:  begin  // 等待busy信号为低
            if(ad_busy == 1'b0) 
                state <= AD_CSN; 
        end
        AD_CSN:    begin
            ad_cs_n   <= 1'b0    ;  // 拉低SPI_CS_N片选
            spi_start <= 1'b1    ;  // 启动SPI接收计数循环,创造SCLK
            state     <= AD_CH1_5; 
        end
        AD_CH1_5:  begin  // 双Dout输出
            if(cnt_spi_clk == 2'd1) begin
                ad_ch1    <= {ad_ch1[14:0],ad_dataA};
                ad_ch5    <= {ad_ch5[14:0],ad_dataB};
                state_cnt <= state_cnt + 1'b1;
                if(state_cnt == 16'd15) begin
                    state_cnt <= 16'd0   ;
                    state     <= AD_CH2_6;  
                end
            end    
        end
        AD_CH2_6:  begin  // 双Dout输出
            if(cnt_spi_clk == 2'd1) begin
                ad_ch2    <= {ad_ch2[14:0],ad_dataA};
                ad_ch6    <= {ad_ch6[14:0],ad_dataB};
                state_cnt <= state_cnt + 1'b1;
                if(state_cnt == 16'd15) begin
                    state_cnt <= 16'd0   ;
                    state     <= AD_CH3_7;  
                end
            end    
        end 
        AD_CH3_7:  begin  // 双Dout输出
            if(cnt_spi_clk == 2'd1) begin
                ad_ch3    <= {ad_ch3[14:0],ad_dataA};
                ad_ch7    <= {ad_ch7[14:0],ad_dataB};
                state_cnt <= state_cnt + 1'b1;
                if(state_cnt == 16'd15) begin
                    state_cnt <= 16'd0   ;
                    state     <= AD_CH4_8;  
                end
            end    
        end 
        AD_CH4_8:  begin  // 双Dout输出
            if(cnt_spi_clk == 2'd1) begin
                ad_ch4    <= {ad_ch4[14:0],ad_dataA};
                ad_ch8    <= {ad_ch8[14:0],ad_dataB};
                state_cnt <= state_cnt + 1'b1;
                if(state_cnt == 16'd15) begin
                    state_cnt <= 16'd0  ;
                    state     <= AD_STOP;  
                end
            end    
        end 
        AD_STOP:   begin
            ad_cs_n   <= 1'b1;
            ad_done   <= 1'b1;
            state     <= AD_IDLE;   
        end 
        default: begin
           state      <= AD_IDLE;
        end               
    endcase        
end    
    
// SPI_SCLK:ad_sclk信号
always@(*)
begin
    case(state)
        AD_IDLE,AD_CVAB,AD_BUSY1,AD_BUSY2,AD_STOP:   // SPI读取数据之前和之后,SCLK一直保持高电平
            ad_sclk <= 1'b1;
        AD_CH1_5,AD_CH2_6,AD_CH3_7,AD_CH4_8 : begin  // SPI读取CH1-CH8时,SCLK的变化
            if(cnt_spi_clk == 2'd0 || cnt_spi_clk == 2'd1)  // cnt_iic_clk等于0、1时:SPI_SCLK为低电平
                ad_sclk <= 1'b0;
            else                                            // cnt_iic_clk等于2、3时:SPI_SCLK为高电平
                ad_sclk <= 1'b1;
        end
        default      :       // 其他情况,SCLK保持高电平
            ad_sclk <= 1'b1;
    endcase    
end 
 
endmodule

uart_test代码:

module uart_test(
    input                        sys_clk,       //system clock 50Mhz on board
    input                        rst_n,        //reset ,low active
	input                       [15:0] data1,
	input                       [15:0] data2,
	input                       [15:0] data3,
	input                       [15:0] data4,
	input                       [15:0] data5,
	input                       [15:0] data6,
	input                       [15:0] data7,
	input                       [15:0] data8,
	output                       uart_tx
);

parameter                      CLK_FRE = 50;//Mhz
localparam                       IDLE =  0;
localparam                       SEND =  1;   //send HELLO ALINX\r\n
localparam                       WAIT =  2;   //wait 1 second and send uart received data
reg[7:0]                         tx_data;
reg[7:0]                         tx_str;
reg                              tx_data_valid;
wire                             tx_data_ready;
reg[7:0]                         tx_cnt;

reg[31:0]                        wait_cnt;
reg[3:0]                         state;



always@(posedge sys_clk or negedge rst_n)
begin
	if(rst_n == 1'b0)
	begin
		wait_cnt <= 32'd0;
		tx_data <= 8'd0;
		state <= IDLE;
		tx_cnt <= 8'd0;
		tx_data_valid <= 1'b0;
	end
	else
	case(state)
		IDLE:
			state <= SEND;
		SEND:
		begin
			wait_cnt <= 32'd0;
			tx_data <= tx_str;

			if(tx_data_valid == 1'b1 && tx_data_ready == 1'b1 && tx_cnt < 8'd23)//Send 12 bytes data
			begin
				tx_cnt <= tx_cnt + 8'd1; //Send data counter
			end
			else if(tx_data_valid && tx_data_ready)//last byte sent is complete
			begin
				tx_cnt <= 8'd0;
				tx_data_valid <= 1'b0;
				state <= WAIT;
			end
			else if(~tx_data_valid)
			begin
				tx_data_valid <= 1'b1;
			end
		end
		WAIT:
		begin
			wait_cnt <= wait_cnt + 32'd1;

     if(tx_data_valid && tx_data_ready)
			begin
				tx_data_valid <= 1'b0;
			end
			else if(wait_cnt >= CLK_FRE * 1000) // wait for 1 ms
				state <= SEND;
		end
		default:
			state <= IDLE;
	endcase
end

//combinational logic
//Send "HELLO ALINX\r\n"
always@(*)
begin
	case(tx_cnt)
	    8'd0 :  tx_str <= 8'h88;
		8'd1 :  tx_str <= data1[15:8];
		8'd2 :  tx_str <= data1[7:0];
		8'd3:   tx_str <= 8'h89;
		8'd4 :  tx_str <= data2[15:8];
		8'd5 :  tx_str <= data2[7:0]; 
		8'd6:   tx_str <= 8'h8a;
		8'd7 :  tx_str <= data3[15:8]; 
		8'd8 :  tx_str <= data3[7:0]; 
		8'd9:   tx_str <= 8'h8b;
		8'd10 :  tx_str <= data4[15:8]; 
		8'd11 :  tx_str <= data4[7:0]; 
		8'd12:   tx_str <= 8'h8c;	
		8'd13 :  tx_str <= data5[15:8]; 
		8'd14 :  tx_str <= data5[7:0]; 
		8'd15:   tx_str <= 8'h8d;
		8'd16 :  tx_str <= data6[15:8]; 
		8'd17 :  tx_str <= data6[7:0]; 
		8'd18:   tx_str <= 8'h8e;
		8'd19 :  tx_str <= data7[15:8]; 
		8'd20 :  tx_str <= data7[7:0]; 
		8'd21:   tx_str <= 8'h8f;
		8'd22 :  tx_str <= data8[15:8]; 
		8'd23 :  tx_str <= data8[7:0]; 
		default:tx_str <= 8'd0;
	endcase
end



uart_tx#
(
	.CLK_FRE(CLK_FRE),
	.BAUD_RATE(115200)
) uart_tx_inst
(
	.clk                        (sys_clk                  ),
	.rst_n                      (rst_n                    ),
	.tx_data                    (tx_data                  ),
	.tx_data_valid              (tx_data_valid            ),
	.tx_data_ready              (tx_data_ready            ),
	.tx_pin                     (uart_tx                  )
);
endmodule

uart_tx代码:

module uart_tx
#(
	parameter CLK_FRE = 50,      //clock frequency(Mhz)
	parameter BAUD_RATE = 115200 //serial baud rate
)
(
	input                        clk,              //clock input
	input                        rst_n,            //asynchronous reset input, low active 
	input[7:0]                   tx_data,          //data to send
	input                        tx_data_valid,    //data to be sent is valid
	output reg                   tx_data_ready,    //send ready
	output                       tx_pin            //serial data output
);
//calculates the clock cycle for baud rate 
localparam                       CYCLE = CLK_FRE * 1000000 / BAUD_RATE;
//state machine code
localparam                       S_IDLE       = 1;
localparam                       S_START      = 2;//start bit
localparam                       S_SEND_BYTE  = 3;//data bits
localparam                       S_STOP       = 4;//stop bit
reg[2:0]                         state;
reg[2:0]                         next_state;
reg[15:0]                        cycle_cnt; //baud counter
reg[2:0]                         bit_cnt;//bit counter
reg[7:0]                         tx_data_latch; //latch data to send
reg                              tx_reg; //serial data output
assign tx_pin = tx_reg;
always@(posedge clk or negedge rst_n)
begin
	if(rst_n == 1'b0)
		state <= S_IDLE;
	else
		state <= next_state;
end

always@(*)
begin
	case(state)
		S_IDLE:
			if(tx_data_valid == 1'b1)
				next_state <= S_START;
			else
				next_state <= S_IDLE;
		S_START:
			if(cycle_cnt == CYCLE - 1)
				next_state <= S_SEND_BYTE;
			else
				next_state <= S_START;
		S_SEND_BYTE:
			if(cycle_cnt == CYCLE - 1  && bit_cnt == 3'd7)
				next_state <= S_STOP;
			else
				next_state <= S_SEND_BYTE;
		S_STOP:
			if(cycle_cnt == CYCLE - 1)
				next_state <= S_IDLE;
			else
				next_state <= S_STOP;
		default:
			next_state <= S_IDLE;
	endcase
end
always@(posedge clk or negedge rst_n)
begin
	if(rst_n == 1'b0)
		begin
			tx_data_ready <= 1'b0;
		end
	else if(state == S_IDLE)
		if(tx_data_valid == 1'b1)
			tx_data_ready <= 1'b0;
		else
			tx_data_ready <= 1'b1;
	else if(state == S_STOP && cycle_cnt == CYCLE - 1)
			tx_data_ready <= 1'b1;
end


always@(posedge clk or negedge rst_n)
begin
	if(rst_n == 1'b0)
		begin
			tx_data_latch <= 8'd0;
		end
	else if(state == S_IDLE && tx_data_valid == 1'b1)
			tx_data_latch <= tx_data;
		
end

always@(posedge clk or negedge rst_n)
begin
	if(rst_n == 1'b0)
		begin
			bit_cnt <= 3'd0;
		end
	else if(state == S_SEND_BYTE)
		if(cycle_cnt == CYCLE - 1)
			bit_cnt <= bit_cnt + 3'd1;
		else
			bit_cnt <= bit_cnt;
	else
		bit_cnt <= 3'd0;
end


always@(posedge clk or negedge rst_n)
begin
	if(rst_n == 1'b0)
		cycle_cnt <= 16'd0;
	else if((state == S_SEND_BYTE && cycle_cnt == CYCLE - 1) || next_state != state)
		cycle_cnt <= 16'd0;
	else
		cycle_cnt <= cycle_cnt + 16'd1;	
end

always@(posedge clk or negedge rst_n)
begin
	if(rst_n == 1'b0)
		tx_reg <= 1'b1;
	else
		case(state)
			S_IDLE,S_STOP:
				tx_reg <= 1'b1; 
			S_START:
				tx_reg <= 1'b0; 
			S_SEND_BYTE:
				tx_reg <= tx_data_latch[bit_cnt];
			default:
				tx_reg <= 1'b1; 
		endcase
end

endmodule 

引脚约束代码:

set_property IOSTANDARD LVCMOS33 [get_ports {ad_os[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {ad_os[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {ad_os[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports ad_busy]
set_property IOSTANDARD LVCMOS33 [get_ports ad_cs_n]
set_property IOSTANDARD LVCMOS33 [get_ports ad_cvAB]
set_property IOSTANDARD LVCMOS33 [get_ports ad_dataA]
set_property IOSTANDARD LVCMOS33 [get_ports ad_dataB]
set_property IOSTANDARD LVCMOS33 [get_ports ad_rst]
set_property IOSTANDARD LVCMOS33 [get_ports ad_sclk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports uart_tx]
set_property PACKAGE_PIN N18 [get_ports clk]
set_property PACKAGE_PIN P16 [get_ports rst_n]
set_property PACKAGE_PIN V16 [get_ports {ad_os[2]}]
set_property PACKAGE_PIN W16 [get_ports {ad_os[1]}]
set_property PACKAGE_PIN T17 [get_ports {ad_os[0]}]
set_property PACKAGE_PIN R18 [get_ports ad_busy]
set_property PACKAGE_PIN W13 [get_ports ad_cs_n]
set_property PACKAGE_PIN V12 [get_ports ad_cvAB]
set_property PACKAGE_PIN Y18 [get_ports ad_dataA]
set_property PACKAGE_PIN W19 [get_ports ad_dataB]
set_property PACKAGE_PIN T15 [get_ports ad_rst]
set_property PACKAGE_PIN T14 [get_ports ad_sclk]
set_property PACKAGE_PIN P14 [get_ports uart_tx]

接好线后,打开串口调试助手,115200波特率
在这里插入图片描述
数据形式:88XX XX 89 XX XX 8A XX XX 8B XX XX 8C XX XX 8D XX XX 8E XX XX 8F XX XX
88~8F均为通道号,后面为16位数据。

工程文件:
链接:https://pan.baidu.com/s/1kB05zxgk38Y592e4FngSzA
提取码:58ld

数据解读请看我上一篇文章,如果觉得有帮助,欢迎点赞收藏,谢谢。

对于在zedboard上使用Linux操作系统和ad9361的配置,可以参考以下步骤: 1. 首先,利用socket编程实现在zedboard上的ad9361获得频谱数据通过socket传输到Windows操作系统上。 2. 其次,可以使用无需搭载操作系统(no os)的ad9361配置方法。这种方法适用于搭载在FMCOMMS2板卡上的ad9361。 3. 在配置环境完成后,可以开始建立vivado工程。通过cd命令进入存放hdl文件夹的位置。具体路径根据使用的板子不同而有所区别。对于FMCOMMS2板卡和zedbord板,路径可能为E:\vhdl_cfg\projects\fmcomms2\zed。 4. 运行make命令对路径下的文件进行操作。具体命令可参考hdl文件夹下的readme文件中的相关信息。 通过以上步骤,你可以在zedboard上使用Linux操作系统和ad9361进行相关配置和使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [test_socket_ad9361zynq_linux_ad9361_zedboard](https://download.csdn.net/download/weixin_42696271/22382166)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [基于zedboard的AD9361初始化配置(上)](https://blog.csdn.net/leo_xu_/article/details/80490583)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值