2016-04-15 1 views
0

J'ai écrit deux codes pour la mise en oeuvre du DAC en Spartan 3E Starter Kit, ils semblent fonctionner parfaitement en simulation mais quand je les attache à chipcope et charge à bord je reçois toujours un zéro valeur. J'ai également remarqué qu'il n'y avait pas d'avertissement critique. Code 1:Implémentation DAC en spartan 3e kit en utilisant verilog

module dac_state_d(
input dacclk, 
input reset, 
input [31:0] dacdata, 
output reg[31:0] previousdata, 
output reg dac_mosi, 
output reg dac_miso, 
output reg dac_cs, 
output reg dac_sck, 
output reg dac_clr, 
output reg spi_ss_b, 
output reg sf_ce0, 
output reg fpga_init_b, 
output reg amp_cs, 
output reg ad_conv, 
output reg [2:0] state, 
output reg ack 
); 

integer index=0; 
parameter idle=3'b000, ready=3'b001, delay=3'b010, trans=3'b011, read=3'b100, increment=3'b101, check=3'b110; 


initial begin//setting different registers on spi bus and initialization 
    spi_ss_b='b1; 
    amp_cs='b1; 
    ad_conv='b0; 
    sf_ce0='b1; 
    fpga_init_b='b0; 
end 

always @(posedge dacclk or posedge reset) begin 
    if (reset) begin 
     index<=0; 
     dac_mosi<=0; 
     dac_clr<=0; 
     dac_sck<=0; 
     dac_cs<=1; 
    end 
    else begin 
     dac_clr<=1; 
     case(state) 
     idle: begin 
       dac_sck <= 0; 
       dac_cs <= 1; 
       index <= 0; 
       dac_mosi <= 0; 
       ack <= 1; 
       state <= ready; 
       end 

     ready: begin 
       ack <= 0; 
       dac_cs <= 0; 
       dac_sck <= 0; 
       dac_mosi <= dacdata[31-index]; 
       state <= delay; 
       end 

     delay: begin 
       state <= trans; 
       end 

     trans: begin 
       dac_sck <= 1; 
       state <= read;     
       end 

     read: begin 
       dac_sck <= 1; 
       previousdata[31-index]<=dac_miso; 
       state <= increment; 
       end 

     increment: begin 
       dac_sck <= 1; 
       index <= index + 1; 
       state <= check; 
        end 

     check: begin 
       dac_sck <= 1; 
       if (31-index < 0) begin 
        state <= idle; end 
       else begin 
        state <= ready; 
       end 
       end 
     endcase 
    end 
end 
endmodule 

avec son module supérieur défini comme

reg [31:0] dacdata; 
wire [31:0] previousdata; 
reg [3:0] command, address; 
wire dac_miso_w; 

assign dac_miso_w=dac_miso; 
wire dacclk; 

DACCLK clock(.clk(clk), 
      .dacclk(dacclk) 
      ); 

dac_state_d daq_run(.dacclk(dacclk), 
       .reset(reset), 
       .dacdata(dacdata), 
       .previousdata(previousdata), 
       .dac_mosi(dac_mosi), 
       .dac_miso(dac_miso_w), 
       .dac_clr(dac_clr), 
       .dac_cs(dac_cs), 
       .spi_ss_b(spi_ss_b), 
       .sf_ce0(sf_ce0), 
       .fpga_init_b(fpga_init_b), 
       .amp_cs(amp_cs), 
       .ad_conv(ad_conv), 
       .dac_sck(dac_sck), 
       .state(state), 
       .ack(ack) 
       ); 

initial begin 
    command<=4'b0011; 
    address<=4'b1111; 
end 

always @ (posedge clk) begin 
    if (ack) begin 
     dacdata[31:24]<=8'b00000000; 
     dacdata[23:20]<=command; 
     dacdata[19:16]<=address; 
     dacdata[15:4]<=data; 
     dacdata[3:0]<=4'b0000; 
     pre_data<=previousdata[15:4]; 
    end 
    else begin dacdata<=0; end 
end 


//chipscope------------------- 
wire[11:0] D; 
wire R; 
wire[35:0] CONTROL; 
assign D=data; 
assign R=reset; 

ICON cs_con(.CONTROL0(CONTROL)); //INOUT BUS [35:0] 
VIO cs_vio (.CONTROL(CONTROL), // INOUT BUS [35:0] 
      .ASYNC_IN({pre_data,state,ack}), // IN BUS [12:0] 
      .ASYNC_OUT({D,R}) // OUT BUS [12:0] 
); 
//---------------------------------------------------------------------------- 

