2015-08-12 3 views
-1

J'essaye donc d'instancier un module dans un module. Le module racine a des ports de sortie qui pilotent les broches de sortie et je veux que le module interne conduise ces ports directement, mais je ne peux pas le faire fonctionner de toute façon.Régulateur de sortie du module Verilog pilotant le registre de sortie?

/* 
A root module for the 005_135-scanner_mainboard_revA_sch-pcb. Can be used as a test bench for testing peripheral devices but has been designed to be the master root module for the final code. 
All IO is included and reset pins on peripheral devices driven active reset with data lines driven to an appropriate value (located in the ‘initial block’). 
George Waller. 09/08/15. 
*/ 

module root_module(ft_reset, ft_usb_prsnt, ft_bus_pwrsav, ft_bus_oe,    ft_bus_clkout, ft_bus_siwu, ft_bus_wr, ft_bus_rd, ft_bus_rxf, ft_bus_txe, ft_bus_d, 
         mtr_fault, mtr_config, mtr_m1, mtr_m0, mtr_rst, mtr_out_en, mtr_step, mtr_dir, 
         ccd_driver_oe, ccd_p1, ccd_p2, ccd_cp, ccd_rs, ccd_sh, 
         dac1_sdin, dac1_sclk, dac1_sync, dac2_sdin, dac2_sclk, dac2_sync, 
         adc_pwrdn, adc_encode, adc_d, 
         fpga_reset, 
         clk, 
         gpio, 
         led_ctrl, 
         leds); 

//Input declarations 
input wire   ft_usb_prsnt, ft_bus_clkout, ft_bus_rxf, ft_bus_txe, 
         mtr_fault, 
         fpga_reset, 
         clk; 

input wire [7:0] adc_d; 

//Output declarations 
output reg   ft_reset, ft_bus_pwrsav, ft_bus_oe, ft_bus_siwu, ft_bus_wr, ft_bus_rd, 
         mtr_config, mtr_m1, mtr_m0, mtr_rst, mtr_out_en, mtr_step, mtr_dir, 
         ccd_driver_oe, ccd_p1, ccd_p2, ccd_cp, ccd_rs, ccd_sh, 
         adc_pwrdn, adc_encode, 
         led_ctrl; 

output reg   dac1_sdin, dac1_sclk, dac1_sync, dac2_sdin, dac2_sclk, dac2_sync; 

output reg [7:0] leds; 

//Input output declarations. 
inout reg [7:0] ft_bus_d; 

inout reg [16:0] gpio; 

//Variables go here  

integer count, count1, state, pixel_n, line_n, t_int; 
integer data[8]; 

reg en; 

//Initial values on start up. 
initial 
begin 
    //IO initial setup values. 
    ft_reset = 1; ft_bus_pwrsav = 1; ft_bus_oe = 1; ft_bus_siwu = 0; ft_bus_wr = 1; ft_bus_rd = 1; //NEED TO APPLY REAL VAULES!!! 
    mtr_config = 1; mtr_m1 = 1; mtr_m0 = 1; mtr_rst = 1; mtr_out_en = 1; mtr_step = 0; mtr_dir = 0; 
    ccd_driver_oe = 1; ccd_p1 = 0; ccd_p2 = 0; ccd_cp = 0; ccd_rs = 0; ccd_sh = 0; 
    dac1_sdin = 0; dac1_sclk = 0; dac1_sync = 0; dac2_sdin = 0; dac2_sclk = 0; dac2_sync = 0; 
    adc_pwrdn = 0; adc_encode = 0; 
    led_ctrl = 0; 
    leds = 0; 
    gpio = 0; 
    ft_bus_d = 0; 

    //Variables setup values. 
    count = 0; 
    count1 = 0; 
    state = 0; 
    pixel_n = 0; 
    line_n = 0; 
    t_int = 10000; //t_int = integration time. integration time (seconds) =     t_int * 10x10^-9. 
end //End initial 

//Some other code goes here. 
always @(posedge ft_bus_clkout) 
begin 
    if(count == 50000000) 
     begin 
      en <= 1; 
      count = 0; 
     end 
     else 
     begin 
      en <= 0; 
      count = count + 1; 
    end 
end //End always 

AD5601_module AD5601(.en(en), .clk(clk), .data(127),.sdout(dac1_sdin), 
.sclk(dac1_sclk), .sync(dac1_sync));  

endmodule //End module. 

et le module intérieur:

