МАРСОХОД

Open Source Hardware Project

Добро пожаловать, Гость
Логин: Пароль: Запомнить меня

ТЕМА: Вопросы по языку Verilog

Re: Вопросы по языку Verilog 7 года 2 дн. назад #1185

вот ссылка на проект vg.ucoz.ru/oscill/EPM240T100C5.zip
писано в quartus 9.1 sp2

немного опишу задачу:

при помощи плис я хочу сделать устройство захвата для самодельного цифрового осцилографа
частота дискретизации планируется в 80 мгц (АЦП AD9057)

внешний контроллер будет управлять плис, по шине состоящей из D7-D0, и сигналов управления WR и CS (10 проводов)
нужны следующие команды:
0х00- нет операции
0х01 - установка 8 младших бит адреса
0х02 - установка средних 8 бит адреса
0х03 - установка старшего бита адреса
0х04 - чтение памяти
0x05 - запуск однократного преобразования\захвата входного сигнала

команды 0х01-0х05 двубайтовые, вслед за кодом команды идет 1 байт параметра, в 0х01-0х03 - это часть адреса (всего адресуется 128 кб озу), 0х04 - шаг приращения адреса при чтении (от 1 до 255), в 0х05 - делитель частоты преобразования

описал железо:
input wire clk;	// тактирующий сигнал (80 мгц)
input wire wr;  // сигнал выбора операции записи\чтения
input wire cs;  // строб операции
input wire [7:0] data8;  // шина данных\команд плис

output reg [16:0] adr_ram; // шина адреса для ram
output reg adc_enc;	// управление выборкой из АЦП
output reg reg_adc_cs;	// управление регистром АЦП
output reg reg_ram_cs; // управление регистром RAM
output reg ram_wr;		// сигнал выбора операции RAM запись\чтение
output reg ram_oe;     // строб операции с RAM

reg[16:0] adr_value;	// внутренний регистр адреса RAM для операций
reg wait_add_byte;		// признак ожидания доп. байта команды
reg	[2:0] commtype;     // команда
reg int_wr;             // сохранение копии сигнала wr
reg [7:0] adr_step;     // шаг приращения адреса для чтения RAM

дальше хочу по фронту сигнала cs считывать команду и доп. байт к ней (или читать память), выполнять какое то действие, и по спаду сигнала сбрасывать состояние управляемых устройств

для этого в always прописал реагирование на любое изменение cs
always @(cs)  // при изменении cs
begin
	if (cs==1)
		begin
			// дешифровка записываемой в ПЛИС команды   
			int_wr<=wr;	// сохраним вид операции (чтение\запись)

			if (wr==0) // запись команды в ПЛИС
				begin
					if (wait_add_byte==0) // принимаем первый байт
						begin
							wait_add_byte<=1;     // в следующий раз принимаем доп. байт 
							commtype<=data8[2:0]; // запомним полученную команду
							if (commtype==`NOP) wait_add_byte<=0; // у команды NOP нет доп. байта

						end else // получаем дополнительный байт команды
								begin
									wait_add_byte<=0; // следующий принимаемый байт - команда
									case (commtype)
				 					  `SET_L8:  begin  // принимаем младшие 8 бит адреса для чтения
													adr_value[7:0]<=data8[7:0];
												end	
						        
									  `SET_M8:  begin	// принимаем средние 8 бит адреса для чтения
													adr_value[15:8]<=data8[7:0];
												end
						        
									  `SET_H8:  begin	// принимаем старший бит адреса для чтения
													adr_value[16]<=data8[0];
												end
						        
									`RAM_READ:  begin	// принимаем шаг приращения адреса для чтения
													adr_step<=data8;
												end
		
									`ADC_SYNC:  begin
												end
						        
								   `ADC_START:  begin
												end				        
									endcase
								end
				end else // здесь у нас wr=0
						begin		// чтение из памяти
							adr_ram<=adr_value; 	// выдадим адрес для операции чтения
							ram_wr<=1;  // операция чтения
							ram_oe<=0;  // строб
						end
		end

соответственно когда сигнал cs снимается - мы прекращаем исполнение команды
			else  // при спаде импульса по cs
				begin
					if (int_wr==1) // у нас была операция чтения ?  
						begin
							if (commtype==`RAM_READ)
								begin
									ram_oe<=1;  // отключим чтение с SRAM								
									adr_value<=adr_value+adr_step; // прирастим адрес для чтения на шаг
								end	
						end
				end
