Здравствуйте!
Начал изучать Verilog и сразу возник вопрос.
Нашел код SPI протокола, все работает, компилируется, все хорошо.
Только есть одна проблема: Когда вывожу на диаграмму внутренние регистры модуля, они все находятся в неопределенном состоянии.
Перерыл все учебники по Verilog, великий гугл тоже отказался помогать.
Прошу помощи у знающих людей.
Выкладываю файл с кодом и тест-бенчем (на форум залить не смогу, так как больше 1 МБ)
Файл: http://www.fayloobmennik.net/6603390
Если потребуется могу сюда выложить открытый код.
P.S Писалось в Aldec HDL 9.3
Спасибо за внимание!
Вопрос по Verilog
-
TommyVersace
- Первый раз сказал Мяу!
- Сообщения: 24
- Зарегистрирован: Сб окт 01, 2016 13:03:46
- Реклама
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
Re: Вопрос по Verilog
Вот не хочется мне копировать проект с обменников.TommyVersace писал(а):Выкладываю файл с кодом и тест-бенчем (на форум залить не смогу, так как больше 1 МБ)
Сделайте две кодовые вставки с самим кодом и Вам наверняка помогут (уверен что только код на блок SPI и его тестбэнч весят гораздо меньше 1 МБ).
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
-
TommyVersace
- Первый раз сказал Мяу!
- Сообщения: 24
- Зарегистрирован: Сб окт 01, 2016 13:03:46
Re: Вопрос по Verilog
Спасибо за совет.
Выкладываю 2 файла с кодом.
Хотелось бы понять почему внутренние регистры находятся в неопределенном состоянии и как это можно исправить/настроить.
Интересуют регистры "control" и "count"
Спасибо!
Выкладываю 2 файла с кодом.
Хотелось бы понять почему внутренние регистры находятся в неопределенном состоянии и как это можно исправить/настроить.
Интересуют регистры "control" и "count"
Спасибо!
- Вложения
-
- SPI.txt
- (5.02 КБ) 308 скачиваний
-
- test_bench.txt
- (1.23 КБ) 410 скачиваний
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
Re: Вопрос по Verilog
Совсем слаб в верилоге.
Но даже просмотр по диагонали показал, что в проекте нет и намека на сигнал сброса и реакции на него (обнуление или установка в единицы) регистров.
Без этого сигнала, задействованные регистры имеют полное право находиться в любом состоянии сразу после включения питания.
Уверен на 99,9999(9)% что все Ваши беды именно в этом.
Добавьте сигнал сброса и проинициируйте им состояния регистров.
Но даже просмотр по диагонали показал, что в проекте нет и намека на сигнал сброса и реакции на него (обнуление или установка в единицы) регистров.
Без этого сигнала, задействованные регистры имеют полное право находиться в любом состоянии сразу после включения питания.
Уверен на 99,9999(9)% что все Ваши беды именно в этом.
Добавьте сигнал сброса и проинициируйте им состояния регистров.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
-
TommyVersace
- Первый раз сказал Мяу!
- Сообщения: 24
- Зарегистрирован: Сб окт 01, 2016 13:03:46
Re: Вопрос по Verilog
Ресет реализован в самом конце кода в блоке initial.
Initial
begin
mosi = 0;
control = 0;
.
.
.
count = 0;
end
Initial
begin
mosi = 0;
control = 0;
.
.
.
count = 0;
end
- Реклама
-
TommyVersace
- Первый раз сказал Мяу!
- Сообщения: 24
- Зарегистрирован: Сб окт 01, 2016 13:03:46
Re: Вопрос по Verilog
Или, если максимально упростить, то можно рассмотреть такой пример:
`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" находится в неопределенном состоянии даже после того как пришел сигнал ресет.

Не могу понять в чем тут дело.
`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
Скорее всего схема просто не успевает выполнить сброс. У вас во первых условие negedge reset с последующей проверкой if (reset) бесполезно, а во вторых reset вы держите ровно между двумя posedge clock. Увеличьте время reset и поменяйте условие сброса на if (~reset).


