2016-02-29 10 views
0

ОБНОВЛЕНИЕ: Я редактирую этот вопрос, чтобы изменить уравнение на более простой, хотя проблемы примерно одинаковы, с той разницей, что на этот раз я на самом деле мог заставить его дать правильный ответ на расчет, но у меня проблема с «защелками» (мое исходное уравнение также отлично работает, но такие же проблемы с запираниями).Арифметическое уравнение в Verilog, деленное на уровни с часами, получая «предупреждения защелки», пожалуйста,

Я хочу сделать простой шаг Equation за шагом, который выглядит следующим образом:

       c = 50/(|a - 2|^2 + |b - 5|^2) 

Данные неподписанных двоичных значений 32 бит, результат вычитания также без знака (абсолютные значения), что я хочу сделать, это выполнить это в несколько шагов с помощью часов,

 |a - 2| ,    // First this subtraction 
     |b - 5| AND |a - 2|^2, // then a subtraction and a square of before 
     |a - 2|^2 + |b - 5|^2 // then the another square plus the before square 
     c = 50/|a - 2|^2 + |b - 5|^2 /// finally a division of 50 

что я ожидаю, что инструмент синтеза генерирует только в 1 вычитание, 1 и 1 возведения в квадрат Отдела всего процесса, в этом упрощенном варианте только что ситуация происходят на квадратуре и вычитании si nce существует только 1 операция деления. Первый вопрос: действительно ли я делаю то, что предназначено? является Quartus II, генерирующим «datapath»? аппаратно/энергия фактически спасена?

Я новичок в верилоге и цифровом дизайне в целом и преподаю сам, пожалуйста, поправьте меня, если мои концепции ошибочны.

Я создал модули разделения, вычитания и квадратуры отдельно, потому что планирую их реализовать позже, вместо того, чтобы полагаться на операторы /, -, *. Причина в том, что я могу догадаться, программируя более эффективный алгоритм (доступный, например, авторам в Интернете), я мог бы заменить операторы-выведенные алгоритмы Quartus II. Но снова я не уверен.

Эта программа работает корректно, выход ожидаемой, однако, я получаю много предупреждений от Quartus-II, как этот

Предупреждение (10240): Verilog HDL Всегда Построить предупреждения на FCM_EQ.v (88): выводя фиксатор (ы) для переменной «SU_in_a», который удерживает свое предыдущее значение в одном или нескольких путей через всегда построить

Предупреждение (13012): Защелка SQ_in_a [18] имеет небезопасное поведение Предупреждение (13013): Порты D и ENA на защелке питаются одним и тем же сигнальным состоянием. S2

Я едва знаю, что защелка есть, я читал, что нужно избегать защелок, что регистры сохраняют свои значения в разных часах? вся программа именно об этом, поэтому я не знаю, как это исправить. Любые советы или альтернативные решения?

Топ-модуль состоит в следующем:

module FCM_EQ (a, b, c, clk, enable, rst_n, all_finish, OBS); 

input [31:0] a, b; 
input clk, enable, rst_n; 
output [31:0] c; 
output [63:0] OBS; 
output all_finish; 

reg [31:0] SU_in_a, SU_in_b; 
wire [31:0] SU_out_r; 

reg [31:0] SQ_in_a; 
wire [63:0] SQ_out_r; 

reg [63:0] DIV_in_b; 
reg [63:0] DIV_in_a; 
wire [63:0] DIV_out_r; 

reg [31:00] botA, botB, c; 
reg [63:00] SQ_botA, SQ_botB, N_C;      
reg [63:0] den_total; 

reg all_finish; 
reg [4:0] state, nextstate; 
reg [63:0] OBS; 

parameter FIFTY = 64'b0000000000000000_0000000000110010_0000000000000000_0000000000000000; 
parameter FIVE = 32'b0000000000000101_0000000000000000; 
parameter TWO = 32'b0000000000000010_0000000000000000; 

