вопросы по Verilog

Программируемая логика - это не так уж и сложно. Разберемся вместе.
Ответить
Мучитель микросхем
Сообщения: 426
Зарегистрирован: Чт авг 09, 2012 08:57:20

Сообщение Nevox »

придется думать что-то гениальное....
потому что прошивка на AHDL влезает и работает)
Реклама
Прорезались зубы
Сообщения: 231
Зарегистрирован: Пт ноя 16, 2007 13:52:44
Откуда: Рига, Латвия

Сообщение Pe3ucTop »

Кажется вы не внимательны!
1) В исходном коде только один регистр ! IN_REG[15..0] , остальное всё логические действия !
2) Вы не разобрались как работать с портом ввода/вывода т.е. двунаправленным, и поэтому наверное код не работает..

Пример от Алтеры:

Код: Выделить всё

module bidirec (oe, clk, inp, outp, bidir);
// Port Declaration
input   oe;
input   clk;
input   [7:0] inp;
output  [7:0] outp;
inout   [7:0] bidir;

reg     [7:0] a;
reg     [7:0] b;

assign bidir = oe ? a : 8'bZ ;
assign outp  = b;

// Always Construct
always @ (posedge clk)
begin
    b <= bidir;
    a <= inp;
end

endmodule
Тоесть читаем состояние порта когда ему присвоено состояние "Z"

В остальном, хорошо что двигаетесь вперёд..
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1733
Зарегистрирован: Чт авг 21, 2008 22:03:30
Откуда: Одесса(Украина)

Сообщение РадиоЛоматель »

Добрый день! Такая проблема. Есть код на Verilog, который, по идее, реализует машину состояний для инициализации динамической памяти. Проблема в том, что при компиляции в State Machine Viewer-е эта машина состояний просматривается как пустая. Соответственно, в железке ничего не срабатывает. Уменьшил код до такого:
Спойлер

Код: Выделить всё

