2016-01-28 5 views
-1

Я был поражен в этот момент в течение довольно долгого времени и действительно помог бы мне, если кто-то сможет изучить это и решить его. В систему входят 4 входа - w, a, b, c. Все это периодические входы, которые меняются со временем. Выходной сигнал равен o. Все они хранятся как подписанные 16-битные регистры. Когда w меньше 16'b0000101100110011, выход (o) равен «a». Когда w больше этого, выход изменяется на «b», но это происходит во время пересечения нуля c, то есть когда оно идет от положительного к отрицательному или наоборот. Таким образом, даже если w больше указанного выше значения, но c не пересекало его пересечение нуля, выход «o» будет оставаться «a». Я пытаюсь увидеть значение MSB 'c'. Как только он меняет свое значение, я пытаюсь изменить выход из «а» до «б», но это не происходит в соответствии с данным кодом:Задержка цикла в Verilog

module trial(clk, w, a, b, c, o 
    ); 

input clk;  
input signed [15:0] w;  
input signed [15:0] a;  
input signed [15:0] b;  
input signed [15:0] c;  
output signed [15:0] o;  
reg signed [15:0] temp;  
reg signed [15:0] temp1;  
reg signed [15:0] temp2;  


always @(posedge clk)  
begin  
    if (w<16'b0000101100110011)  
    begin  
    temp = a;  
    end  
    else  
    begin  
    temp1 = 0;//Initializing the value of temp1  
    temp2 = 0;//Initializing the value of temp2  
    while (temp1 == temp2)  
    begin  
     temp1 = c[15];// storing the sign bit of input 'c'  
     repeat(1) @(posedge clock);// one clock cycle delay command (##1 was not working)  
     temp2 = c[15];//storing the sign bit of input 'c' after one clock cycle  
    end  
    temp = b;  
    end  
    end  
assign o = temp;  
endmodule 

Выходной сигнал изменяется от «» до «б «мгновенно, когда« w »становится больше, чем 16'b0000101100110011. Он не ждет перехода нуля с 'c'. Может ли кто-нибудь указать, есть ли какая-то ошибка и, вероятно, решение. Благодаря

+1

Post код TestBench. Отредактируйте свой код правильно. – toolic

ответ

0

Чувак, выравнивал код это поможет вам и нам ;-)

Если я правильно понял ваш вопрос и часы и тот же сигнал CLK, я предлагаю вам что-то вроде этого:

always @(posedge clk) begin  
    if (w<16'b0000101100110011) begin  
     temp <= a;  
     big <= 0; //flag 
    end  
    else begin  
     big <= 1; //flag 
    end 
end  

always @ (posedge c or negedge c) begin 
    if (big == 1) begin 
     temp <= b; 
    end 
end 

Похоже, вы пишете логику Verilog как логику программы C. Вы не должны этого делать. Вам нужно попытаться подумать, как аппаратное обеспечение будет строить ваши провода. Это сила параллелизма на ваших руках ;-)

Правило большого пальца около = и < =. Если вы всегда находитесь в блоке @ (posedge/negedge), используйте < =. Но отметьте http://www.asic-world.com/tidbits/blocking.html, чтобы лучше понять это.

+3

Вы должны использовать '<=' (неблокирующее назначение) в тактируемых всегда блоках ('always @ (posedge/negedge)'), но не в последовательных блоках ('always @ (*)') – wilcroft

+0

Вы правы wilcroft! Исправление моего ответа. –

+1

Назначение 'temp' из двух блоков всегда; он не будет синтезироваться. Плюс 'c' - это 16-битное значение, поэтому' posedge c или negedge c' не имеет смысла. – Greg

1

Я думаю, что что-то подобное будет работать слишком

module sample(clk, w, a, b, c, o); 

input clk;  
input signed [15:0] w;  
input signed [15:0] a;  
input signed [15:0] b;  
input signed [15:0] c;  
output reg signed [15:0] o;  
reg signed [15:0] temp;  
reg signed [15:0] temp1;  
reg signed [15:0] temp2;  

reg signed [15:0] c_previous; 
wire signed c_zero_cross; 

assign c_zero_cross = (c_previous[15] == c[15]) ? 1'b0 : 1'b1; 

always @(posedge clk) begin 

    c_previous <= c; 

    if (w < 16'b0000101100110011) begin  
     o <= a;   
    end  
    else begin  
     if(c_zero_cross) begin 
      o <= b; 
     end else begin 
      o <= a; 
     end 
    end 
end  

endmodule 

o changes to 50 when c changes from 10 to -10

+0

Извините, но этот код не работает. Вывод всегда выходит «a». Даже при пересечении нуля «c» выход не менялся при w> 16'b0000101100110011. – Shivang

+0

Его работа хорошая для меня. Единственное, чего не хватало, заключалось в том, что переменные были подписаны, и для ясности я преобразовал нуль в один бит. – DBB

Смежные вопросы