endmodule 

Module de toute évidence supérieure a également la description de port d'E/S.

Code 2:

wire dacclk; 

DACCLK clock(.clk(clk), 
     .dacclk(dacclk) 
     ); 

initial begin//setting different registers on spi bus and initialization 
spi_ss_b='b1; 
amp_cs='b1; 
ad_conv='b0; 
fpga_init_b='b0; 
dac_clr=1; 
dac_cs=1; 
dacstate<=0; 
//StrataFLASH must be disabled to prevent it driving the SDI line with its D0 output 
//or conflicting with the LCD display 

strataflash_oe <= 1; 
strataflash_ce <= 1; 
strataflash_we <= 1; 
end 

[email protected](posedge dacclk) begin 
       case (dacstate) 
//------------------------------Bit 31 to 24 Don't Care---------------------------------- 
      0: begin//idle and allotment cycle(31-->x) 
        ack=0; 
        dac_cs=0; 
        dac_sck=0; 
        dacstate=1; 
       end 
      1: begin//read write cycle (31) 
        dac_sck=1; 
        dacstate=2; 
       end 
      2: begin//idle and allotment cycle(30-->x) 
        dacstate=3; 
        dac_sck=0; 
       end 
      3: begin//read write cycle(30) 
        dac_sck=1; 
        dacstate=4; 
         ..... 

       62: begin//idle and allotment cycle(0-->x) 
        dac_sck=0; 
        dacstate=63; 
       end 
      63: begin//read write cycle(0) 
        dac_sck=1; 
        dacstate=64; 
       end  
      64: begin//Acknowledging completion of data transfer to DAC 
        dac_cs=1; 
        ack=1; 
        dacstate=65; 
       end 
      65: begin if (reset) begin dacstate=0; end 
         else begin dacstate=65; end end//idle or reset 
      default: begin dacstate=0; end 
     endcase 
    end 
endmodule 

fichier UCF i utilisé est comme suit

NET "clk" PERIOD = 20.0ns HIGH 50%; 
NET "clk" LOC = "C9" | IOSTANDARD = LVTTL; 

NET"dac_miso" LOC= "N10" | IOSTANDARD= LVCMOS33 ; 
NET"dac_mosi" LOC= "T4" | IOSTANDARD= LVCMOS33 | SLEW= SLOW | DRIVE= 8 ; 
NET"dac_sck" LOC= "U16" | IOSTANDARD= LVCMOS33 | SLEW= SLOW | DRIVE= 8 ; 
NET"dac_cs" LOC= "N8" | IOSTANDARD= LVCMOS33 | SLEW= SLOW | DRIVE= 8 ; 
NET"dac_clr" LOC= "P8" | IOSTANDARD= LVCMOS33 | SLEW= SLOW | DRIVE= 8 ; 

NET "fpga_init_b" LOC = "T3" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 4 ; 
NET "ad_conv" LOC = "P11" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 6 ; 
NET "amp_cs" LOC = "N7" | IOSTANDARD = LVCMOS33 | SLEW = SLOW |DRIVE = 6 ; 
NET "spi_ss_b" LOC = "U3" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 6 ; 
NET "sf_ce0" LOC = "D16" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 2; 

NET "reset" LOC = "V4" | IOSTANDARD = LVTTL | PULLDOWN; 

Je ne vous attendez pas à une personne pour résoudre mon problème, mais je me sens impuissant que je suis débogage ces codes des 2 dernières semaines et je suis incapable de trouver aucun problème. Ce sera vraiment utile si quelqu'un peut me diriger vers l'erreur. J'ai également parcouru quelques exemples de codes mais comme tous sont écrits en VHDL, ils ne m'ont pas beaucoup aidé. J'ai quand même essayé de faire correspondre la logique et j'ai trouvé que c'était la même chose.

+0

Êtes-vous sûr de vouloir utiliser Intial ... begin block? Vous ne pouvez pas initialiser votre reg sur la réinitialisation? Donnez-vous une période de réinitialisation appropriée? –

+0

@PrakashDarji Oui Le bloc initial n'est pas requis mais il ne crée aucun problème non plus. –

Répondre

0

L'erreur dans le code est très basique, en fait en relation avec VIO. Les entrées ne peuvent pas être connectées à VIO car VIO est interne, il est donc nécessaire de connecter le fil uniquement. En outre, il y a une affectation de l'entrée au fil et le fil est réaffecté par VIO, ce qui n'est pas acceptable.