module MemInit (
		//Тактирование
		input wire mem_clk_133MHz,
		input wire mem_clk_lock,
		input wire nreset,
		
		output wire init_done,
		//output wire [2:0] init_cmd,
		//output wire [21:0] init_adr,
		input wire cmd_ack
	);
	
	/*****************************************************************/
	//Описание состояний
	localparam [3:0]
		state_begin 	= 4'b0000,
		state_loadreg1 = 4'b0001,
		state_iwait 	= 4'b0010,
		state_prech 	= 4'b0011,
		state_prwait 	= 4'b0100,
		state_fautor 	= 4'b0101,
		state_fwait 	= 4'b0110,
		state_sautor 	= 4'b0111,
		state_swait 	= 4'b1000,
		state_loadmr 	= 4'b1001,
		state_loadreg2 = 4'b1010,
		state_done 		= 4'b1111;
			
	/*****************************************************************/
	//регистры
	reg [3:0] state = state_begin;
	reg [3:0] next_state = state_begin;
		
	reg init_done_reg = 0, next_init_done_reg;
	reg [31:0] cycle_counter = 0;
	reg [31:0] next_cycle_counter = 0;
	
	assign init_done = init_done_reg;
	
	/*****************************************************************/
	//Тактирование
	wire clk;
	assign clk = mem_clk_133MHz & mem_clk_lock;
	
	always @(posedge clk or negedge nreset) begin
		if(!nreset) begin		//Сброс
			state <= state_begin;
			init_done_reg <= 0;
		end
		else begin				//Нормальная работа
			state <= next_state;
			init_done_reg <= next_init_done_reg;
			cycle_counter <= next_cycle_counter;
		end
	end
	
	/*****************************************************************/
	//Машинка состояний
	always @* begin
		next_state = state;
		next_init_done_reg = init_done_reg;
		
		next_cycle_counter = cycle_counter + 32'b1;
		
		case (state)
			state_begin:
				begin
					next_cycle_counter = 0;
					next_state = state_iwait;
				end
			state_iwait:
				begin
					if(cycle_counter >= 32'd133000) next_state = state_done;
				end
			state_done:
				begin
					next_init_done_reg = 1;
				end
			default:
				begin
					next_state = state_begin;
					next_init_done_reg = 0;
				end
		endcase
	end
	
endmodule
Все равно, машина состояний остаётся пустой, регистр init_done_reg никогда не становится единицей, хотя ошибится тут трудно, вроде как. Уже бьюсь головой об стену. Что я делаю не так?
(*tmp) &= ~( ( (param1 & (1<<PARAM1_BIT6)) || ((param2==PARAM2_TRUE)&&(--param3)) ) ? (param1 & (~param2)) : (Func1() | FUNC1_FLAGS) );
Люблю Си...
Контактная информация:
Родился
Сообщения: 10
Зарегистрирован: Вт окт 22, 2013 18:20:52

Сообщение Pawel91 »

Хочу освоить verilog
Создал программу счетчика

module q1 (led [29:0], clk);
input clk;
output reg [29:0]led;
always @(posedge clk)
begin
#100
led <= led + 1'd1;
end
endmodule

Почему задержка не срабатывает?
Реклама
Эиком - электронные компоненты и радиодетали
Мудрый кот
Аватара пользователя
Сообщения: 1733
Зарегистрирован: Чт авг 21, 2008 22:03:30
Откуда: Одесса(Украина)

Сообщение РадиоЛоматель »

Pawel91 писал(а):Почему задержка не срабатывает?
Что значит, не срабатывает? Написанное вами значит, что между положительным фронтом clk и изменением значения регистра leds будет задержка 100 нс. Но частота изменений регистра leds будет определяться частотой тактирования clk. Вот вам картинка для пояснения:

Изображение
(*tmp) &= ~( ( (param1 & (1<<PARAM1_BIT6)) || ((param2==PARAM2_TRUE)&&(--param3)) ) ? (param1 & (~param2)) : (Func1() | FUNC1_FLAGS) );
Люблю Си...
Контактная информация:
Реклама
Родился
Сообщения: 10
Зарегистрирован: Вт окт 22, 2013 18:20:52

Сообщение Pawel91 »

Я так и предполагал, но симуляция в квартус выдает другое.
Задержка получается 6.819
(картинку загрузить не получилось((()
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

Не уверен что верилог сильно отличается, но в вхдл, задержка имеет смысл только в моделировании (например что бы задать смещение сигналов), а в синтезе (речь как я понял именно о синтезе) команда задержки не работает.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Родился
Сообщения: 10
Зарегистрирован: Вт окт 22, 2013 18:20:52

Сообщение Pawel91 »

Я вот как раз и делал моделирование :( , modelsim пока не осилил, делал во встроенной в 13 квартусе системе моделирования(waveform editor), указал на конкретно временное моделирование, я вообще делаю лабы студентам, мне нужно полностью изучить этот язык, так как лабы будут на освоение этого языка. Вот хочу научиться как правильно писать задержки для модулей.
Мудрый кот
Аватара пользователя
Сообщения: 1733
Зарегистрирован: Чт авг 21, 2008 22:03:30
Откуда: Одесса(Украина)

Сообщение РадиоЛоматель »

Pawel91 писал(а):Я вот как раз и делал моделирование
А какой период у источника тактового сигнала? Может, ваша задержка кратна этому периоду?
(*tmp) &= ~( ( (param1 & (1<<PARAM1_BIT6)) || ((param2==PARAM2_TRUE)&&(--param3)) ) ? (param1 & (~param2)) : (Func1() | FUNC1_FLAGS) );
Люблю Си...
Контактная информация:
Родился
Сообщения: 10
Зарегистрирован: Вт окт 22, 2013 18:20:52

Сообщение Pawel91 »

Период разный делал и 200 и 500 нс. Задержка одна и таже
Мучитель микросхем
Сообщения: 426
Зарегистрирован: Чт авг 09, 2012 08:57:20

Сообщение Nevox »

Здравствуйте! Помогите разобраться в конечных автоматах на верилоге для альтеры.

Что можно почитать? С чего начать?
Родился
Сообщения: 10
Зарегистрирован: Вт окт 22, 2013 18:20:52

Сообщение Pawel91 »

Поддерживаю вопрос порекомендуйте пожалуйста русскоязычную литературу, раскрывающую синтаксис и семантику языка Verilog HDL, а то до сих пор не могу разобраться с функциями следующих команд :( :
cmos
deassign
pmos
pull0
pull1
pullup
pulldown
rcmos
release
rnmos
rpmos
rtran
rtranif0
rtranif1
specparam
strength
strong
notif0
notif1
strong1
tran
tranif0
tranif1
small
medium
large
force
Мучитель микросхем
Сообщения: 426
Зарегистрирован: Чт авг 09, 2012 08:57:20

Сообщение Nevox »

Помогите с мелочью.

пишу строчку :

assign CLK1=CLK2;

у меня CLK1 бежит как надо, а CLK2 просто включается в единицу и все, как правильно будет написать?
Родился
Сообщения: 10
Зарегистрирован: Вт окт 22, 2013 18:20:52

Сообщение Pawel91 »

Попробуйте
wire CLK1 = CLK2
Мучитель микросхем
Сообщения: 426
Зарегистрирован: Чт авг 09, 2012 08:57:20

Сообщение Nevox »

так не работает,мне надо вход с выходом напрямую связать(
Родился
Сообщения: 10
Зарегистрирован: Вт окт 22, 2013 18:20:52

Сообщение Pawel91 »

Т.е создать обратную связь?
Мучитель микросхем
Сообщения: 426
Зарегистрирован: Чт авг 09, 2012 08:57:20

Сообщение Nevox »

Сделать перенаправление) Т.е есть альтерка, на одну ногу приходит одно, с другой ноги выходит тоже самое, в данном случае клок.
Родился
Сообщения: 10
Зарегистрирован: Вт окт 22, 2013 18:20:52

Сообщение Pawel91 »

попробуйте
assign CLK2=CLK1 :)
Мучитель микросхем
Сообщения: 426
Зарегистрирован: Чт авг 09, 2012 08:57:20

Сообщение Nevox »

так тоже не прокатывает,делал уже)
Родился
Сообщения: 10
Зарегистрирован: Вт окт 22, 2013 18:20:52

Сообщение Pawel91 »

А какая частота ?
Ответить

Вернуться в «ПЛИС»