微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 求各位大神帮忙,谢谢

求各位大神帮忙,谢谢

时间:10-02 整理:3721RD 点击:
先写上Verilog代码:
module AMP_TOP (
    input SPI_SCLK ,
    input SPI_CS ,
    input SPI_MOSI ,
    output reg SPI_MISO ,
    output reg DAC_SCLK ,
    output reg DAC_CS ,
    output reg DAC_SDI ,
    iuput DAC_SDO ,      
    output reg ADC_SCLK ,
    output reg ADC_CS ,
    output reg ADC_SDI ,
    iuput ADC_SDO  
) ;
reg [7:0] CHANNNEL_SELECTOR ;
reg EIGHTH_CLK ;
reg AFTER_EIGHT_CLK ;
reg [7:0] SCLK_COUNTER ;
reg [7:0] INPUT_BUFFER ;
always @ ( posedge SPI_SCLK , posedge SPI_CS )
        begin
                if ( SPI_CS )
                        begin
                                SCLK_COUNTER     <= 8'h0  ;
                                INPUT_BUFFER     <= 8'h0  ;
                                EIGHTH_CLK       <= 1'b1  ;
                                CHANNEL_SELECTOR <= 8'hFF ;
                        end
                else
                        begin
                                SCLK_COUNTER <= SCLK_COUNTER + 1'b1 ;
                                INPUT_BUFFER <= { INPUT_BUFFER [DW-2:0] , AMP_SPI_MOSI } ;
                                if ( SCLK_COUNTER == 8'h7 )
                                        begin
                                                CHANNEL_SELECTOR <= { INPUT_BUFFER [6:0] , AMP_SPI_MOSI } ;
                                                EIGHTH_CLK <= 1'b0 ;
                                        end
                                else
                                        begin
                                                EIGHTH_CLK <= 1'b1 ;
                                        end
                        end
        end
always @ ( negedge SPI_SCLK , posedge SPI_CS )
        begin
                if ( SPI_CS )
                        begin
                                AFTER_EIGHT_CLK <= 1'b1 ;
                        end
                else
                        begin
                                if ( SCLK_COUNTER == 8'h8 )
                                        begin
                                                AFTER_EIGHT_CLK <= 1'b0 ;
                                        end
                        end
        end
always @ ( * )
        begin
                if ( AFTER_EIGHT_CLK )
                        begin
                                SPI_MISO <= SPI_MOSI ;
                                DMC_SCLK     <= 1'b0 ;
                                DMC_CS       <= 1'b1 ;
                                DMC_SDI      <= 1'b0 ;
                        end
                else
                        begin
                                if ( CHANNEL_SELECTOR [6:3] == 4'b0110 )
                                        begin
                                                case ( CHANNEL_SELECTOR [2:0] )
                                                        3'h0:
                                                                begin
                                                                        DMC_SCLK     <=  ~SPI_SCLK ;
                                                                        DMC_CS       <= SPI_CS     ;
                                                                        DMC_SDI      <= SPI_MOSI   ;
                                                                        SPI_MISO <= DMC_SDO        ;
                                                                end
                                                        3'h1 :
                                                                begin
                                                                        ADC_SCLK     <= SPI_SCLK   ;
                                                                        ADC_CS       <= SPI_CS     ;
                                                                        ADC_SDI      <= SPI_MOSI   ;
                                                                        SPI_MISO <= ADC_SDO        ;
                                                                end
                                                        default : ;
                                                endcase
                                        end
                                end
                end
endmodule
(1)代码中使用的CPLD为5M160ZE64C5N,使用的DAC是DAC8734,使用的ADC是ADS124S06。
(2)图1是我使用的测试软件,SEL(HEX)项是通道ID,我的代码中为"30h"或"31h";C/A-L项是地址位长度,1表示的8bit;C/A-D(HEX)项表示的是地址数据;Data-L项表示的是数据长度;Data-D(HEX)项表示的是数据。
(3)根据DAC8734的Datasheet,寄存器00h的缺省值是033Ch,我在使用read时,00h的值会出现在下一个SPI操作当中,所以我分别read了两次,结果为0000;有分别read了1次,write了1次,结果还是0;是不是我对datasheet中的内容理解错了还是什么其他原因,求各位大神指教!

图一


DAC8734Datasheet(1)


DAC8734Datasheet(2)


DAC8734Datasheet(3)


DAC8734Datasheet(4)



已退回5积分

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top