求各位大神帮忙,谢谢
时间: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中的内容理解错了还是什么其他原因,求各位大神指教!
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积分