end

этот код компилируется с какими то не понятными мне предупреждениями

Warning: Circuit may not operate. Detected 3 non-operational path(s) clocked by clock "wr" with clock skew larger than data delay. See Compilation Report for details.

Warning: Circuit may not operate. Detected 1 non-operational path(s) clocked by clock "cs" with clock skew larger than data delay. See Compilation Report for details.

Warning: Found 16 node(s) in clock paths which may be acting as ripple and/or gated clocks -- node(s) analyzed as buffer(s) resulting in clock skew
Info: Detected ripple clock "wait_add_byte" as buffer
Info: Detected ripple clock "commtype[2]" as buffer
Info: Detected ripple clock "int_wr" as buffer
Info: Detected ripple clock "commtype[0]" as buffer
Info: Detected ripple clock "commtype[1]" as buffer
Info: Detected gated clock "adr_value[16]~3" as buffer
Info: Detected gated clock "adr_value[8]~2" as buffer
Info: Detected gated clock "wait_add_byte~2" as buffer
Info: Detected gated clock "commtype[0]~0" as buffer
Info: Detected gated clock "adr_value[16]~0" as buffer
Info: Detected gated clock "adr_value[0]~1" as buffer
Info: Detected gated clock "rtl~0" as buffer
Info: Detected gated clock "ram_oe~1" as buffer
Info: Detected gated clock "ram_oe~0" as buffer
Info: Detected gated clock "wait_add_byte~0" as buffer
Info: Detected gated clock "adr_ram[16]~0" as buffer

что написано не так как нужно ?

ссылка на архив проекта в начале сообщения

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от ВитГо.

Re: Вопросы по языку Verilog 7 года 2 дн. назад #1186

  • nckm
  • nckm аватар
  • Не в сети
  • Администрация форума
  • Администрация форума
  • Сообщений: 101
  • Спасибо получено: 29
могу дать только простой совет - не пытайтесь программировать на verilog как на обычных языках программирования.
Нужно немного поменять мышление.
Прежде всего нужно понять, что в цифровой схемотехнике существует (условно говоря) только один тип запоминания - запоминание в регистре-триггере по фронту сигнала.

always @(posedge clk)
a <= a+1;

Других методов просто нет. Это объясняется тем, что обычный D-триггер имеет только вход данных и вход тактирования записи, ну еще асинхронный сброс и разрешение записи. Все. Все конструкции verilog могут оперировать только этими сигналами.

Нельзя запоминать по уровню - получаются защелки latch (но лучше так не делать - их наличие признак плохого проектирования).

Если вы пишите

always @(a)
b=a+c;

То никаких триггеров в результирующей схеме не получится.

Обязательно почитайте
https://marsohod.org/verilog/153-verilogpictflop

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Вопросы по языку Verilog 7 года 2 дн. назад #1187

у меня сейчас следующие предупреждения:
Warning: Output pins are stuck at VCC or GND
Warning (13410): Pin "ram_wr" is stuck at VCC
Warning (13410): Pin "ram_oe" is stuck at GND

в конфигураторе выводов ram_wr и ram_oe идут как output
причем здесь vcc и gnd ? где я что напутал?

и второе сообщение:
Warning: Found pins functioning as undefined clocks and/or memory enables
Info: Assuming node "cs" is an undefined clock

это вообще о чем ?

код сейчас сделал таким (выкинул все)
ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от ВитГо.

Re: Вопросы по языку Verilog 7 года 2 дн. назад #1188

  • nckm
  • nckm аватар
  • Не в сети
  • Администрация форума
  • Администрация форума
  • Сообщений: 101
  • Спасибо получено: 29

ВитГо пишет: у меня сейчас следующие предупреждения:
Warning: Output pins are stuck at VCC or GND
Warning (13410): Pin "ram_wr" is stuck at VCC
Warning (13410): Pin "ram_oe" is stuck at GND

у вас в проекте сигналы ram_wr и ram_oe не изменяются ни при каких условиях. Компилятор их просто присоединил к VCC и GND соответственно

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Вопросы по языку Verilog 7 года 2 дн. назад #1189

Спасибо за пояснение, тогда это не страшно, просто еще над записью в память не думал...

