Я пытаюсь реализовать сигнал 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?)
Чтобы подвести итог, приходит
- valid_input ==> enable = 1,
- Счетчик тактов и вычисления начинаются параллельно,
- После 5-го тактового цикла: окончательный расчет выполнен, data_valid = 1,
- Сброс счетчика, data_valid = 0, ожидание следующего допустимого ввода и включение = 1.
Вопросы:
Что-то не так с моей концепцией?Как я могу поддерживать правильный подсчет с самого начала в зависимости от моих контрольных сигналов?
Пожалуйста, имейте в виду, что в конце дня я сделаю синтез, и условием моего проекта является использование наименьшей площади.
Итак, как лучше всего выполнить условие: «if count == 5», «data_valid <= 1'b1»? </p>