module AD5601_module(en, clk, data, sdout, sclk, sync); 

     input wire   clk; 
     input wire   en; 
     input wire [7:0] data; 

     output reg   sdout, sclk, sync; 

     integer sclk_count; 
     integer data_state; 
     integer delay_counter; 
     integer pd[2]; 

     initial 
     begin 
      sclk_count = 0; 
      data_state = 99; 
      delay_counter = 0; 
      pd[0] = 0; 
      pd[1] = 0; 

      sdout = 0; 
      sclk = 0; 
      sync = 1; 
     end 

     always @ (posedge en) 
     begin 
      if(data_state == 99)data_state <= 0; 
     end 


     always @ (posedge clk) 
     begin 
      if(sclk_count == 49) 
      begin 
       sclk_count = 0; 
       sclk = ~sclk; 
      end 
      else sclk_count = sclk_count + 1; 

     end 

     always @ (posedge sclk) 
     begin 
      case(data_state) 
       0: begin 
        sync = 0; 
        sdout <= pd[1]; 
        data_state <= 1; 
       end 

       1: begin 
        sdout <= pd[0]; 
        data_state <= 2; 
       end    

       2: begin 
        sdout <= data[7]; 
        data_state <= 3; 
       end    

       3: begin 
        sdout <= data[6]; 
        data_state <= 4; 
       end    

       4: begin 
        sdout <= data[5]; 
        data_state <= 5; 
       end    

       5: begin 
        sdout <= data[4]; 
        data_state <= 6; 
       end    

       6: begin 
        sdout <= data[3]; 
        data_state <= 7; 
       end    

       7: begin 
        sdout <= data[2]; 
        data_state <= 8; 
       end    
       8: begin 
        sdout <= data[1]; 
        data_state <= 9; 
       end    

       10:begin 
        sdout <= 0; 
        if(delay_counter == 6)       
        begin 
         data_state <= 99; 
         delay_counter <= 0; 
         sync = 1; 
        end 
        else delay_counter = delay_counter + 1; 
       end    
      endcase 
     end 
endmodule 

Donc, avec le code comme est que je reçois l'erreur

'sortie ou inout port doit être connecté à une expression net structurel'

.

Si je change les sorties dans le module racine ou le module interne sur le fil, j'obtiens l'erreur 'l'expression sur le côté gauche devrait être de type variable'.

Donc, à ce stade, je n'ai aucune idée de comment vous imbriquez des sorties! De l'aide serait appréciée!

Merci

+0

Je reçois des erreurs avec les ports 'inout'. En avez-vous vraiment besoin? – toolic

+0

Il existe des sorties avec plusieurs pilotes 'dac1_sdin',' dac1_sclk' et 'dac1_sync'. connecté dans votre module interne. – Emman

+0

@Emman Pourriez-vous élaborer pour moi? Merci. –

Répondre

0
ports

inout devraient être un type net (ou wiretri) et non un reg. Un reg n'a pas de résolution de conflit (lorsqu'il y a deux pilotes actifs ou plus). Un inout ne doit pas être affecté dans un bloc de procédure (par exemple always -block, initial -block). Cela devrait être une simple déclaration assign comme ci-dessous. Le concepteur doit s'assurer qu'il n'y a qu'un pilote actif sur l'E/S à tout moment.

assign io_port_name = driver_enable ? io_out_value : 'bz; // io_out_value should be a flop 

Une sortie doit être déclarée output reg si elle est affectée à un bloc de procédure (par exemple always de -bloc, initial -bloc) à l'intérieur du module en cours. Toutes les autres sorties doivent être output ou output wire (ces identificateurs sont synonymes, le premier est implicite tandis que le second est explicite). An ne doit être affecté qu'à l'intérieur d'un always. Les FPGA permettent les blocs initial, ASIC/IC non. Si le SystemVerilog est activé, remplacez output reg par output logic. logic peut être utilisé pour les flops et les filets directionnels simples. logic n'est pas recommandé pour inout; logic comme reg n'a pas de résolution de conflit. Les tableaux integer data[8]; et integer pd[2]; sont des syntaxes SystemVerilog et non compatibles avec Verilog. Activez SystemVerilog ou modifiez integer data[0:7]; et integer pd[0:1];
SystemVerilog peut être activé par fichier en modifiant l'extension de fichier de .v à .sv; conseillé. Les simulateurs/synthétiseurs ont généralement un commutateur pour forcer tous les Verilog à être traités comme SystemVerilog; déconseillé, reportez-vous au manuel du simulateur/synthétiseur si vous souhaitez emprunter cet itinéraire.