Страница 1 из 1
Вопрос по Verilog
Добавлено: Сб окт 01, 2016 13:17:46
TommyVersace
Здравствуйте!
Начал изучать Verilog и сразу возник вопрос.
Нашел код SPI протокола, все работает, компилируется, все хорошо.
Только есть одна проблема: Когда вывожу на диаграмму внутренние регистры модуля, они все находятся в неопределенном состоянии.
Перерыл все учебники по Verilog, великий гугл тоже отказался помогать.
Прошу помощи у знающих людей.
Выкладываю файл с кодом и тест-бенчем (на форум залить не смогу, так как больше 1 МБ)
Файл:
http://www.fayloobmennik.net/6603390
Если потребуется могу сюда выложить открытый код.
P.S Писалось в Aldec HDL 9.3
Спасибо за внимание!
Re: Вопрос по Verilog
Добавлено: Вс окт 02, 2016 12:48:36
Meteor
TommyVersace писал(а):Выкладываю файл с кодом и тест-бенчем (на форум залить не смогу, так как больше 1 МБ)
Вот не хочется мне копировать проект с обменников.
Сделайте две кодовые вставки с самим кодом и Вам наверняка помогут (уверен что только код на блок SPI и его тестбэнч весят гораздо меньше 1 МБ).
Re: Вопрос по Verilog
Добавлено: Вс окт 02, 2016 19:13:02
TommyVersace
Спасибо за совет.
Выкладываю 2 файла с кодом.
Хотелось бы понять почему внутренние регистры находятся в неопределенном состоянии и как это можно исправить/настроить.
Интересуют регистры "control" и "count"
Спасибо!
Re: Вопрос по Verilog
Добавлено: Вс окт 02, 2016 21:45:51
Meteor
Совсем слаб в верилоге.
Но даже просмотр по диагонали показал, что в проекте нет и намека на сигнал сброса и реакции на него (обнуление или установка в единицы) регистров.
Без этого сигнала, задействованные регистры имеют полное право находиться в любом состоянии сразу после включения питания.
Уверен на 99,9999(9)% что все Ваши беды именно в этом.
Добавьте сигнал сброса и проинициируйте им состояния регистров.
Re: Вопрос по Verilog
Добавлено: Пн окт 03, 2016 08:04:04
TommyVersace
Ресет реализован в самом конце кода в блоке initial.
Initial
begin
mosi = 0;
control = 0;
.
.
.
count = 0;
end
Re: Вопрос по Verilog
Добавлено: Пн окт 03, 2016 16:40:01
TommyVersace
Или, если максимально упростить, то можно рассмотреть такой пример:
`timescale 10ns/1ns
module test_bit (
input clk,
input reset,
input [7:0] data_1,
output reg P,
);
reg Z;
always @(posedge clk or negedge reset)
begin
if (reset)
begin
Z = 0;
end
else
begin
P = data_1[0] ^ data_1[1] ^ data_1[2] ^ data_1[3] ^ data_1[4] ^ data_1[5] ^ data_1[6] ^ data_1[7];
Z = P;
end
end
endmodule
Тест-бенч:
`timescale 1ps / 1ps
module test_bit_tb;
//Internal signals declarations:
reg clk;
reg reset;
reg [7:0]data_1;
wire P;
reg Z;
// Unit Under Test port map
test_bit UUT (
.clk(clk),
.reset(reset),
.data_1(data_1),
.P(P)
);
initial
begin
clk = 0;
reset = 0;
data_1 = 8'b1111_1111;
end
always
begin
#5 clk = ~clk;
end
initial
begin
clk = 1;
#10
reset = 1;
#10
reset = 0;
//data_1=8'b1111_1111;
#1000
$finish;
end
initial
$monitor($realtime,,"ps %h %h %h ",clk,reset,data_1,P,Z);
endmodule
И внутренний регистр "Z" находится в неопределенном состоянии даже после того как пришел сигнал ресет.
Не могу понять в чем тут дело.
Re: Вопрос по Verilog
Добавлено: Вт апр 18, 2017 01:24:32
Alik221
Скорее всего схема просто не успевает выполнить сброс. У вас во первых условие negedge reset с последующей проверкой if (reset) бесполезно, а во вторых reset вы держите ровно между двумя posedge clock. Увеличьте время reset и поменяйте условие сброса на if (~reset).