а второе сообщение:
Warning: Found pins functioning as undefined clocks and/or memory enables
Info: Assuming node "cs" is an undefined clock

это о чем ?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Вопросы по языку Verilog 7 года 2 дн. назад #1190

  • nckm
  • nckm аватар
  • Не в сети
  • Администрация форума
  • Администрация форума
  • Сообщений: 101
  • Спасибо получено: 29

ВитГо пишет: Спасибо за пояснение, тогда это не страшно, просто еще над записью в память не думал...

а второе сообщение:
Warning: Found pins functioning as undefined clocks and/or memory enables
Info: Assuming node "cs" is an undefined clock

это о чем ?


если сигнал с входного пина попадает на вход clk хотя бы одного триггера в проекте (а у вас попадает always @(posedge cs)), то компилятор автоматически считает этот сигнал тактовой частотой. Однако в настройках проекта нигде не описаны параметры этого сигнала: какое значение частоты, ее скважность и т.д. В принципе это не очень важно при низких частотах. Но можно в Quartus II назначить в настройках проекта.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Вопросы по языку Verilog 6 года 10 мес. назад #1308

Всё! Сдаюсь! После половины дня проведённого с литературой, гуглом и Quartus'ом так и не смог решить простейшую проблему:
Есть код
module DC_BCD_to_7SEG(
input wire [3:0] in,
//reg [6:0] out,
output reg A, B, C, D, E, F, G );

// Здесь назначим соответствие выходных проводов их позиции в переменной out
assign out[0] = A;
assign out[1] = B;
assign out[2] = C;
assign out[3] = D;
assign out[4] = E;
assign out[5] = F;
assign out[6] = G;

always @*
begin
	case(in)
// Этот код для индикаторов с общим КАТОДОМ, на аноды подаём "1"
	   0:	out = 7'b0111111;
	   1:	out = 7'b0000110;
	   2:	out = 7'b1011011;
	   3:	out = 7'b1001111;
	   4:	out = 7'b1100110;
	   5:	out = 7'b1101101;
	   6:	out = 7'b1111101;
	   7:	out = 7'b0000111;
	   8:	out = 7'b1111111;
	   9:	out = 7'b1101111;
		default:
				out = 7'b0001000; // зажигаем нижний сегмент если код выходит за диапазон [0...9]
   	endcase

// Так как у меня индикатор с общим анодом придётся инвертировать уровни на выходах
assign out = ~out;

end
endmodule 

каким образом обозначить
out [6:0]
чтобы он не был выходом (я из этого делаю символ а дальше в главный графический модуль проекта).

Простым языком: как мне соотнести в программе выходные пины A, B, C,... битам в некоторой переменной out имеющей 7 бит?
Спасибо.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

"Холодает" - подумал Волк и натянул Красную Шапочку по самые уши...
Последнее редактирование: от Серый Волк.

Re: Вопросы по языку Verilog 6 года 10 мес. назад #1309

Зачем такое городить?
Вот:


module decimal_indicator(
input wire [3:0]number,
output reg [6:0]indicator
);

always @*
begin
case(number)
0: indicator = 7'b0111111;
1: indicator = 7'b0000110;
2: indicator = 7'b1011011;
3: indicator = 7'b1001111;
4: indicator = 7'b1100110;
5: indicator = 7'b1101101;
6: indicator = 7'b1111101;
7: indicator = 7'b0000111;
8: indicator = 7'b1111111;
9: indicator = 7'b1101111;
default:
indicator = 7'b1000000;
endcase
end

endmodule

В зависимости от того что там у вас анод или катод меняете местами нули с единицами.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Вопросы по языку Verilog 6 года 10 мес. назад #1310

В планах было добавить вход для переключения с ОА или ОК. На плате просто перемычку.
И всё же - как мне выставить соответствие выходов?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

"Холодает" - подумал Волк и натянул Красную Шапочку по самые уши...
Последнее редактирование: от Серый Волк.

Re: Вопросы по языку Verilog 6 года 10 мес. назад #1311

То есть дотянуться до пинов из внутреннего модуля? По-моему никак. Принцип инкапсуляции - всё что модуль может сделать с окружением он делает через интерфейс. Хотя да, например для отладки светодиодами было бы удобно.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Время создания страницы: 0.247 секунд

ВКонтакте  facebook  GitHub  YouTube  Twitter