Программируемая логика - это не так уж и сложно. Разберемся вместе.
Ответить

Вопрос по Verilog

Сб окт 01, 2016 13:17:46

Здравствуйте!
Начал изучать Verilog и сразу возник вопрос.
Нашел код SPI протокола, все работает, компилируется, все хорошо.
Только есть одна проблема: Когда вывожу на диаграмму внутренние регистры модуля, они все находятся в неопределенном состоянии.
Перерыл все учебники по Verilog, великий гугл тоже отказался помогать.
Прошу помощи у знающих людей.
Выкладываю файл с кодом и тест-бенчем (на форум залить не смогу, так как больше 1 МБ)
Файл: http://www.fayloobmennik.net/6603390

Если потребуется могу сюда выложить открытый код.

P.S Писалось в Aldec HDL 9.3

Спасибо за внимание!

Re: Вопрос по Verilog

Вс окт 02, 2016 12:48:36

TommyVersace писал(а):Выкладываю файл с кодом и тест-бенчем (на форум залить не смогу, так как больше 1 МБ)

Вот не хочется мне копировать проект с обменников.
Сделайте две кодовые вставки с самим кодом и Вам наверняка помогут (уверен что только код на блок SPI и его тестбэнч весят гораздо меньше 1 МБ).

Re: Вопрос по Verilog

Вс окт 02, 2016 19:13:02

Спасибо за совет.
Выкладываю 2 файла с кодом.

Хотелось бы понять почему внутренние регистры находятся в неопределенном состоянии и как это можно исправить/настроить.

Интересуют регистры "control" и "count"

Спасибо!
Вложения
SPI.txt
(5.02 KiB) Скачиваний: 271
test_bench.txt
(1.23 KiB) Скачиваний: 304

Re: Вопрос по Verilog

Вс окт 02, 2016 21:45:51

Совсем слаб в верилоге.
Но даже просмотр по диагонали показал, что в проекте нет и намека на сигнал сброса и реакции на него (обнуление или установка в единицы) регистров.
Без этого сигнала, задействованные регистры имеют полное право находиться в любом состоянии сразу после включения питания.
Уверен на 99,9999(9)% что все Ваши беды именно в этом.
Добавьте сигнал сброса и проинициируйте им состояния регистров.

Re: Вопрос по Verilog

Пн окт 03, 2016 08:04:04

Ресет реализован в самом конце кода в блоке initial.

Initial
begin
mosi = 0;
control = 0;
.
.
.
count = 0;
end

Re: Вопрос по Verilog

Пн окт 03, 2016 16:40:01

Или, если максимально упростить, то можно рассмотреть такой пример:

`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

Скорее всего схема просто не успевает выполнить сброс. У вас во первых условие negedge reset с последующей проверкой if (reset) бесполезно, а во вторых reset вы держите ровно между двумя posedge clock. Увеличьте время reset и поменяйте условие сброса на if (~reset).
Ответить