2016-06-17 1 views
0

the picture indicates what I want the output signal is: the high signal double and the low signal keep same.En Verilog, comment doubler le signal élevé et maintenir le signal faible même

J'ai écrit le code comme:

integer x=0, count_valid=1, count_down=0; 
reg valid_1, valid_reg; 
[email protected](posedge clk) 
begin 
    if(tag==1) begin 
    if(valid) begin 
    count_valid <= count_valid +1; 
    x<=x+1; 
    valid_reg <= 1; 
    end 
    else begin 
    x<=0; 
    count_down <= count_down+1; 
    if(count_valid>0) begin 
    valid_reg <= 1; 
    count_valid <= count_valid -1; 
    end 
    else if(count_down>0) begin 
    valid_reg <= 0; 
    count_down <= count_down-1; 
    end 
    end 
    end 
    else begin 
    valid_reg <= valid; 
    if (valid) x<=x+1; 
    else x<=0; 
    end 
    valid_1 <= valid_reg; 
end 

valid est le signal d'origine dans l'image et valid_reg est le signal modifié . le count_valid est utilisé pour compter le nombre de cycles pour le haut et l'utiliser pour le sous-un pour obtenir le doublage. alors count_down est utilisé pour compter les cycles de faible signal. mais je me suis rendu compte quand haut valide le valid_reg sera élevé. Est-ce que quelqu'un peut me donner une idée de comment faire fonctionner le même signal bas dans les mêmes cycles dans le signal de sortie?

Toute idée est également géniale.

+1

Votre horloge des horloges manque l'horloge source, dont vous avez utilisé les divisions d'horloge. Cela doit être dans le diagramme. – Morgan

Répondre

0

Vous n'avez pas mentionné si le signal d'entrée était périodique ou non. Étant donné que votre sortie est étirée au fil du temps, si l'entrée n'est pas périodique, vous aurez besoin d'un stockage infini pour garder une trace de ce à quoi ressemblait le signal d'entrée. Si c'est périodique, ou quasi-périodique, vous pouvez faire quelque chose comme ci-dessous.
Conserve le nombre élevé et le nombre faible dans un bloc et génère le signal de sortie dans un autre bloc, en utilisant les valeurs enregistrées actuelles des comptages. Obtenir le premier bord de la sortie à aligner avec les entrées est un peu compliqué, nécessitant un multiplexage, choisi selon que c'est la première fois ou non.

integer count, count_q, countdown, countdown_q, outcount; 
logic valid_q, valid_reg, out_q; 
logic new; 
always @(posedge clk or negedge reset_n) 
    begin 
    if(~reset_n) 
    begin 
    if(~reset_n) 
     begin 
     new <= 1; 
     valid_q <= 0; 
     count_q <= 0; 
     countdown_q <= 0; 
     end 
    else 
     begin 
     valid_q <= valid; 
     if(valid & ~valid_q)//rising edge 
     begin 
     count <= 1; 
     countdown_q <= countdown; 
     end 
     else if(~valid & valid_q)//falling edge 
     begin 
     new <= 0; 
     count_q <= count; 
     countdown <= 1; 
     end 
     else if(valid) 
     count <= count+1; 
     else 
     countdown <= countdown+1; 
     end 
    end 
    end 
always @(posedge clk or negedge reset_n) 
    begin 
    if(~reset) 
    begin 
    outcount <= 0; 
    out_q <= 0; 
    end 
    else 
    begin 
    if(new & valid & ~valid_q) 
     begin 
     out_q <= 1; 
     outcount <= 2;//valid_reg is already high here 
     end 
    else 
     if(out_q && (outcount == (count_q<<1))) 
     begin 
     out_q <= 0; 
     outcount <= 1; 
     end 
     else if(~out_q && (outcount == (countdown_q))) 
     begin 
     out_q <= 1; 
     outcount <= 1; 
     end 
     else 
     outcount <= outcount + 1; 
    end 
    end 
assign valid_reg = new? valid : out_q;//this gets your initial rising edge lined up