parameter reset = 0; 
parameter S0 = 1; 
parameter S1 = 2; 
parameter S2 = 3; 
parameter S3 = 4; 

SUB_VAL SU_inst1(.a (SU_in_a),.b (SU_in_b),.r (SU_out_r)); 

SQ_VAL SQ_inst1 (.a (SQ_in_a),.r (SQ_out_r)); 

DIV_VAL DIV_inst1 (.a (DIV_in_a),.b (DIV_in_b),.r (DIV_out_r)); 

always @ (posedge clk or negedge rst_n) 
    if (~rst_n) 
    state <= reset ; 
    else 
    state <= nextstate; 

always @* 
begin 
      case (state)  
reset:    
      begin 
       if (enable == 1) 
        nextstate = S0;     
       else 
        nextstate = reset; 
      end 
S0: 
      begin 
       SU_in_a = a; 
       SU_in_b = TWO;   
       botA = SU_out_r;         
       nextstate = S1; 
      end 
S1: 
      begin 
       SU_in_a = b; 
       SU_in_b = FIVE;   
       botB = SU_out_r;        

       SQ_in_a = botA; 
       SQ_botA = SQ_out_r; 
       nextstate = S2; 
      end 
S2: 
      begin 
       SQ_in_a = botB; 
       SQ_botB = SQ_out_r;  // SQ_botB is 64 bits (32_32) 

       den_total = SQ_botA + SQ_botB; 
       den_total = den_total >> 24;    
       nextstate = S3; 
      end 
S3: 
      begin 
       DIV_in_a = FIFTY;     
       DIV_in_b = den_total;     
       N_C = DIV_out_r;       
       OBS = N_C; 
       c = N_C [31:0];  // Extract 32 bits en total (16_24)     
       all_finish = 1; 
       nextstate = reset; 
      end 

default: 
      begin 
       nextstate = reset; 
      end 
     endcase 
end 
endmodule 

OBS регистр только мой нуб способ проверить значение регистра в Modelsim, так как я игнорировать, если есть лучший способ, чтобы следить за этим.

испытательный стенд и полный код можно увидеть здесь

http://www.edaplayground.com/x/RTC

+0

Где вы определяете начальное состояние? – Morgan

+2

@ sujeto1 Код на EDA Playground, похоже, не отличается от кода. Вы публикуете правильный URL? –

+0

@MatthewTaylor Я исправил ссылку, на самом деле игровая площадка эды не хочет компилироваться, но Quartus II делает это. Было бы здорово, если бы вы могли быстро взглянуть, я мог бы совершить ошибку noobie во что-то (модуль подразделения был проверен много раз сам). Я попробую и то, что Морган так любезно рекомендовал. – sujeto1

ответ

2

Не полный ответ только быстрые наблюдения:

always @ (posedge clk) 
    state <= nextstate; //Use Non blocking 

    always @* // Auto sensitivity list 
    begin 
    case (state) 

Я также хотел бы рекомендовать переустановку свое состояние:

always @ (posedge clk or negedge rst_n) 
    if (~rst_n) 
    state <= 'b0 ; 
    else 
    state <= nextstate; //Non blocking 
+0

Эй, Морган, вы знаете, если я делаю Auto Sensitivity при всегда удалении разрешения от него, как бы начать процесс?Я имею в виду, что «состояние» активируется «nextstate», и он активируется каждый clk НО, «nexstate» не имеет ничего внутри, когда процесс запускается. Поэтому я предполагаю, что это необходимо для включения или запуска или такого сигнала. – sujeto1

+0

Если «первый» не является сигналом, который автоматически устанавливается от 1 до 0 после активации, в противном случае он будет постоянно активировать состояние <= b0. – sujeto1

+1

@ sujeto1 вам придется диск сбросить форму тестового жгута, но ваш правильный, как и сбрасывает работу, поэтому, когда вы поворачиваете электронику, все находится в предопределенном состоянии, не предполагайте, что это будет 0. – Morgan

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

  • Нет связанных вопросов^_^