Данные действительный сигнал в Verilog - PullRequest
0 голосов
/ 10 марта 2019

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

Для реализованного мной модуля требуется 5 тактовых циклов для получения действительных выходных данных. Идея состоит в том, чтобы считать до 5 тактов и после этого установить действительный сигнал на высокий, а затем сбросить счетчик после предоставления действительных данных.

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

Пример кода:

module control_unit (  
        input   [3:0] a,
        input   [3:0] b,            
        input   [3:0] m,            
        input         clk, 
        input         enable, 
        input         nreset,
        output        data_valid, 
        output  [7:0] o
);

        reg [7:0] r1;
        reg [4:0] c;
        reg  count;

        always @(posedge clk or negedge nreset)
            begin
            if (~nreset) count <= 1'b0;
            else if (enable)            
                count <= count+1'b1;
            else count = count;
            end

        assign data_valid = (count == 1'b1) ? 1'b1 : 1'b0;


        always @(posedge clk)
            begin
                c <= a+b;
                r1 <= c[3:0]*m;
            end     

        assign o = r1;

endmodule

Код испытательного стенда:

`timescale 1ns/10ps
module tb_control_unit (
                    );


 reg clk;
 reg enable;
 reg nreset;
 wire data_valid;
 reg[3:0] a,b,m;
 wire [7:0] o;

 control_unit control_unit_i (
            .clk(clk),
            .enable(enable),
            .nreset(nreset),
            .data_valid(data_valid),
            .a(a),
            .b(b),
            .m(m),
            .o(o)
                  );


 parameter CLKPERIODE = 10;

 initial clk = 1'b1;
 always #(CLKPERIODE/2) clk = !clk;
 initial enable = 1'b1;

 initial begin

 a = 4'b0001;
 b = 4'b0001;
 m = 4'b0010;

#10 nreset =1'b0;
//#20 nreset =1'b1;

#20 a = 4'b0010;
 b = 4'b0010;
 m = 4'b0001;

#100 $finish();
end

endmodule

Обратите внимание: текущее состояние кода представляет собой версию моих многочисленных испытаний, основанных на моих навыках новичка.

Проблема, с которой я сталкиваюсь, заключается вчто сигнал data_valid не обеспечивает какого-либо выхода должным образом в первые несколько тактов, и мой счетчик не синхронизирован из-за этого (возможно, оператор присвоения является одной из многих причинs?)

Чтобы подвести итог, приходит

  1. valid_input ==> enable = 1,
  2. Счетчик тактов и вычисления начинаются параллельно,
  3. После 5-го тактового цикла: окончательный расчет выполнен, data_valid = 1,
  4. Сброс счетчика, data_valid = 0, ожидание следующего допустимого ввода и включение = 1.

Вопросы:

Что-то не так с моей концепцией?Как я могу поддерживать правильный подсчет с самого начала в зависимости от моих контрольных сигналов?

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

Итак, как лучше всего выполнить условие: «if count == 5», «data_valid <= 1'b1»? </p>

1 Ответ

1 голос
/ 10 марта 2019

Во-первых, как Серж уже сказал: почему вы не даете ему сброс?

Во-вторых:

Идея состоит в том, чтобы считать до 5 тактов и после этого установить действительныесигнал на максимум

Но ваш компаратор говорит: data_valid = (count == 1'b1) ... Почему вы сравниваете с одним?

Третий:

valid_input приходит тогда ==>enable = 1,

Но ваш код показывает обратное: valid получен из enable.

Forth: count только один бит.Вы можете посчитать 0,1, и это все.Чтобы сосчитать до пяти, нужно сделать его больше, по крайней мере, на 3 бита.

Пятое: Вы не устанавливаете счетчик обратно после того, как используете его.Он продолжает отсчитывать, поэтому переворачивается и запускается снова, а с 3-битным счетчиком вы будете получать data_valid каждые 8 ​​тактов.

Я предлагаю вам все это исправить, а затем повторите попытку.

...