2016-08-22 5 views
0
  • Ich verwende Xilinx 14.7 für Testsimulation.
  • Dieser Code stammt von Mein japanisches Verilog-Buch.

* Sorry, wenn mein Englisch nicht gut genug ist.Warum Ergebnis Q ist X?

* me Hilfe bitte

Verilog-Code

module Q41(clk,q1,reset,q2); 
     input clk,reset; 
     output [7:0] q1,q2; 
     reg  [7:0] q1,q2; 
     reg  a; 
     always @(posedge clk or posedge reset) 
     begin 
      if(reset) 
       begin 
       a <= 0 ; 
       q1 <= 8'h0; 
       q2 <= 8'h0; 
       end 
      else if(a<=0) 
       begin      
        if(q1>=8'h14) 
         begin q1 <= 8'h14; a <= 1; end 
        else      
         q1 <= q1+1;    
       end 
      else 
       begin      
        if(q1<=8'h0)  
         begin q1 <= 8'h0;  a <= 0; end 
        else      
         q1 <= q1-1;    
       end 
      if(a<=0) 
       q2 <=q2+q1; 
      else 
       q2 <=q2-q1; 
     end 
    endmodule 

Prüfstand

`timescale 1ps/1ps 
    module Q41TestBench; 
     reg clk; 
     reg reset; 
     wire [7:0] q1; 
     wire [7:0] q2; 
     parameter step = 10000; // 10ns 
     Q41 uut (clk, q1, reset, q2); 
     always begin 
      clk = 0; #(step/2); 
      clk = 1; #(step/2); 
     end 
     initial begin 
       reset = 1; 
     #step reset = 0; 
     #step clk = 0; 
     #(step*100) $finish; 
     end 
     initial $monitor($stime, 
     " clk = %d reset = %d Q = %d",clk,reset,q2); 
    endmodule 

Ergebnis

Ansicht Ergebnisbild

Please click here for view result image

Antwort

0

Ihr Problem ist, dass Sie Q2 in zwei separaten Konstrukten gesetzt haben. Sie haben Q2 in Ihrer traditionellen IF zurückgesetzt (Reset) und dann haben Sie eine separate IF, die die Zuweisung von Q2 verwaltet. Ich empfehle die folgende recode wo q2 ist in der gleichen IF-Konstrukt.

if(reset) 
    begin 
     a <= 0 ; 
     q1 <= 8'h0; 
     q2 <= 8'h0; 
    end 
else if(a<=0) 
    begin 
     q2 <= q2+q1      
     if(q1>=8'h14) 
      begin 
      q1 <= 8'h14; 
      a <= 1; 
      end 
     else 
      begin     
      q1 <= q1+1; 
      a <= a; // I like to make sure that everything is always assigned 
      end   
    end 
else 
    begin 
     q2 <=q2-q1;      
     if(q1<=8'h0)  
      begin 
      q1 <= 8'h0;  
      a <= 0; 
      end 
     else 
      begin      
      q1 <= q1-1; 
      a <= a; 
      end    
    end 
+1

Nur eine rationellere hinzuzufügen, in der Original-Code, wenn das Modul in zurückgesetzt wird, die q2 <= 8'h0 wegen der Reset-Klausel und die wird als q2 <= q2-q1 zugewiesen; mit nicht blockierender Zuordnung. Mit anderen Worten, der Simulator versucht, beide gleichzeitig zuzuweisen. Das Ergebnis ist undefiniert. –

+0

Rich Maes thx sehr viel 本 当 に り と う う ご さ す す. –

Verwandte Themen