<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://wiki.srns.ru/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>https://wiki.srns.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Belyanushkin</id>
		<title>SRNS - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.srns.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Belyanushkin"/>
		<link rel="alternate" type="text/html" href="https://wiki.srns.ru/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Belyanushkin"/>
		<updated>2026-04-05T22:40:52Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.20.3</generator>

	<entry>
		<id>https://wiki.srns.ru/wiki/%D0%A7%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_Verilog</id>
		<title>Часы на Verilog</title>
		<link rel="alternate" type="text/html" href="https://wiki.srns.ru/wiki/%D0%A7%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_Verilog"/>
				<updated>2014-12-22T18:20:11Z</updated>
		
		<summary type="html">&lt;p&gt;Belyanushkin: /* Pmod */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Введение ==&lt;br /&gt;
&lt;br /&gt;
Для освоения программирования ПЛИС на языке Verilog была поставлена задача написания программы смысл которой заключается в подсчете времени нажатия на кнопку.&lt;br /&gt;
&lt;br /&gt;
== Подзадачи ==&lt;br /&gt;
&lt;br /&gt;
1. Установка программы ISE Design Suite 14.7 на ОС Windows 8.1. &lt;br /&gt;
&amp;lt;br/&amp;gt;2. Написание простых программ для понимания языка Verilog:&lt;br /&gt;
&amp;lt;br/&amp;gt;- Счетчик нажатий, выполняющий вывод значений в двоичной системе на диоды;&lt;br /&gt;
&amp;lt;br/&amp;gt;- Программа для работы нескольких семисегментных индикаторов.&lt;br /&gt;
&amp;lt;br/&amp;gt;3. Синтез этих программ для того, чтобы решить поставленную задачу.&lt;br /&gt;
&amp;lt;br/&amp;gt;4. Для отработки навыков реализовать часы.&lt;br /&gt;
&amp;lt;br/&amp;gt;Реализация всех программ производилась на ПЛИС Xilinx Spartan-6 на отладочной плате  DIGILENT NEXYS 3&lt;br /&gt;
&lt;br /&gt;
== Проблемы в ходе выполнения подзадач ==&lt;br /&gt;
&lt;br /&gt;
В ходе решения подзадач возникла проблема с установкой программы ISE Design Suite 14.7 на ОС Windows 8.1.&lt;br /&gt;
Проблема заключается в зависании программы при создании нового проекта.&lt;br /&gt;
&amp;lt;br/&amp;gt;Проблема была решается следующим путем:&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 1: зайти в директорию: C:\Xilinx\14.5\ISE_DS\ISE\lib\nt64&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 2: переименовать файл libPortability.dll в libPortability.dll.orig&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 3: переименовать файл libPortabilityNOSH.dll в libPortability.dll&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 4: скопировать файл libPortability.dll &amp;lt;ctrl+c&amp;gt; &lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 5: зайти в директорию C:\Xilinx\14.5\ISE_DS\common\lib\nt64&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 6: вставить файл из шага 4  &amp;lt;libPortability.dll &amp;gt; в данную директорию&lt;br /&gt;
&amp;lt;br/&amp;gt;Оригинал статьи про проблемы с работой I SE Design Suite 14.7 на ОС Windows 8.1 находится по следующей ссылке&lt;br /&gt;
[http://stuffs4studies.blogspot.ru/2014/02/is-xilinx-147-ise-crashing-in-windows-8.html]&lt;br /&gt;
&lt;br /&gt;
== Описание реализации счетчика времени нажатия кнопки ==&lt;br /&gt;
&lt;br /&gt;
[[File:Схема_new.jpg|800px]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Основными частями реализации являются счетчики:&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчик суммы времени нажатия до одной секунды;&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчик времени нажатий в секундах;&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчики для работы семисегментного индикатора.&lt;br /&gt;
&amp;lt;br/&amp;gt;Алгоритм работы счетчика таков:&lt;br /&gt;
&amp;lt;br/&amp;gt;1. При нажатии на кнопку происходит начинается счет тактовых сигналов;&lt;br /&gt;
&amp;lt;br/&amp;gt;2. При достижении количества сигналов, равного 10^8 в счетчике суммы прибавляется одна секунда, счетчик импульсов сбрасывается в ноль;&lt;br /&gt;
&amp;lt;br/&amp;gt;3. Далее с регистра, содержащего информацию о количестве секунд, эти значению передаются на дальнейшую обработку для передачи на семисегментные индикаторы.&lt;br /&gt;
&amp;lt;br/&amp;gt;4. Реализация работы семисегментных индикаторов была произведена с помощью циклов.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;Подробнее про работу с семисегментными индикаторами.&lt;br /&gt;
&amp;lt;br/&amp;gt;Так как индикаторов 4 а катоды к ним общие, то принято было работать по следующему алгоритму. Есть 2 счетчика. Один счетчик считает количество тактовых сигналов. Когда это количество становится равным 200000 то на втором счетчике прибавляется единица. В зависимости от значения на втором счетчике выбирается тот анод, на котором будет низкий уровень и значит загорится этот индикатор. Так как время циклов очень мало, то мы мы не замечаем мигание индикаторов. Второй счетчик в схеме имеет 2 разряда, поэтому сбрасывать его нет необходимости.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Симисегментный индикатор.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; На данном ниже рисунке показана схема подключения катодов и анодов. Из этой схемы наглядно видно, что для того, чтобы зажечь определенный сегмент на одном из индикаторов необходимо подать на соответствующий катод и соответствующий анод низкий уровень.&amp;lt;br/&amp;gt;&lt;br /&gt;
[[File:Работа индикатора.jpg|350px]]&lt;br /&gt;
&amp;lt;br/&amp;gt; На рисунке ниже показано, на какие выводы необходимо подать низкий уровень, чтобы зажечь необходимый сегмент&lt;br /&gt;
[[File:Индикатор.jpg]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Текст реализации счетчика времени нажатия&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
module main( &lt;br /&gt;
				input clk, &lt;br /&gt;
				input BTNS, // кнопка&lt;br /&gt;
				output [3:0] AN, // выводы к анодам для переключения семисегментных индикаторов&lt;br /&gt;
				output [7:0] ind // выводы к катодам семисегментного индикатора&lt;br /&gt;
    );&lt;br /&gt;
	 reg [3:0] assist_AN; // вспомогательный регистр для анодов семисегментных индикаторов&lt;br /&gt;
	 reg [7:0] assist_ind; // вспомогательный регистр для катодов семисегментного индикатора&lt;br /&gt;
	 reg [26:0] sum; // накапливаемое значение суммы для регистрации нажатия&lt;br /&gt;
	 reg [7:0] assist_ld; // сумматор времени нажатия кнопки&lt;br /&gt;
	 reg [3:0] nul_r; // младший сегмент индикатора&lt;br /&gt;
	 reg [3:0] first_r; // второй сегмент индикатора&lt;br /&gt;
	 reg [3:0] second_r; // третий сегмент индикатора&lt;br /&gt;
	 reg [17:0] counter; // регистр, хранящий время работы семисегментного индикатора&lt;br /&gt;
	 reg [1:0] c; // регистр указателя номера семисегментного индикатора&lt;br /&gt;
	 always @(posedge clk)&lt;br /&gt;
	 begin&lt;br /&gt;
		if (BTNS) // нажатие кнопки&lt;br /&gt;
			sum &amp;lt;= sum + 1'b1; &lt;br /&gt;
		else&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
		if (sum &amp;gt;= 27'd100000000) // суммирование времени нажатия до 1 секунды&lt;br /&gt;
			begin&lt;br /&gt;
			assist_ld &amp;lt;= assist_ld + 1'b1; // счет количества секунд&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
			end&lt;br /&gt;
		nul_r &amp;lt;= assist_ld % 10; // значение первого семисегментного индикатора&lt;br /&gt;
		first_r &amp;lt;= (assist_ld % 100 - nul_r)/10; // значение второго индикатора&lt;br /&gt;
		second_r &amp;lt;= assist_ld / 100; // значение третьего индикатора&lt;br /&gt;
		counter &amp;lt;= counter + 1'b1;&lt;br /&gt;
			if (counter == 17'd200000) // цикл работы семисегметных индикаторов&lt;br /&gt;
			begin&lt;br /&gt;
				c &amp;lt;= c + 1'b1;&lt;br /&gt;
				counter &amp;lt;= 17'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (c == 2'b00) // первый семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1110; // значение анодов&lt;br /&gt;
		case (nul_r)&lt;br /&gt;
			4'd0: assist_ind &amp;lt;= 8'b00000011; // значения катодов&lt;br /&gt;
			4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
			4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
			4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
			4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
			4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
			4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
			4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
			4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
			4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
			default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
		endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b01) // второй семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1101;&lt;br /&gt;
		case (first_r)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
				4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
				4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
				4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b10) // третий семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1011;&lt;br /&gt;
		case (second_r)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	assign AN = assist_AN; // значение на выходах к аноду равно значению вспомогательных регистров&lt;br /&gt;
	assign ind = assist_ind; // значение на выходах к катоду равно значению вспомогательных регистров&lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;ucf файл с описанием портов ввода-вывода&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NET &amp;quot;clk&amp;quot; LOC = V10;&lt;br /&gt;
NET &amp;quot;BTNS&amp;quot; LOC = B8;&lt;br /&gt;
NET &amp;quot;AN[0]&amp;quot; LOC = N16;&lt;br /&gt;
NET &amp;quot;AN[1]&amp;quot; LOC = N15;&lt;br /&gt;
NET &amp;quot;AN[2]&amp;quot; LOC = P18;&lt;br /&gt;
NET &amp;quot;AN[3]&amp;quot; LOC = P17;&lt;br /&gt;
NET &amp;quot;ind[0]&amp;quot; LOC = M13;&lt;br /&gt;
NET &amp;quot;ind[1]&amp;quot; LOC = L14;&lt;br /&gt;
NET &amp;quot;ind[2]&amp;quot; LOC = N14;&lt;br /&gt;
NET &amp;quot;ind[3]&amp;quot; LOC = M14;&lt;br /&gt;
NET &amp;quot;ind[4]&amp;quot; LOC = U18;&lt;br /&gt;
NET &amp;quot;ind[5]&amp;quot; LOC = U17;&lt;br /&gt;
NET &amp;quot;ind[6]&amp;quot; LOC = T18;&lt;br /&gt;
NET &amp;quot;ind[7]&amp;quot; LOC = T17;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализация часов ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Реализация часов отличается от счетчика времени нажатия незначительно.&lt;br /&gt;
Здесь отсутствует кнопка. Отличие в подсчете времени здесь состоит в том, что здесь счетчик времени представляет собой счетчики минут и секунд. Счет происходит до 59 минут 59 секунд, после чего все сбрасывается. В предыдущем случае счет шел до 255 секунд.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;Текст реализации&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module main( &lt;br /&gt;
				input clk, &lt;br /&gt;
				output [3:0] AN,&lt;br /&gt;
				output [7:0] ind&lt;br /&gt;
    );&lt;br /&gt;
	 reg [3:0] assist_AN;&lt;br /&gt;
	 reg [7:0] assist_ind;&lt;br /&gt;
	 reg [26:0] sum;&lt;br /&gt;
	 reg [5:0] seconds;&lt;br /&gt;
	 reg [5:0] minutes;&lt;br /&gt;
	 reg [3:0] seconds_jr; // регистр хранения значения первой цифры в счетчике секунд&lt;br /&gt;
	 reg [3:0] seconds_sr; // регистр хранения значения второй цифры в счетчике секунд&lt;br /&gt;
	 reg [3:0] minutes_jr; // регистр хранения значения первой цифры в счетчике минут&lt;br /&gt;
	 reg [3:0] minutes_sr; // регистр хранения значения второй цифры в счетчике минут&lt;br /&gt;
	 reg [17:0] counter;&lt;br /&gt;
	 reg [1:0] c;&lt;br /&gt;
	 always @(posedge clk)&lt;br /&gt;
	 begin&lt;br /&gt;
			sum &amp;lt;= sum + 1'b1;&lt;br /&gt;
		if (sum &amp;gt;= 27'd100000000)&lt;br /&gt;
			begin&lt;br /&gt;
			seconds &amp;lt;= seconds + 1'b1; //счетчик секунд&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (seconds == 6'd60)&lt;br /&gt;
			begin&lt;br /&gt;
			minutes &amp;lt;= minutes +1'b1; // счетчик минут&lt;br /&gt;
			seconds &amp;lt;= 6'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (minutes == 6'd60)&lt;br /&gt;
			minutes &amp;lt;= 6'd0;&lt;br /&gt;
		seconds_jr &amp;lt;= seconds % 10; // вычисление значения первой цифры в счетчике секунд&lt;br /&gt;
		seconds_sr &amp;lt;= seconds/10; // вычисление значения второй цифры в счетчике секунд&lt;br /&gt;
		minutes_jr &amp;lt;= minutes % 10; // вычисление значения первой цифры в счетчике минут&lt;br /&gt;
		minutes_sr &amp;lt;= minutes/10; 	// вычисление значения второй цифры в счетчике минут&lt;br /&gt;
		counter &amp;lt;= counter + 1'b1;&lt;br /&gt;
			if (counter == 17'd200000)&lt;br /&gt;
			begin&lt;br /&gt;
				c &amp;lt;= c + 1'b1;&lt;br /&gt;
				counter &amp;lt;= 17'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (c == 2'b00)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1110;&lt;br /&gt;
		case (seconds_jr)&lt;br /&gt;
			4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
			4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
			4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
			4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
			4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
			4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
			4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
			4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
			4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
			4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
			default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
		endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b01)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1101;&lt;br /&gt;
		case (seconds_sr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b10)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1011;&lt;br /&gt;
		case (minutes_jr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000010;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011110;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100100;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001100;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011000;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001000;&lt;br /&gt;
				4'd6: assist_ind &amp;lt;= 8'b01000000;&lt;br /&gt;
				4'd7: assist_ind &amp;lt;= 8'b00011110;&lt;br /&gt;
				4'd8: assist_ind &amp;lt;= 8'b00000000;&lt;br /&gt;
				4'd9: assist_ind &amp;lt;= 8'b00001000;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b11)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b0111;&lt;br /&gt;
		case (minutes_sr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	assign AN = assist_AN;&lt;br /&gt;
	assign ind = assist_ind;&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Здесь ucf файл отличается только отсутствием кнопки BTNS&amp;lt;br/&amp;gt;&lt;br /&gt;
== Pmod ==&lt;br /&gt;
&amp;lt;br/&amp;gt;Для понимания того, какие уровни сигнала на выходе Pmod на один из его выходов были поданы высокий и низкий уровни, после чего к этому выходу был подключен осциллограф. Осциллограммы представлены ниже.&lt;br /&gt;
&amp;lt;br/&amp;gt;Pmod connectors&amp;lt;br/&amp;gt;&lt;br /&gt;
[[File:Pmod.jpg|500px]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Высокий уровень(на вход подана 1)&amp;lt;br/&amp;gt;&lt;br /&gt;
[[File:RTOScreenshot_2014-12-22_0_122926.png|500px]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Низкий уровень(на вход подан 0)&amp;lt;br/&amp;gt;&lt;br /&gt;
[[File:RTOScreenshot_2014-12-22_1_123056.png|500px]]&lt;br /&gt;
&amp;lt;br/&amp;gt;--[[Участник:Belyanushkin|Belyanushkin]] ([[Обсуждение участника:Belyanushkin|обсуждение]]) 00:20, 25 ноября 2014 (MSK)&lt;/div&gt;</summary>
		<author><name>Belyanushkin</name></author>	</entry>

	<entry>
		<id>https://wiki.srns.ru/wiki/%D0%A7%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_Verilog</id>
		<title>Часы на Verilog</title>
		<link rel="alternate" type="text/html" href="https://wiki.srns.ru/wiki/%D0%A7%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_Verilog"/>
				<updated>2014-12-22T18:05:34Z</updated>
		
		<summary type="html">&lt;p&gt;Belyanushkin: /* Описание реализации счетчика времени нажатия кнопки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Введение ==&lt;br /&gt;
&lt;br /&gt;
Для освоения программирования ПЛИС на языке Verilog была поставлена задача написания программы смысл которой заключается в подсчете времени нажатия на кнопку.&lt;br /&gt;
&lt;br /&gt;
== Подзадачи ==&lt;br /&gt;
&lt;br /&gt;
1. Установка программы ISE Design Suite 14.7 на ОС Windows 8.1. &lt;br /&gt;
&amp;lt;br/&amp;gt;2. Написание простых программ для понимания языка Verilog:&lt;br /&gt;
&amp;lt;br/&amp;gt;- Счетчик нажатий, выполняющий вывод значений в двоичной системе на диоды;&lt;br /&gt;
&amp;lt;br/&amp;gt;- Программа для работы нескольких семисегментных индикаторов.&lt;br /&gt;
&amp;lt;br/&amp;gt;3. Синтез этих программ для того, чтобы решить поставленную задачу.&lt;br /&gt;
&amp;lt;br/&amp;gt;4. Для отработки навыков реализовать часы.&lt;br /&gt;
&amp;lt;br/&amp;gt;Реализация всех программ производилась на ПЛИС Xilinx Spartan-6 на отладочной плате  DIGILENT NEXYS 3&lt;br /&gt;
&lt;br /&gt;
== Проблемы в ходе выполнения подзадач ==&lt;br /&gt;
&lt;br /&gt;
В ходе решения подзадач возникла проблема с установкой программы ISE Design Suite 14.7 на ОС Windows 8.1.&lt;br /&gt;
Проблема заключается в зависании программы при создании нового проекта.&lt;br /&gt;
&amp;lt;br/&amp;gt;Проблема была решается следующим путем:&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 1: зайти в директорию: C:\Xilinx\14.5\ISE_DS\ISE\lib\nt64&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 2: переименовать файл libPortability.dll в libPortability.dll.orig&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 3: переименовать файл libPortabilityNOSH.dll в libPortability.dll&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 4: скопировать файл libPortability.dll &amp;lt;ctrl+c&amp;gt; &lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 5: зайти в директорию C:\Xilinx\14.5\ISE_DS\common\lib\nt64&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 6: вставить файл из шага 4  &amp;lt;libPortability.dll &amp;gt; в данную директорию&lt;br /&gt;
&amp;lt;br/&amp;gt;Оригинал статьи про проблемы с работой I SE Design Suite 14.7 на ОС Windows 8.1 находится по следующей ссылке&lt;br /&gt;
[http://stuffs4studies.blogspot.ru/2014/02/is-xilinx-147-ise-crashing-in-windows-8.html]&lt;br /&gt;
&lt;br /&gt;
== Описание реализации счетчика времени нажатия кнопки ==&lt;br /&gt;
&lt;br /&gt;
[[File:Схема_new.jpg|800px]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Основными частями реализации являются счетчики:&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчик суммы времени нажатия до одной секунды;&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчик времени нажатий в секундах;&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчики для работы семисегментного индикатора.&lt;br /&gt;
&amp;lt;br/&amp;gt;Алгоритм работы счетчика таков:&lt;br /&gt;
&amp;lt;br/&amp;gt;1. При нажатии на кнопку происходит начинается счет тактовых сигналов;&lt;br /&gt;
&amp;lt;br/&amp;gt;2. При достижении количества сигналов, равного 10^8 в счетчике суммы прибавляется одна секунда, счетчик импульсов сбрасывается в ноль;&lt;br /&gt;
&amp;lt;br/&amp;gt;3. Далее с регистра, содержащего информацию о количестве секунд, эти значению передаются на дальнейшую обработку для передачи на семисегментные индикаторы.&lt;br /&gt;
&amp;lt;br/&amp;gt;4. Реализация работы семисегментных индикаторов была произведена с помощью циклов.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;Подробнее про работу с семисегментными индикаторами.&lt;br /&gt;
&amp;lt;br/&amp;gt;Так как индикаторов 4 а катоды к ним общие, то принято было работать по следующему алгоритму. Есть 2 счетчика. Один счетчик считает количество тактовых сигналов. Когда это количество становится равным 200000 то на втором счетчике прибавляется единица. В зависимости от значения на втором счетчике выбирается тот анод, на котором будет низкий уровень и значит загорится этот индикатор. Так как время циклов очень мало, то мы мы не замечаем мигание индикаторов. Второй счетчик в схеме имеет 2 разряда, поэтому сбрасывать его нет необходимости.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Симисегментный индикатор.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; На данном ниже рисунке показана схема подключения катодов и анодов. Из этой схемы наглядно видно, что для того, чтобы зажечь определенный сегмент на одном из индикаторов необходимо подать на соответствующий катод и соответствующий анод низкий уровень.&amp;lt;br/&amp;gt;&lt;br /&gt;
[[File:Работа индикатора.jpg|350px]]&lt;br /&gt;
&amp;lt;br/&amp;gt; На рисунке ниже показано, на какие выводы необходимо подать низкий уровень, чтобы зажечь необходимый сегмент&lt;br /&gt;
[[File:Индикатор.jpg]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Текст реализации счетчика времени нажатия&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
module main( &lt;br /&gt;
				input clk, &lt;br /&gt;
				input BTNS, // кнопка&lt;br /&gt;
				output [3:0] AN, // выводы к анодам для переключения семисегментных индикаторов&lt;br /&gt;
				output [7:0] ind // выводы к катодам семисегментного индикатора&lt;br /&gt;
    );&lt;br /&gt;
	 reg [3:0] assist_AN; // вспомогательный регистр для анодов семисегментных индикаторов&lt;br /&gt;
	 reg [7:0] assist_ind; // вспомогательный регистр для катодов семисегментного индикатора&lt;br /&gt;
	 reg [26:0] sum; // накапливаемое значение суммы для регистрации нажатия&lt;br /&gt;
	 reg [7:0] assist_ld; // сумматор времени нажатия кнопки&lt;br /&gt;
	 reg [3:0] nul_r; // младший сегмент индикатора&lt;br /&gt;
	 reg [3:0] first_r; // второй сегмент индикатора&lt;br /&gt;
	 reg [3:0] second_r; // третий сегмент индикатора&lt;br /&gt;
	 reg [17:0] counter; // регистр, хранящий время работы семисегментного индикатора&lt;br /&gt;
	 reg [1:0] c; // регистр указателя номера семисегментного индикатора&lt;br /&gt;
	 always @(posedge clk)&lt;br /&gt;
	 begin&lt;br /&gt;
		if (BTNS) // нажатие кнопки&lt;br /&gt;
			sum &amp;lt;= sum + 1'b1; &lt;br /&gt;
		else&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
		if (sum &amp;gt;= 27'd100000000) // суммирование времени нажатия до 1 секунды&lt;br /&gt;
			begin&lt;br /&gt;
			assist_ld &amp;lt;= assist_ld + 1'b1; // счет количества секунд&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
			end&lt;br /&gt;
		nul_r &amp;lt;= assist_ld % 10; // значение первого семисегментного индикатора&lt;br /&gt;
		first_r &amp;lt;= (assist_ld % 100 - nul_r)/10; // значение второго индикатора&lt;br /&gt;
		second_r &amp;lt;= assist_ld / 100; // значение третьего индикатора&lt;br /&gt;
		counter &amp;lt;= counter + 1'b1;&lt;br /&gt;
			if (counter == 17'd200000) // цикл работы семисегметных индикаторов&lt;br /&gt;
			begin&lt;br /&gt;
				c &amp;lt;= c + 1'b1;&lt;br /&gt;
				counter &amp;lt;= 17'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (c == 2'b00) // первый семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1110; // значение анодов&lt;br /&gt;
		case (nul_r)&lt;br /&gt;
			4'd0: assist_ind &amp;lt;= 8'b00000011; // значения катодов&lt;br /&gt;
			4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
			4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
			4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
			4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
			4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
			4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
			4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
			4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
			4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
			default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
		endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b01) // второй семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1101;&lt;br /&gt;
		case (first_r)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
				4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
				4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
				4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b10) // третий семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1011;&lt;br /&gt;
		case (second_r)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	assign AN = assist_AN; // значение на выходах к аноду равно значению вспомогательных регистров&lt;br /&gt;
	assign ind = assist_ind; // значение на выходах к катоду равно значению вспомогательных регистров&lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;ucf файл с описанием портов ввода-вывода&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NET &amp;quot;clk&amp;quot; LOC = V10;&lt;br /&gt;
NET &amp;quot;BTNS&amp;quot; LOC = B8;&lt;br /&gt;
NET &amp;quot;AN[0]&amp;quot; LOC = N16;&lt;br /&gt;
NET &amp;quot;AN[1]&amp;quot; LOC = N15;&lt;br /&gt;
NET &amp;quot;AN[2]&amp;quot; LOC = P18;&lt;br /&gt;
NET &amp;quot;AN[3]&amp;quot; LOC = P17;&lt;br /&gt;
NET &amp;quot;ind[0]&amp;quot; LOC = M13;&lt;br /&gt;
NET &amp;quot;ind[1]&amp;quot; LOC = L14;&lt;br /&gt;
NET &amp;quot;ind[2]&amp;quot; LOC = N14;&lt;br /&gt;
NET &amp;quot;ind[3]&amp;quot; LOC = M14;&lt;br /&gt;
NET &amp;quot;ind[4]&amp;quot; LOC = U18;&lt;br /&gt;
NET &amp;quot;ind[5]&amp;quot; LOC = U17;&lt;br /&gt;
NET &amp;quot;ind[6]&amp;quot; LOC = T18;&lt;br /&gt;
NET &amp;quot;ind[7]&amp;quot; LOC = T17;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализация часов ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Реализация часов отличается от счетчика времени нажатия незначительно.&lt;br /&gt;
Здесь отсутствует кнопка. Отличие в подсчете времени здесь состоит в том, что здесь счетчик времени представляет собой счетчики минут и секунд. Счет происходит до 59 минут 59 секунд, после чего все сбрасывается. В предыдущем случае счет шел до 255 секунд.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;Текст реализации&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module main( &lt;br /&gt;
				input clk, &lt;br /&gt;
				output [3:0] AN,&lt;br /&gt;
				output [7:0] ind&lt;br /&gt;
    );&lt;br /&gt;
	 reg [3:0] assist_AN;&lt;br /&gt;
	 reg [7:0] assist_ind;&lt;br /&gt;
	 reg [26:0] sum;&lt;br /&gt;
	 reg [5:0] seconds;&lt;br /&gt;
	 reg [5:0] minutes;&lt;br /&gt;
	 reg [3:0] seconds_jr; // регистр хранения значения первой цифры в счетчике секунд&lt;br /&gt;
	 reg [3:0] seconds_sr; // регистр хранения значения второй цифры в счетчике секунд&lt;br /&gt;
	 reg [3:0] minutes_jr; // регистр хранения значения первой цифры в счетчике минут&lt;br /&gt;
	 reg [3:0] minutes_sr; // регистр хранения значения второй цифры в счетчике минут&lt;br /&gt;
	 reg [17:0] counter;&lt;br /&gt;
	 reg [1:0] c;&lt;br /&gt;
	 always @(posedge clk)&lt;br /&gt;
	 begin&lt;br /&gt;
			sum &amp;lt;= sum + 1'b1;&lt;br /&gt;
		if (sum &amp;gt;= 27'd100000000)&lt;br /&gt;
			begin&lt;br /&gt;
			seconds &amp;lt;= seconds + 1'b1; //счетчик секунд&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (seconds == 6'd60)&lt;br /&gt;
			begin&lt;br /&gt;
			minutes &amp;lt;= minutes +1'b1; // счетчик минут&lt;br /&gt;
			seconds &amp;lt;= 6'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (minutes == 6'd60)&lt;br /&gt;
			minutes &amp;lt;= 6'd0;&lt;br /&gt;
		seconds_jr &amp;lt;= seconds % 10; // вычисление значения первой цифры в счетчике секунд&lt;br /&gt;
		seconds_sr &amp;lt;= seconds/10; // вычисление значения второй цифры в счетчике секунд&lt;br /&gt;
		minutes_jr &amp;lt;= minutes % 10; // вычисление значения первой цифры в счетчике минут&lt;br /&gt;
		minutes_sr &amp;lt;= minutes/10; 	// вычисление значения второй цифры в счетчике минут&lt;br /&gt;
		counter &amp;lt;= counter + 1'b1;&lt;br /&gt;
			if (counter == 17'd200000)&lt;br /&gt;
			begin&lt;br /&gt;
				c &amp;lt;= c + 1'b1;&lt;br /&gt;
				counter &amp;lt;= 17'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (c == 2'b00)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1110;&lt;br /&gt;
		case (seconds_jr)&lt;br /&gt;
			4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
			4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
			4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
			4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
			4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
			4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
			4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
			4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
			4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
			4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
			default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
		endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b01)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1101;&lt;br /&gt;
		case (seconds_sr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b10)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1011;&lt;br /&gt;
		case (minutes_jr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000010;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011110;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100100;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001100;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011000;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001000;&lt;br /&gt;
				4'd6: assist_ind &amp;lt;= 8'b01000000;&lt;br /&gt;
				4'd7: assist_ind &amp;lt;= 8'b00011110;&lt;br /&gt;
				4'd8: assist_ind &amp;lt;= 8'b00000000;&lt;br /&gt;
				4'd9: assist_ind &amp;lt;= 8'b00001000;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b11)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b0111;&lt;br /&gt;
		case (minutes_sr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	assign AN = assist_AN;&lt;br /&gt;
	assign ind = assist_ind;&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Здесь ucf файл отличается только отсутствием кнопки BTNS&amp;lt;br/&amp;gt;&lt;br /&gt;
== Pmod ==&lt;br /&gt;
&amp;lt;br/&amp;gt;Для понимания того, какие уровни сигнала на выходе Pmod на один из его выходов были поданы высокий и низкий уровни, после чего к этому выходу был подключен осциллограф. Осциллограммы представлены ниже.&lt;br /&gt;
&amp;lt;br/&amp;gt;Pmod connectors&amp;lt;br/&amp;gt;&lt;br /&gt;
[[File:Pmod.jpg|500px]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Высокий уровень(на вход подана 1)&amp;lt;br/&amp;gt;&lt;br /&gt;
[[File:RTOScreenshot_2014-12-22_0_122926.png|500px]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Низкий уровень(на вход подана 0)&amp;lt;br/&amp;gt;&lt;br /&gt;
[[File:RTOScreenshot_2014-12-22_1_123056.png|500px]]&lt;br /&gt;
&amp;lt;br/&amp;gt;--[[Участник:Belyanushkin|Belyanushkin]] ([[Обсуждение участника:Belyanushkin|обсуждение]]) 00:20, 25 ноября 2014 (MSK)&lt;/div&gt;</summary>
		<author><name>Belyanushkin</name></author>	</entry>

	<entry>
		<id>https://wiki.srns.ru/wiki/%D0%A7%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_Verilog</id>
		<title>Часы на Verilog</title>
		<link rel="alternate" type="text/html" href="https://wiki.srns.ru/wiki/%D0%A7%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_Verilog"/>
				<updated>2014-12-22T17:55:32Z</updated>
		
		<summary type="html">&lt;p&gt;Belyanushkin: /* Pmod */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Введение ==&lt;br /&gt;
&lt;br /&gt;
Для освоения программирования ПЛИС на языке Verilog была поставлена задача написания программы смысл которой заключается в подсчете времени нажатия на кнопку.&lt;br /&gt;
&lt;br /&gt;
== Подзадачи ==&lt;br /&gt;
&lt;br /&gt;
1. Установка программы ISE Design Suite 14.7 на ОС Windows 8.1. &lt;br /&gt;
&amp;lt;br/&amp;gt;2. Написание простых программ для понимания языка Verilog:&lt;br /&gt;
&amp;lt;br/&amp;gt;- Счетчик нажатий, выполняющий вывод значений в двоичной системе на диоды;&lt;br /&gt;
&amp;lt;br/&amp;gt;- Программа для работы нескольких семисегментных индикаторов.&lt;br /&gt;
&amp;lt;br/&amp;gt;3. Синтез этих программ для того, чтобы решить поставленную задачу.&lt;br /&gt;
&amp;lt;br/&amp;gt;4. Для отработки навыков реализовать часы.&lt;br /&gt;
&amp;lt;br/&amp;gt;Реализация всех программ производилась на ПЛИС Xilinx Spartan-6 на отладочной плате  DIGILENT NEXYS 3&lt;br /&gt;
&lt;br /&gt;
== Проблемы в ходе выполнения подзадач ==&lt;br /&gt;
&lt;br /&gt;
В ходе решения подзадач возникла проблема с установкой программы ISE Design Suite 14.7 на ОС Windows 8.1.&lt;br /&gt;
Проблема заключается в зависании программы при создании нового проекта.&lt;br /&gt;
&amp;lt;br/&amp;gt;Проблема была решается следующим путем:&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 1: зайти в директорию: C:\Xilinx\14.5\ISE_DS\ISE\lib\nt64&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 2: переименовать файл libPortability.dll в libPortability.dll.orig&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 3: переименовать файл libPortabilityNOSH.dll в libPortability.dll&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 4: скопировать файл libPortability.dll &amp;lt;ctrl+c&amp;gt; &lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 5: зайти в директорию C:\Xilinx\14.5\ISE_DS\common\lib\nt64&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 6: вставить файл из шага 4  &amp;lt;libPortability.dll &amp;gt; в данную директорию&lt;br /&gt;
&amp;lt;br/&amp;gt;Оригинал статьи про проблемы с работой I SE Design Suite 14.7 на ОС Windows 8.1 находится по следующей ссылке&lt;br /&gt;
[http://stuffs4studies.blogspot.ru/2014/02/is-xilinx-147-ise-crashing-in-windows-8.html]&lt;br /&gt;
&lt;br /&gt;
== Описание реализации счетчика времени нажатия кнопки ==&lt;br /&gt;
&lt;br /&gt;
[[File:Схема_new.jpg|800px]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Основными частями реализации являются счетчики:&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчик суммы времени нажатия до одной секунды;&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчик времени нажатий в секундах;&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчики для работы семисегментного индикатора.&lt;br /&gt;
&amp;lt;br/&amp;gt;Алгоритм работы счетчика таков:&lt;br /&gt;
&amp;lt;br/&amp;gt;1. При нажатии на кнопку происходит начинается счет тактовых сигналов;&lt;br /&gt;
&amp;lt;br/&amp;gt;2. При достижении количества сигналов, равного 10^8 в счетчике суммы прибавляется одна секунда, счетчик импульсов сбрасывается в ноль;&lt;br /&gt;
&amp;lt;br/&amp;gt;3. Далее с регистра, содержащего информацию о количестве секунд, эти значению передаются на дальнейшую обработку для передачи на семисегментные индикаторы.&lt;br /&gt;
&amp;lt;br/&amp;gt;4. Реализация работы семисегментных индикаторов была произведена с помощью циклов.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;Подробнее про работу с семисегментными индикаторами.&lt;br /&gt;
&amp;lt;br/&amp;gt;Так как индикаторов 4 а катоды к ним общие, то принято было работать по следующему алгоритму. Есть 2 счетчика. Один счетчик считает количество тактовых сигналов. Когда это количество становится равным 200000 то на втором счетчике прибавляется единица. В зависимости от значения на втором счетчике выбирается тот анод, на котором будет низкий уровень и значит загорится этот индикатор. Так как время циклов очень мало, то мы мы не замечаем мигание индикаторов. Второй счетчик в схеме имеет 2 разряда, поэтому сбрасывать его нет необходимости.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Симисегментный индикатор.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; На данном ниже рисунке показана схема подключения катодов и анодов. Из этой схемы наглядно видно, что для того, чтобы зажечь определенный сегмент на одном из индикаторов необходимо подать на соответствующий катод и соответствующий анод низкий уровень.&lt;br /&gt;
[[File:Работа индикатора.jpg]]&lt;br /&gt;
&amp;lt;br/&amp;gt; На рисунке ниже показано, на какие выводы необходимо подать низкий уровень, чтобы зажечь необходимый сегмент&lt;br /&gt;
[[File:Индикатор.jpg]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Текст реализации счетчика времени нажатия&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
module main( &lt;br /&gt;
				input clk, &lt;br /&gt;
				input BTNS, // кнопка&lt;br /&gt;
				output [3:0] AN, // выводы к анодам для переключения семисегментных индикаторов&lt;br /&gt;
				output [7:0] ind // выводы к катодам семисегментного индикатора&lt;br /&gt;
    );&lt;br /&gt;
	 reg [3:0] assist_AN; // вспомогательный регистр для анодов семисегментных индикаторов&lt;br /&gt;
	 reg [7:0] assist_ind; // вспомогательный регистр для катодов семисегментного индикатора&lt;br /&gt;
	 reg [26:0] sum; // накапливаемое значение суммы для регистрации нажатия&lt;br /&gt;
	 reg [7:0] assist_ld; // сумматор времени нажатия кнопки&lt;br /&gt;
	 reg [3:0] nul_r; // младший сегмент индикатора&lt;br /&gt;
	 reg [3:0] first_r; // второй сегмент индикатора&lt;br /&gt;
	 reg [3:0] second_r; // третий сегмент индикатора&lt;br /&gt;
	 reg [17:0] counter; // регистр, хранящий время работы семисегментного индикатора&lt;br /&gt;
	 reg [1:0] c; // регистр указателя номера семисегментного индикатора&lt;br /&gt;
	 always @(posedge clk)&lt;br /&gt;
	 begin&lt;br /&gt;
		if (BTNS) // нажатие кнопки&lt;br /&gt;
			sum &amp;lt;= sum + 1'b1; &lt;br /&gt;
		else&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
		if (sum &amp;gt;= 27'd100000000) // суммирование времени нажатия до 1 секунды&lt;br /&gt;
			begin&lt;br /&gt;
			assist_ld &amp;lt;= assist_ld + 1'b1; // счет количества секунд&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
			end&lt;br /&gt;
		nul_r &amp;lt;= assist_ld % 10; // значение первого семисегментного индикатора&lt;br /&gt;
		first_r &amp;lt;= (assist_ld % 100 - nul_r)/10; // значение второго индикатора&lt;br /&gt;
		second_r &amp;lt;= assist_ld / 100; // значение третьего индикатора&lt;br /&gt;
		counter &amp;lt;= counter + 1'b1;&lt;br /&gt;
			if (counter == 17'd200000) // цикл работы семисегметных индикаторов&lt;br /&gt;
			begin&lt;br /&gt;
				c &amp;lt;= c + 1'b1;&lt;br /&gt;
				counter &amp;lt;= 17'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (c == 2'b00) // первый семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1110; // значение анодов&lt;br /&gt;
		case (nul_r)&lt;br /&gt;
			4'd0: assist_ind &amp;lt;= 8'b00000011; // значения катодов&lt;br /&gt;
			4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
			4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
			4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
			4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
			4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
			4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
			4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
			4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
			4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
			default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
		endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b01) // второй семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1101;&lt;br /&gt;
		case (first_r)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
				4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
				4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
				4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b10) // третий семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1011;&lt;br /&gt;
		case (second_r)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	assign AN = assist_AN; // значение на выходах к аноду равно значению вспомогательных регистров&lt;br /&gt;
	assign ind = assist_ind; // значение на выходах к катоду равно значению вспомогательных регистров&lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;ucf файл с описанием портов ввода-вывода&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NET &amp;quot;clk&amp;quot; LOC = V10;&lt;br /&gt;
NET &amp;quot;BTNS&amp;quot; LOC = B8;&lt;br /&gt;
NET &amp;quot;AN[0]&amp;quot; LOC = N16;&lt;br /&gt;
NET &amp;quot;AN[1]&amp;quot; LOC = N15;&lt;br /&gt;
NET &amp;quot;AN[2]&amp;quot; LOC = P18;&lt;br /&gt;
NET &amp;quot;AN[3]&amp;quot; LOC = P17;&lt;br /&gt;
NET &amp;quot;ind[0]&amp;quot; LOC = M13;&lt;br /&gt;
NET &amp;quot;ind[1]&amp;quot; LOC = L14;&lt;br /&gt;
NET &amp;quot;ind[2]&amp;quot; LOC = N14;&lt;br /&gt;
NET &amp;quot;ind[3]&amp;quot; LOC = M14;&lt;br /&gt;
NET &amp;quot;ind[4]&amp;quot; LOC = U18;&lt;br /&gt;
NET &amp;quot;ind[5]&amp;quot; LOC = U17;&lt;br /&gt;
NET &amp;quot;ind[6]&amp;quot; LOC = T18;&lt;br /&gt;
NET &amp;quot;ind[7]&amp;quot; LOC = T17;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализация часов ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Реализация часов отличается от счетчика времени нажатия незначительно.&lt;br /&gt;
Здесь отсутствует кнопка. Отличие в подсчете времени здесь состоит в том, что здесь счетчик времени представляет собой счетчики минут и секунд. Счет происходит до 59 минут 59 секунд, после чего все сбрасывается. В предыдущем случае счет шел до 255 секунд.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;Текст реализации&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module main( &lt;br /&gt;
				input clk, &lt;br /&gt;
				output [3:0] AN,&lt;br /&gt;
				output [7:0] ind&lt;br /&gt;
    );&lt;br /&gt;
	 reg [3:0] assist_AN;&lt;br /&gt;
	 reg [7:0] assist_ind;&lt;br /&gt;
	 reg [26:0] sum;&lt;br /&gt;
	 reg [5:0] seconds;&lt;br /&gt;
	 reg [5:0] minutes;&lt;br /&gt;
	 reg [3:0] seconds_jr; // регистр хранения значения первой цифры в счетчике секунд&lt;br /&gt;
	 reg [3:0] seconds_sr; // регистр хранения значения второй цифры в счетчике секунд&lt;br /&gt;
	 reg [3:0] minutes_jr; // регистр хранения значения первой цифры в счетчике минут&lt;br /&gt;
	 reg [3:0] minutes_sr; // регистр хранения значения второй цифры в счетчике минут&lt;br /&gt;
	 reg [17:0] counter;&lt;br /&gt;
	 reg [1:0] c;&lt;br /&gt;
	 always @(posedge clk)&lt;br /&gt;
	 begin&lt;br /&gt;
			sum &amp;lt;= sum + 1'b1;&lt;br /&gt;
		if (sum &amp;gt;= 27'd100000000)&lt;br /&gt;
			begin&lt;br /&gt;
			seconds &amp;lt;= seconds + 1'b1; //счетчик секунд&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (seconds == 6'd60)&lt;br /&gt;
			begin&lt;br /&gt;
			minutes &amp;lt;= minutes +1'b1; // счетчик минут&lt;br /&gt;
			seconds &amp;lt;= 6'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (minutes == 6'd60)&lt;br /&gt;
			minutes &amp;lt;= 6'd0;&lt;br /&gt;
		seconds_jr &amp;lt;= seconds % 10; // вычисление значения первой цифры в счетчике секунд&lt;br /&gt;
		seconds_sr &amp;lt;= seconds/10; // вычисление значения второй цифры в счетчике секунд&lt;br /&gt;
		minutes_jr &amp;lt;= minutes % 10; // вычисление значения первой цифры в счетчике минут&lt;br /&gt;
		minutes_sr &amp;lt;= minutes/10; 	// вычисление значения второй цифры в счетчике минут&lt;br /&gt;
		counter &amp;lt;= counter + 1'b1;&lt;br /&gt;
			if (counter == 17'd200000)&lt;br /&gt;
			begin&lt;br /&gt;
				c &amp;lt;= c + 1'b1;&lt;br /&gt;
				counter &amp;lt;= 17'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (c == 2'b00)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1110;&lt;br /&gt;
		case (seconds_jr)&lt;br /&gt;
			4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
			4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
			4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
			4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
			4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
			4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
			4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
			4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
			4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
			4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
			default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
		endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b01)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1101;&lt;br /&gt;
		case (seconds_sr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b10)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1011;&lt;br /&gt;
		case (minutes_jr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000010;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011110;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100100;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001100;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011000;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001000;&lt;br /&gt;
				4'd6: assist_ind &amp;lt;= 8'b01000000;&lt;br /&gt;
				4'd7: assist_ind &amp;lt;= 8'b00011110;&lt;br /&gt;
				4'd8: assist_ind &amp;lt;= 8'b00000000;&lt;br /&gt;
				4'd9: assist_ind &amp;lt;= 8'b00001000;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b11)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b0111;&lt;br /&gt;
		case (minutes_sr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	assign AN = assist_AN;&lt;br /&gt;
	assign ind = assist_ind;&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Здесь ucf файл отличается только отсутствием кнопки BTNS&amp;lt;br/&amp;gt;&lt;br /&gt;
== Pmod ==&lt;br /&gt;
&amp;lt;br/&amp;gt;Для понимания того, какие уровни сигнала на выходе Pmod на один из его выходов были поданы высокий и низкий уровни, после чего к этому выходу был подключен осциллограф. Осциллограммы представлены ниже.&lt;br /&gt;
&amp;lt;br/&amp;gt;Pmod connectors&amp;lt;br/&amp;gt;&lt;br /&gt;
[[File:Pmod.jpg|500px]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Высокий уровень(на вход подана 1)&amp;lt;br/&amp;gt;&lt;br /&gt;
[[File:RTOScreenshot_2014-12-22_0_122926.png|500px]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Низкий уровень(на вход подана 0)&amp;lt;br/&amp;gt;&lt;br /&gt;
[[File:RTOScreenshot_2014-12-22_1_123056.png|500px]]&lt;br /&gt;
&amp;lt;br/&amp;gt;--[[Участник:Belyanushkin|Belyanushkin]] ([[Обсуждение участника:Belyanushkin|обсуждение]]) 00:20, 25 ноября 2014 (MSK)&lt;/div&gt;</summary>
		<author><name>Belyanushkin</name></author>	</entry>

	<entry>
		<id>https://wiki.srns.ru/wiki/%D0%A7%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_Verilog</id>
		<title>Часы на Verilog</title>
		<link rel="alternate" type="text/html" href="https://wiki.srns.ru/wiki/%D0%A7%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_Verilog"/>
				<updated>2014-12-22T17:53:46Z</updated>
		
		<summary type="html">&lt;p&gt;Belyanushkin: /* Pmod */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Введение ==&lt;br /&gt;
&lt;br /&gt;
Для освоения программирования ПЛИС на языке Verilog была поставлена задача написания программы смысл которой заключается в подсчете времени нажатия на кнопку.&lt;br /&gt;
&lt;br /&gt;
== Подзадачи ==&lt;br /&gt;
&lt;br /&gt;
1. Установка программы ISE Design Suite 14.7 на ОС Windows 8.1. &lt;br /&gt;
&amp;lt;br/&amp;gt;2. Написание простых программ для понимания языка Verilog:&lt;br /&gt;
&amp;lt;br/&amp;gt;- Счетчик нажатий, выполняющий вывод значений в двоичной системе на диоды;&lt;br /&gt;
&amp;lt;br/&amp;gt;- Программа для работы нескольких семисегментных индикаторов.&lt;br /&gt;
&amp;lt;br/&amp;gt;3. Синтез этих программ для того, чтобы решить поставленную задачу.&lt;br /&gt;
&amp;lt;br/&amp;gt;4. Для отработки навыков реализовать часы.&lt;br /&gt;
&amp;lt;br/&amp;gt;Реализация всех программ производилась на ПЛИС Xilinx Spartan-6 на отладочной плате  DIGILENT NEXYS 3&lt;br /&gt;
&lt;br /&gt;
== Проблемы в ходе выполнения подзадач ==&lt;br /&gt;
&lt;br /&gt;
В ходе решения подзадач возникла проблема с установкой программы ISE Design Suite 14.7 на ОС Windows 8.1.&lt;br /&gt;
Проблема заключается в зависании программы при создании нового проекта.&lt;br /&gt;
&amp;lt;br/&amp;gt;Проблема была решается следующим путем:&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 1: зайти в директорию: C:\Xilinx\14.5\ISE_DS\ISE\lib\nt64&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 2: переименовать файл libPortability.dll в libPortability.dll.orig&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 3: переименовать файл libPortabilityNOSH.dll в libPortability.dll&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 4: скопировать файл libPortability.dll &amp;lt;ctrl+c&amp;gt; &lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 5: зайти в директорию C:\Xilinx\14.5\ISE_DS\common\lib\nt64&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 6: вставить файл из шага 4  &amp;lt;libPortability.dll &amp;gt; в данную директорию&lt;br /&gt;
&amp;lt;br/&amp;gt;Оригинал статьи про проблемы с работой I SE Design Suite 14.7 на ОС Windows 8.1 находится по следующей ссылке&lt;br /&gt;
[http://stuffs4studies.blogspot.ru/2014/02/is-xilinx-147-ise-crashing-in-windows-8.html]&lt;br /&gt;
&lt;br /&gt;
== Описание реализации счетчика времени нажатия кнопки ==&lt;br /&gt;
&lt;br /&gt;
[[File:Схема_new.jpg|800px]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Основными частями реализации являются счетчики:&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчик суммы времени нажатия до одной секунды;&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчик времени нажатий в секундах;&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчики для работы семисегментного индикатора.&lt;br /&gt;
&amp;lt;br/&amp;gt;Алгоритм работы счетчика таков:&lt;br /&gt;
&amp;lt;br/&amp;gt;1. При нажатии на кнопку происходит начинается счет тактовых сигналов;&lt;br /&gt;
&amp;lt;br/&amp;gt;2. При достижении количества сигналов, равного 10^8 в счетчике суммы прибавляется одна секунда, счетчик импульсов сбрасывается в ноль;&lt;br /&gt;
&amp;lt;br/&amp;gt;3. Далее с регистра, содержащего информацию о количестве секунд, эти значению передаются на дальнейшую обработку для передачи на семисегментные индикаторы.&lt;br /&gt;
&amp;lt;br/&amp;gt;4. Реализация работы семисегментных индикаторов была произведена с помощью циклов.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;Подробнее про работу с семисегментными индикаторами.&lt;br /&gt;
&amp;lt;br/&amp;gt;Так как индикаторов 4 а катоды к ним общие, то принято было работать по следующему алгоритму. Есть 2 счетчика. Один счетчик считает количество тактовых сигналов. Когда это количество становится равным 200000 то на втором счетчике прибавляется единица. В зависимости от значения на втором счетчике выбирается тот анод, на котором будет низкий уровень и значит загорится этот индикатор. Так как время циклов очень мало, то мы мы не замечаем мигание индикаторов. Второй счетчик в схеме имеет 2 разряда, поэтому сбрасывать его нет необходимости.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Симисегментный индикатор.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; На данном ниже рисунке показана схема подключения катодов и анодов. Из этой схемы наглядно видно, что для того, чтобы зажечь определенный сегмент на одном из индикаторов необходимо подать на соответствующий катод и соответствующий анод низкий уровень.&lt;br /&gt;
[[File:Работа индикатора.jpg]]&lt;br /&gt;
&amp;lt;br/&amp;gt; На рисунке ниже показано, на какие выводы необходимо подать низкий уровень, чтобы зажечь необходимый сегмент&lt;br /&gt;
[[File:Индикатор.jpg]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Текст реализации счетчика времени нажатия&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
module main( &lt;br /&gt;
				input clk, &lt;br /&gt;
				input BTNS, // кнопка&lt;br /&gt;
				output [3:0] AN, // выводы к анодам для переключения семисегментных индикаторов&lt;br /&gt;
				output [7:0] ind // выводы к катодам семисегментного индикатора&lt;br /&gt;
    );&lt;br /&gt;
	 reg [3:0] assist_AN; // вспомогательный регистр для анодов семисегментных индикаторов&lt;br /&gt;
	 reg [7:0] assist_ind; // вспомогательный регистр для катодов семисегментного индикатора&lt;br /&gt;
	 reg [26:0] sum; // накапливаемое значение суммы для регистрации нажатия&lt;br /&gt;
	 reg [7:0] assist_ld; // сумматор времени нажатия кнопки&lt;br /&gt;
	 reg [3:0] nul_r; // младший сегмент индикатора&lt;br /&gt;
	 reg [3:0] first_r; // второй сегмент индикатора&lt;br /&gt;
	 reg [3:0] second_r; // третий сегмент индикатора&lt;br /&gt;
	 reg [17:0] counter; // регистр, хранящий время работы семисегментного индикатора&lt;br /&gt;
	 reg [1:0] c; // регистр указателя номера семисегментного индикатора&lt;br /&gt;
	 always @(posedge clk)&lt;br /&gt;
	 begin&lt;br /&gt;
		if (BTNS) // нажатие кнопки&lt;br /&gt;
			sum &amp;lt;= sum + 1'b1; &lt;br /&gt;
		else&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
		if (sum &amp;gt;= 27'd100000000) // суммирование времени нажатия до 1 секунды&lt;br /&gt;
			begin&lt;br /&gt;
			assist_ld &amp;lt;= assist_ld + 1'b1; // счет количества секунд&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
			end&lt;br /&gt;
		nul_r &amp;lt;= assist_ld % 10; // значение первого семисегментного индикатора&lt;br /&gt;
		first_r &amp;lt;= (assist_ld % 100 - nul_r)/10; // значение второго индикатора&lt;br /&gt;
		second_r &amp;lt;= assist_ld / 100; // значение третьего индикатора&lt;br /&gt;
		counter &amp;lt;= counter + 1'b1;&lt;br /&gt;
			if (counter == 17'd200000) // цикл работы семисегметных индикаторов&lt;br /&gt;
			begin&lt;br /&gt;
				c &amp;lt;= c + 1'b1;&lt;br /&gt;
				counter &amp;lt;= 17'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (c == 2'b00) // первый семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1110; // значение анодов&lt;br /&gt;
		case (nul_r)&lt;br /&gt;
			4'd0: assist_ind &amp;lt;= 8'b00000011; // значения катодов&lt;br /&gt;
			4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
			4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
			4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
			4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
			4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
			4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
			4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
			4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
			4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
			default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
		endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b01) // второй семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1101;&lt;br /&gt;
		case (first_r)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
				4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
				4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
				4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b10) // третий семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1011;&lt;br /&gt;
		case (second_r)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	assign AN = assist_AN; // значение на выходах к аноду равно значению вспомогательных регистров&lt;br /&gt;
	assign ind = assist_ind; // значение на выходах к катоду равно значению вспомогательных регистров&lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;ucf файл с описанием портов ввода-вывода&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NET &amp;quot;clk&amp;quot; LOC = V10;&lt;br /&gt;
NET &amp;quot;BTNS&amp;quot; LOC = B8;&lt;br /&gt;
NET &amp;quot;AN[0]&amp;quot; LOC = N16;&lt;br /&gt;
NET &amp;quot;AN[1]&amp;quot; LOC = N15;&lt;br /&gt;
NET &amp;quot;AN[2]&amp;quot; LOC = P18;&lt;br /&gt;
NET &amp;quot;AN[3]&amp;quot; LOC = P17;&lt;br /&gt;
NET &amp;quot;ind[0]&amp;quot; LOC = M13;&lt;br /&gt;
NET &amp;quot;ind[1]&amp;quot; LOC = L14;&lt;br /&gt;
NET &amp;quot;ind[2]&amp;quot; LOC = N14;&lt;br /&gt;
NET &amp;quot;ind[3]&amp;quot; LOC = M14;&lt;br /&gt;
NET &amp;quot;ind[4]&amp;quot; LOC = U18;&lt;br /&gt;
NET &amp;quot;ind[5]&amp;quot; LOC = U17;&lt;br /&gt;
NET &amp;quot;ind[6]&amp;quot; LOC = T18;&lt;br /&gt;
NET &amp;quot;ind[7]&amp;quot; LOC = T17;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализация часов ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Реализация часов отличается от счетчика времени нажатия незначительно.&lt;br /&gt;
Здесь отсутствует кнопка. Отличие в подсчете времени здесь состоит в том, что здесь счетчик времени представляет собой счетчики минут и секунд. Счет происходит до 59 минут 59 секунд, после чего все сбрасывается. В предыдущем случае счет шел до 255 секунд.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;Текст реализации&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module main( &lt;br /&gt;
				input clk, &lt;br /&gt;
				output [3:0] AN,&lt;br /&gt;
				output [7:0] ind&lt;br /&gt;
    );&lt;br /&gt;
	 reg [3:0] assist_AN;&lt;br /&gt;
	 reg [7:0] assist_ind;&lt;br /&gt;
	 reg [26:0] sum;&lt;br /&gt;
	 reg [5:0] seconds;&lt;br /&gt;
	 reg [5:0] minutes;&lt;br /&gt;
	 reg [3:0] seconds_jr; // регистр хранения значения первой цифры в счетчике секунд&lt;br /&gt;
	 reg [3:0] seconds_sr; // регистр хранения значения второй цифры в счетчике секунд&lt;br /&gt;
	 reg [3:0] minutes_jr; // регистр хранения значения первой цифры в счетчике минут&lt;br /&gt;
	 reg [3:0] minutes_sr; // регистр хранения значения второй цифры в счетчике минут&lt;br /&gt;
	 reg [17:0] counter;&lt;br /&gt;
	 reg [1:0] c;&lt;br /&gt;
	 always @(posedge clk)&lt;br /&gt;
	 begin&lt;br /&gt;
			sum &amp;lt;= sum + 1'b1;&lt;br /&gt;
		if (sum &amp;gt;= 27'd100000000)&lt;br /&gt;
			begin&lt;br /&gt;
			seconds &amp;lt;= seconds + 1'b1; //счетчик секунд&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (seconds == 6'd60)&lt;br /&gt;
			begin&lt;br /&gt;
			minutes &amp;lt;= minutes +1'b1; // счетчик минут&lt;br /&gt;
			seconds &amp;lt;= 6'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (minutes == 6'd60)&lt;br /&gt;
			minutes &amp;lt;= 6'd0;&lt;br /&gt;
		seconds_jr &amp;lt;= seconds % 10; // вычисление значения первой цифры в счетчике секунд&lt;br /&gt;
		seconds_sr &amp;lt;= seconds/10; // вычисление значения второй цифры в счетчике секунд&lt;br /&gt;
		minutes_jr &amp;lt;= minutes % 10; // вычисление значения первой цифры в счетчике минут&lt;br /&gt;
		minutes_sr &amp;lt;= minutes/10; 	// вычисление значения второй цифры в счетчике минут&lt;br /&gt;
		counter &amp;lt;= counter + 1'b1;&lt;br /&gt;
			if (counter == 17'd200000)&lt;br /&gt;
			begin&lt;br /&gt;
				c &amp;lt;= c + 1'b1;&lt;br /&gt;
				counter &amp;lt;= 17'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (c == 2'b00)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1110;&lt;br /&gt;
		case (seconds_jr)&lt;br /&gt;
			4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
			4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
			4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
			4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
			4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
			4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
			4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
			4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
			4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
			4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
			default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
		endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b01)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1101;&lt;br /&gt;
		case (seconds_sr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b10)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1011;&lt;br /&gt;
		case (minutes_jr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000010;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011110;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100100;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001100;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011000;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001000;&lt;br /&gt;
				4'd6: assist_ind &amp;lt;= 8'b01000000;&lt;br /&gt;
				4'd7: assist_ind &amp;lt;= 8'b00011110;&lt;br /&gt;
				4'd8: assist_ind &amp;lt;= 8'b00000000;&lt;br /&gt;
				4'd9: assist_ind &amp;lt;= 8'b00001000;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b11)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b0111;&lt;br /&gt;
		case (minutes_sr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	assign AN = assist_AN;&lt;br /&gt;
	assign ind = assist_ind;&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Здесь ucf файл отличается только отсутствием кнопки BTNS&amp;lt;br/&amp;gt;&lt;br /&gt;
== Pmod ==&lt;br /&gt;
&amp;lt;br/&amp;gt;Для понимания того, какие уровни сигнала на выходе Pmod на один из его выходов были поданы высокий и низкий уровни, после чего к этому выходу был подключен осциллограф. Осциллограммы представлены ниже.&lt;br /&gt;
&amp;lt;br/&amp;gt;Pmod connectors&lt;br /&gt;
[[File:Pmod.jpg|350px]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Высокий уровень(на вход подана 1)&lt;br /&gt;
[[File:RTOScreenshot_2014-12-22_0_122926.png|350px]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Низкий уровень(на вход подана 0)&lt;br /&gt;
[[File:RTOScreenshot_2014-12-22_1_123056.png|350px]]&lt;br /&gt;
--[[Участник:Belyanushkin|Belyanushkin]] ([[Обсуждение участника:Belyanushkin|обсуждение]]) 00:20, 25 ноября 2014 (MSK)&lt;/div&gt;</summary>
		<author><name>Belyanushkin</name></author>	</entry>

	<entry>
		<id>https://wiki.srns.ru/wiki/%D0%A7%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_Verilog</id>
		<title>Часы на Verilog</title>
		<link rel="alternate" type="text/html" href="https://wiki.srns.ru/wiki/%D0%A7%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_Verilog"/>
				<updated>2014-12-22T17:51:36Z</updated>
		
		<summary type="html">&lt;p&gt;Belyanushkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Введение ==&lt;br /&gt;
&lt;br /&gt;
Для освоения программирования ПЛИС на языке Verilog была поставлена задача написания программы смысл которой заключается в подсчете времени нажатия на кнопку.&lt;br /&gt;
&lt;br /&gt;
== Подзадачи ==&lt;br /&gt;
&lt;br /&gt;
1. Установка программы ISE Design Suite 14.7 на ОС Windows 8.1. &lt;br /&gt;
&amp;lt;br/&amp;gt;2. Написание простых программ для понимания языка Verilog:&lt;br /&gt;
&amp;lt;br/&amp;gt;- Счетчик нажатий, выполняющий вывод значений в двоичной системе на диоды;&lt;br /&gt;
&amp;lt;br/&amp;gt;- Программа для работы нескольких семисегментных индикаторов.&lt;br /&gt;
&amp;lt;br/&amp;gt;3. Синтез этих программ для того, чтобы решить поставленную задачу.&lt;br /&gt;
&amp;lt;br/&amp;gt;4. Для отработки навыков реализовать часы.&lt;br /&gt;
&amp;lt;br/&amp;gt;Реализация всех программ производилась на ПЛИС Xilinx Spartan-6 на отладочной плате  DIGILENT NEXYS 3&lt;br /&gt;
&lt;br /&gt;
== Проблемы в ходе выполнения подзадач ==&lt;br /&gt;
&lt;br /&gt;
В ходе решения подзадач возникла проблема с установкой программы ISE Design Suite 14.7 на ОС Windows 8.1.&lt;br /&gt;
Проблема заключается в зависании программы при создании нового проекта.&lt;br /&gt;
&amp;lt;br/&amp;gt;Проблема была решается следующим путем:&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 1: зайти в директорию: C:\Xilinx\14.5\ISE_DS\ISE\lib\nt64&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 2: переименовать файл libPortability.dll в libPortability.dll.orig&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 3: переименовать файл libPortabilityNOSH.dll в libPortability.dll&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 4: скопировать файл libPortability.dll &amp;lt;ctrl+c&amp;gt; &lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 5: зайти в директорию C:\Xilinx\14.5\ISE_DS\common\lib\nt64&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 6: вставить файл из шага 4  &amp;lt;libPortability.dll &amp;gt; в данную директорию&lt;br /&gt;
&amp;lt;br/&amp;gt;Оригинал статьи про проблемы с работой I SE Design Suite 14.7 на ОС Windows 8.1 находится по следующей ссылке&lt;br /&gt;
[http://stuffs4studies.blogspot.ru/2014/02/is-xilinx-147-ise-crashing-in-windows-8.html]&lt;br /&gt;
&lt;br /&gt;
== Описание реализации счетчика времени нажатия кнопки ==&lt;br /&gt;
&lt;br /&gt;
[[File:Схема_new.jpg|800px]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Основными частями реализации являются счетчики:&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчик суммы времени нажатия до одной секунды;&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчик времени нажатий в секундах;&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчики для работы семисегментного индикатора.&lt;br /&gt;
&amp;lt;br/&amp;gt;Алгоритм работы счетчика таков:&lt;br /&gt;
&amp;lt;br/&amp;gt;1. При нажатии на кнопку происходит начинается счет тактовых сигналов;&lt;br /&gt;
&amp;lt;br/&amp;gt;2. При достижении количества сигналов, равного 10^8 в счетчике суммы прибавляется одна секунда, счетчик импульсов сбрасывается в ноль;&lt;br /&gt;
&amp;lt;br/&amp;gt;3. Далее с регистра, содержащего информацию о количестве секунд, эти значению передаются на дальнейшую обработку для передачи на семисегментные индикаторы.&lt;br /&gt;
&amp;lt;br/&amp;gt;4. Реализация работы семисегментных индикаторов была произведена с помощью циклов.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;Подробнее про работу с семисегментными индикаторами.&lt;br /&gt;
&amp;lt;br/&amp;gt;Так как индикаторов 4 а катоды к ним общие, то принято было работать по следующему алгоритму. Есть 2 счетчика. Один счетчик считает количество тактовых сигналов. Когда это количество становится равным 200000 то на втором счетчике прибавляется единица. В зависимости от значения на втором счетчике выбирается тот анод, на котором будет низкий уровень и значит загорится этот индикатор. Так как время циклов очень мало, то мы мы не замечаем мигание индикаторов. Второй счетчик в схеме имеет 2 разряда, поэтому сбрасывать его нет необходимости.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Симисегментный индикатор.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; На данном ниже рисунке показана схема подключения катодов и анодов. Из этой схемы наглядно видно, что для того, чтобы зажечь определенный сегмент на одном из индикаторов необходимо подать на соответствующий катод и соответствующий анод низкий уровень.&lt;br /&gt;
[[File:Работа индикатора.jpg]]&lt;br /&gt;
&amp;lt;br/&amp;gt; На рисунке ниже показано, на какие выводы необходимо подать низкий уровень, чтобы зажечь необходимый сегмент&lt;br /&gt;
[[File:Индикатор.jpg]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Текст реализации счетчика времени нажатия&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
module main( &lt;br /&gt;
				input clk, &lt;br /&gt;
				input BTNS, // кнопка&lt;br /&gt;
				output [3:0] AN, // выводы к анодам для переключения семисегментных индикаторов&lt;br /&gt;
				output [7:0] ind // выводы к катодам семисегментного индикатора&lt;br /&gt;
    );&lt;br /&gt;
	 reg [3:0] assist_AN; // вспомогательный регистр для анодов семисегментных индикаторов&lt;br /&gt;
	 reg [7:0] assist_ind; // вспомогательный регистр для катодов семисегментного индикатора&lt;br /&gt;
	 reg [26:0] sum; // накапливаемое значение суммы для регистрации нажатия&lt;br /&gt;
	 reg [7:0] assist_ld; // сумматор времени нажатия кнопки&lt;br /&gt;
	 reg [3:0] nul_r; // младший сегмент индикатора&lt;br /&gt;
	 reg [3:0] first_r; // второй сегмент индикатора&lt;br /&gt;
	 reg [3:0] second_r; // третий сегмент индикатора&lt;br /&gt;
	 reg [17:0] counter; // регистр, хранящий время работы семисегментного индикатора&lt;br /&gt;
	 reg [1:0] c; // регистр указателя номера семисегментного индикатора&lt;br /&gt;
	 always @(posedge clk)&lt;br /&gt;
	 begin&lt;br /&gt;
		if (BTNS) // нажатие кнопки&lt;br /&gt;
			sum &amp;lt;= sum + 1'b1; &lt;br /&gt;
		else&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
		if (sum &amp;gt;= 27'd100000000) // суммирование времени нажатия до 1 секунды&lt;br /&gt;
			begin&lt;br /&gt;
			assist_ld &amp;lt;= assist_ld + 1'b1; // счет количества секунд&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
			end&lt;br /&gt;
		nul_r &amp;lt;= assist_ld % 10; // значение первого семисегментного индикатора&lt;br /&gt;
		first_r &amp;lt;= (assist_ld % 100 - nul_r)/10; // значение второго индикатора&lt;br /&gt;
		second_r &amp;lt;= assist_ld / 100; // значение третьего индикатора&lt;br /&gt;
		counter &amp;lt;= counter + 1'b1;&lt;br /&gt;
			if (counter == 17'd200000) // цикл работы семисегметных индикаторов&lt;br /&gt;
			begin&lt;br /&gt;
				c &amp;lt;= c + 1'b1;&lt;br /&gt;
				counter &amp;lt;= 17'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (c == 2'b00) // первый семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1110; // значение анодов&lt;br /&gt;
		case (nul_r)&lt;br /&gt;
			4'd0: assist_ind &amp;lt;= 8'b00000011; // значения катодов&lt;br /&gt;
			4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
			4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
			4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
			4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
			4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
			4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
			4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
			4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
			4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
			default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
		endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b01) // второй семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1101;&lt;br /&gt;
		case (first_r)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
				4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
				4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
				4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b10) // третий семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1011;&lt;br /&gt;
		case (second_r)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	assign AN = assist_AN; // значение на выходах к аноду равно значению вспомогательных регистров&lt;br /&gt;
	assign ind = assist_ind; // значение на выходах к катоду равно значению вспомогательных регистров&lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;ucf файл с описанием портов ввода-вывода&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NET &amp;quot;clk&amp;quot; LOC = V10;&lt;br /&gt;
NET &amp;quot;BTNS&amp;quot; LOC = B8;&lt;br /&gt;
NET &amp;quot;AN[0]&amp;quot; LOC = N16;&lt;br /&gt;
NET &amp;quot;AN[1]&amp;quot; LOC = N15;&lt;br /&gt;
NET &amp;quot;AN[2]&amp;quot; LOC = P18;&lt;br /&gt;
NET &amp;quot;AN[3]&amp;quot; LOC = P17;&lt;br /&gt;
NET &amp;quot;ind[0]&amp;quot; LOC = M13;&lt;br /&gt;
NET &amp;quot;ind[1]&amp;quot; LOC = L14;&lt;br /&gt;
NET &amp;quot;ind[2]&amp;quot; LOC = N14;&lt;br /&gt;
NET &amp;quot;ind[3]&amp;quot; LOC = M14;&lt;br /&gt;
NET &amp;quot;ind[4]&amp;quot; LOC = U18;&lt;br /&gt;
NET &amp;quot;ind[5]&amp;quot; LOC = U17;&lt;br /&gt;
NET &amp;quot;ind[6]&amp;quot; LOC = T18;&lt;br /&gt;
NET &amp;quot;ind[7]&amp;quot; LOC = T17;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализация часов ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Реализация часов отличается от счетчика времени нажатия незначительно.&lt;br /&gt;
Здесь отсутствует кнопка. Отличие в подсчете времени здесь состоит в том, что здесь счетчик времени представляет собой счетчики минут и секунд. Счет происходит до 59 минут 59 секунд, после чего все сбрасывается. В предыдущем случае счет шел до 255 секунд.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;Текст реализации&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module main( &lt;br /&gt;
				input clk, &lt;br /&gt;
				output [3:0] AN,&lt;br /&gt;
				output [7:0] ind&lt;br /&gt;
    );&lt;br /&gt;
	 reg [3:0] assist_AN;&lt;br /&gt;
	 reg [7:0] assist_ind;&lt;br /&gt;
	 reg [26:0] sum;&lt;br /&gt;
	 reg [5:0] seconds;&lt;br /&gt;
	 reg [5:0] minutes;&lt;br /&gt;
	 reg [3:0] seconds_jr; // регистр хранения значения первой цифры в счетчике секунд&lt;br /&gt;
	 reg [3:0] seconds_sr; // регистр хранения значения второй цифры в счетчике секунд&lt;br /&gt;
	 reg [3:0] minutes_jr; // регистр хранения значения первой цифры в счетчике минут&lt;br /&gt;
	 reg [3:0] minutes_sr; // регистр хранения значения второй цифры в счетчике минут&lt;br /&gt;
	 reg [17:0] counter;&lt;br /&gt;
	 reg [1:0] c;&lt;br /&gt;
	 always @(posedge clk)&lt;br /&gt;
	 begin&lt;br /&gt;
			sum &amp;lt;= sum + 1'b1;&lt;br /&gt;
		if (sum &amp;gt;= 27'd100000000)&lt;br /&gt;
			begin&lt;br /&gt;
			seconds &amp;lt;= seconds + 1'b1; //счетчик секунд&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (seconds == 6'd60)&lt;br /&gt;
			begin&lt;br /&gt;
			minutes &amp;lt;= minutes +1'b1; // счетчик минут&lt;br /&gt;
			seconds &amp;lt;= 6'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (minutes == 6'd60)&lt;br /&gt;
			minutes &amp;lt;= 6'd0;&lt;br /&gt;
		seconds_jr &amp;lt;= seconds % 10; // вычисление значения первой цифры в счетчике секунд&lt;br /&gt;
		seconds_sr &amp;lt;= seconds/10; // вычисление значения второй цифры в счетчике секунд&lt;br /&gt;
		minutes_jr &amp;lt;= minutes % 10; // вычисление значения первой цифры в счетчике минут&lt;br /&gt;
		minutes_sr &amp;lt;= minutes/10; 	// вычисление значения второй цифры в счетчике минут&lt;br /&gt;
		counter &amp;lt;= counter + 1'b1;&lt;br /&gt;
			if (counter == 17'd200000)&lt;br /&gt;
			begin&lt;br /&gt;
				c &amp;lt;= c + 1'b1;&lt;br /&gt;
				counter &amp;lt;= 17'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (c == 2'b00)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1110;&lt;br /&gt;
		case (seconds_jr)&lt;br /&gt;
			4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
			4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
			4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
			4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
			4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
			4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
			4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
			4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
			4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
			4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
			default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
		endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b01)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1101;&lt;br /&gt;
		case (seconds_sr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b10)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1011;&lt;br /&gt;
		case (minutes_jr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000010;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011110;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100100;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001100;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011000;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001000;&lt;br /&gt;
				4'd6: assist_ind &amp;lt;= 8'b01000000;&lt;br /&gt;
				4'd7: assist_ind &amp;lt;= 8'b00011110;&lt;br /&gt;
				4'd8: assist_ind &amp;lt;= 8'b00000000;&lt;br /&gt;
				4'd9: assist_ind &amp;lt;= 8'b00001000;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b11)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b0111;&lt;br /&gt;
		case (minutes_sr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	assign AN = assist_AN;&lt;br /&gt;
	assign ind = assist_ind;&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Здесь ucf файл отличается только отсутствием кнопки BTNS&amp;lt;br/&amp;gt;&lt;br /&gt;
== Pmod ==&lt;br /&gt;
&amp;lt;br/&amp;gt;Для понимания того, какие уровни сигнала на выходе Pmod на один из его выходов были поданы высокий и низкий уровни, после чего к этому выходу был подключен осциллограф. Осциллограммы представлены ниже.&lt;br /&gt;
&amp;lt;br/&amp;gt;Pmod connectors&lt;br /&gt;
[[:File:Pmod.jpg]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Высокий уровень(на вход подана 1)&lt;br /&gt;
[[:File:RTOScreenshot_2014-12-22_0_122926.png]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Низкий уровень(на вход подана 0)&lt;br /&gt;
[[:File:RTOScreenshot_2014-12-22_1_123056.png]]&lt;br /&gt;
--[[Участник:Belyanushkin|Belyanushkin]] ([[Обсуждение участника:Belyanushkin|обсуждение]]) 00:20, 25 ноября 2014 (MSK)&lt;/div&gt;</summary>
		<author><name>Belyanushkin</name></author>	</entry>

	<entry>
		<id>https://wiki.srns.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:RTOScreenshot_2014-12-22_1_123056.png</id>
		<title>Файл:RTOScreenshot 2014-12-22 1 123056.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.srns.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:RTOScreenshot_2014-12-22_1_123056.png"/>
				<updated>2014-12-22T17:51:28Z</updated>
		
		<summary type="html">&lt;p&gt;Belyanushkin: Belyanushkin загружена новая версия «Файл:RTOScreenshot 2014-12-22 1 123056.png»: MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MsUpload&lt;/div&gt;</summary>
		<author><name>Belyanushkin</name></author>	</entry>

	<entry>
		<id>https://wiki.srns.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:RTOScreenshot_2014-12-22_0_122926.png</id>
		<title>Файл:RTOScreenshot 2014-12-22 0 122926.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.srns.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:RTOScreenshot_2014-12-22_0_122926.png"/>
				<updated>2014-12-22T17:50:50Z</updated>
		
		<summary type="html">&lt;p&gt;Belyanushkin: MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MsUpload&lt;/div&gt;</summary>
		<author><name>Belyanushkin</name></author>	</entry>

	<entry>
		<id>https://wiki.srns.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Pmod.jpg</id>
		<title>Файл:Pmod.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.srns.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Pmod.jpg"/>
				<updated>2014-12-22T17:49:20Z</updated>
		
		<summary type="html">&lt;p&gt;Belyanushkin: Belyanushkin загружена новая версия «Файл:Pmod.jpg»: MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MsUpload&lt;/div&gt;</summary>
		<author><name>Belyanushkin</name></author>	</entry>

	<entry>
		<id>https://wiki.srns.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Pmod.jpg</id>
		<title>Файл:Pmod.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.srns.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Pmod.jpg"/>
				<updated>2014-12-22T17:47:52Z</updated>
		
		<summary type="html">&lt;p&gt;Belyanushkin: MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MsUpload&lt;/div&gt;</summary>
		<author><name>Belyanushkin</name></author>	</entry>

	<entry>
		<id>https://wiki.srns.ru/wiki/%D0%A7%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_Verilog</id>
		<title>Часы на Verilog</title>
		<link rel="alternate" type="text/html" href="https://wiki.srns.ru/wiki/%D0%A7%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_Verilog"/>
				<updated>2014-12-22T17:36:20Z</updated>
		
		<summary type="html">&lt;p&gt;Belyanushkin: /* Описание реализации счетчика времени нажатия кнопки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Введение ==&lt;br /&gt;
&lt;br /&gt;
Для освоения программирования ПЛИС на языке Verilog была поставлена задача написания программы смысл которой заключается в подсчете времени нажатия на кнопку.&lt;br /&gt;
&lt;br /&gt;
== Подзадачи ==&lt;br /&gt;
&lt;br /&gt;
1. Установка программы ISE Design Suite 14.7 на ОС Windows 8.1. &lt;br /&gt;
&amp;lt;br/&amp;gt;2. Написание простых программ для понимания языка Verilog:&lt;br /&gt;
&amp;lt;br/&amp;gt;- Счетчик нажатий, выполняющий вывод значений в двоичной системе на диоды;&lt;br /&gt;
&amp;lt;br/&amp;gt;- Программа для работы нескольких семисегментных индикаторов.&lt;br /&gt;
&amp;lt;br/&amp;gt;3. Синтез этих программ для того, чтобы решить поставленную задачу.&lt;br /&gt;
&amp;lt;br/&amp;gt;4. Для отработки навыков реализовать часы.&lt;br /&gt;
&amp;lt;br/&amp;gt;Реализация всех программ производилась на ПЛИС Xilinx Spartan-6 на отладочной плате  DIGILENT NEXYS 3&lt;br /&gt;
&lt;br /&gt;
== Проблемы в ходе выполнения подзадач ==&lt;br /&gt;
&lt;br /&gt;
В ходе решения подзадач возникла проблема с установкой программы ISE Design Suite 14.7 на ОС Windows 8.1.&lt;br /&gt;
Проблема заключается в зависании программы при создании нового проекта.&lt;br /&gt;
&amp;lt;br/&amp;gt;Проблема была решается следующим путем:&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 1: зайти в директорию: C:\Xilinx\14.5\ISE_DS\ISE\lib\nt64&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 2: переименовать файл libPortability.dll в libPortability.dll.orig&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 3: переименовать файл libPortabilityNOSH.dll в libPortability.dll&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 4: скопировать файл libPortability.dll &amp;lt;ctrl+c&amp;gt; &lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 5: зайти в директорию C:\Xilinx\14.5\ISE_DS\common\lib\nt64&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 6: вставить файл из шага 4  &amp;lt;libPortability.dll &amp;gt; в данную директорию&lt;br /&gt;
&amp;lt;br/&amp;gt;Оригинал статьи про проблемы с работой I SE Design Suite 14.7 на ОС Windows 8.1 находится по следующей ссылке&lt;br /&gt;
[http://stuffs4studies.blogspot.ru/2014/02/is-xilinx-147-ise-crashing-in-windows-8.html]&lt;br /&gt;
&lt;br /&gt;
== Описание реализации счетчика времени нажатия кнопки ==&lt;br /&gt;
&lt;br /&gt;
[[File:Схема_new.jpg|800px]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Основными частями реализации являются счетчики:&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчик суммы времени нажатия до одной секунды;&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчик времени нажатий в секундах;&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчики для работы семисегментного индикатора.&lt;br /&gt;
&amp;lt;br/&amp;gt;Алгоритм работы счетчика таков:&lt;br /&gt;
&amp;lt;br/&amp;gt;1. При нажатии на кнопку происходит начинается счет тактовых сигналов;&lt;br /&gt;
&amp;lt;br/&amp;gt;2. При достижении количества сигналов, равного 10^8 в счетчике суммы прибавляется одна секунда, счетчик импульсов сбрасывается в ноль;&lt;br /&gt;
&amp;lt;br/&amp;gt;3. Далее с регистра, содержащего информацию о количестве секунд, эти значению передаются на дальнейшую обработку для передачи на семисегментные индикаторы.&lt;br /&gt;
&amp;lt;br/&amp;gt;4. Реализация работы семисегментных индикаторов была произведена с помощью циклов.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;Подробнее про работу с семисегментными индикаторами.&lt;br /&gt;
&amp;lt;br/&amp;gt;Так как индикаторов 4 а катоды к ним общие, то принято было работать по следующему алгоритму. Есть 2 счетчика. Один счетчик считает количество тактовых сигналов. Когда это количество становится равным 200000 то на втором счетчике прибавляется единица. В зависимости от значения на втором счетчике выбирается тот анод, на котором будет низкий уровень и значит загорится этот индикатор. Так как время циклов очень мало, то мы мы не замечаем мигание индикаторов. Второй счетчик в схеме имеет 2 разряда, поэтому сбрасывать его нет необходимости.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Симисегментный индикатор.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; На данном ниже рисунке показана схема подключения катодов и анодов. Из этой схемы наглядно видно, что для того, чтобы зажечь определенный сегмент на одном из индикаторов необходимо подать на соответствующий катод и соответствующий анод низкий уровень.&lt;br /&gt;
[[File:Работа индикатора.jpg]]&lt;br /&gt;
&amp;lt;br/&amp;gt; На рисунке ниже показано, на какие выводы необходимо подать низкий уровень, чтобы зажечь необходимый сегмент&lt;br /&gt;
[[File:Индикатор.jpg]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Текст реализации счетчика времени нажатия&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
module main( &lt;br /&gt;
				input clk, &lt;br /&gt;
				input BTNS, // кнопка&lt;br /&gt;
				output [3:0] AN, // выводы к анодам для переключения семисегментных индикаторов&lt;br /&gt;
				output [7:0] ind // выводы к катодам семисегментного индикатора&lt;br /&gt;
    );&lt;br /&gt;
	 reg [3:0] assist_AN; // вспомогательный регистр для анодов семисегментных индикаторов&lt;br /&gt;
	 reg [7:0] assist_ind; // вспомогательный регистр для катодов семисегментного индикатора&lt;br /&gt;
	 reg [26:0] sum; // накапливаемое значение суммы для регистрации нажатия&lt;br /&gt;
	 reg [7:0] assist_ld; // сумматор времени нажатия кнопки&lt;br /&gt;
	 reg [3:0] nul_r; // младший сегмент индикатора&lt;br /&gt;
	 reg [3:0] first_r; // второй сегмент индикатора&lt;br /&gt;
	 reg [3:0] second_r; // третий сегмент индикатора&lt;br /&gt;
	 reg [17:0] counter; // регистр, хранящий время работы семисегментного индикатора&lt;br /&gt;
	 reg [1:0] c; // регистр указателя номера семисегментного индикатора&lt;br /&gt;
	 always @(posedge clk)&lt;br /&gt;
	 begin&lt;br /&gt;
		if (BTNS) // нажатие кнопки&lt;br /&gt;
			sum &amp;lt;= sum + 1'b1; &lt;br /&gt;
		else&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
		if (sum &amp;gt;= 27'd100000000) // суммирование времени нажатия до 1 секунды&lt;br /&gt;
			begin&lt;br /&gt;
			assist_ld &amp;lt;= assist_ld + 1'b1; // счет количества секунд&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
			end&lt;br /&gt;
		nul_r &amp;lt;= assist_ld % 10; // значение первого семисегментного индикатора&lt;br /&gt;
		first_r &amp;lt;= (assist_ld % 100 - nul_r)/10; // значение второго индикатора&lt;br /&gt;
		second_r &amp;lt;= assist_ld / 100; // значение третьего индикатора&lt;br /&gt;
		counter &amp;lt;= counter + 1'b1;&lt;br /&gt;
			if (counter == 17'd200000) // цикл работы семисегметных индикаторов&lt;br /&gt;
			begin&lt;br /&gt;
				c &amp;lt;= c + 1'b1;&lt;br /&gt;
				counter &amp;lt;= 17'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (c == 2'b00) // первый семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1110; // значение анодов&lt;br /&gt;
		case (nul_r)&lt;br /&gt;
			4'd0: assist_ind &amp;lt;= 8'b00000011; // значения катодов&lt;br /&gt;
			4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
			4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
			4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
			4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
			4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
			4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
			4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
			4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
			4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
			default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
		endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b01) // второй семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1101;&lt;br /&gt;
		case (first_r)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
				4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
				4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
				4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b10) // третий семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1011;&lt;br /&gt;
		case (second_r)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	assign AN = assist_AN; // значение на выходах к аноду равно значению вспомогательных регистров&lt;br /&gt;
	assign ind = assist_ind; // значение на выходах к катоду равно значению вспомогательных регистров&lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;ucf файл с описанием портов ввода-вывода&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NET &amp;quot;clk&amp;quot; LOC = V10;&lt;br /&gt;
NET &amp;quot;BTNS&amp;quot; LOC = B8;&lt;br /&gt;
NET &amp;quot;AN[0]&amp;quot; LOC = N16;&lt;br /&gt;
NET &amp;quot;AN[1]&amp;quot; LOC = N15;&lt;br /&gt;
NET &amp;quot;AN[2]&amp;quot; LOC = P18;&lt;br /&gt;
NET &amp;quot;AN[3]&amp;quot; LOC = P17;&lt;br /&gt;
NET &amp;quot;ind[0]&amp;quot; LOC = M13;&lt;br /&gt;
NET &amp;quot;ind[1]&amp;quot; LOC = L14;&lt;br /&gt;
NET &amp;quot;ind[2]&amp;quot; LOC = N14;&lt;br /&gt;
NET &amp;quot;ind[3]&amp;quot; LOC = M14;&lt;br /&gt;
NET &amp;quot;ind[4]&amp;quot; LOC = U18;&lt;br /&gt;
NET &amp;quot;ind[5]&amp;quot; LOC = U17;&lt;br /&gt;
NET &amp;quot;ind[6]&amp;quot; LOC = T18;&lt;br /&gt;
NET &amp;quot;ind[7]&amp;quot; LOC = T17;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализация часов ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Реализация часов отличается от счетчика времени нажатия незначительно.&lt;br /&gt;
Здесь отсутствует кнопка. Отличие в подсчете времени здесь состоит в том, что здесь счетчик времени представляет собой счетчики минут и секунд. Счет происходит до 59 минут 59 секунд, после чего все сбрасывается. В предыдущем случае счет шел до 255 секунд.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;Текст реализации&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module main( &lt;br /&gt;
				input clk, &lt;br /&gt;
				output [3:0] AN,&lt;br /&gt;
				output [7:0] ind&lt;br /&gt;
    );&lt;br /&gt;
	 reg [3:0] assist_AN;&lt;br /&gt;
	 reg [7:0] assist_ind;&lt;br /&gt;
	 reg [26:0] sum;&lt;br /&gt;
	 reg [5:0] seconds;&lt;br /&gt;
	 reg [5:0] minutes;&lt;br /&gt;
	 reg [3:0] seconds_jr; // регистр хранения значения первой цифры в счетчике секунд&lt;br /&gt;
	 reg [3:0] seconds_sr; // регистр хранения значения второй цифры в счетчике секунд&lt;br /&gt;
	 reg [3:0] minutes_jr; // регистр хранения значения первой цифры в счетчике минут&lt;br /&gt;
	 reg [3:0] minutes_sr; // регистр хранения значения второй цифры в счетчике минут&lt;br /&gt;
	 reg [17:0] counter;&lt;br /&gt;
	 reg [1:0] c;&lt;br /&gt;
	 always @(posedge clk)&lt;br /&gt;
	 begin&lt;br /&gt;
			sum &amp;lt;= sum + 1'b1;&lt;br /&gt;
		if (sum &amp;gt;= 27'd100000000)&lt;br /&gt;
			begin&lt;br /&gt;
			seconds &amp;lt;= seconds + 1'b1; //счетчик секунд&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (seconds == 6'd60)&lt;br /&gt;
			begin&lt;br /&gt;
			minutes &amp;lt;= minutes +1'b1; // счетчик минут&lt;br /&gt;
			seconds &amp;lt;= 6'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (minutes == 6'd60)&lt;br /&gt;
			minutes &amp;lt;= 6'd0;&lt;br /&gt;
		seconds_jr &amp;lt;= seconds % 10; // вычисление значения первой цифры в счетчике секунд&lt;br /&gt;
		seconds_sr &amp;lt;= seconds/10; // вычисление значения второй цифры в счетчике секунд&lt;br /&gt;
		minutes_jr &amp;lt;= minutes % 10; // вычисление значения первой цифры в счетчике минут&lt;br /&gt;
		minutes_sr &amp;lt;= minutes/10; 	// вычисление значения второй цифры в счетчике минут&lt;br /&gt;
		counter &amp;lt;= counter + 1'b1;&lt;br /&gt;
			if (counter == 17'd200000)&lt;br /&gt;
			begin&lt;br /&gt;
				c &amp;lt;= c + 1'b1;&lt;br /&gt;
				counter &amp;lt;= 17'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (c == 2'b00)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1110;&lt;br /&gt;
		case (seconds_jr)&lt;br /&gt;
			4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
			4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
			4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
			4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
			4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
			4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
			4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
			4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
			4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
			4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
			default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
		endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b01)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1101;&lt;br /&gt;
		case (seconds_sr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b10)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1011;&lt;br /&gt;
		case (minutes_jr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000010;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011110;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100100;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001100;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011000;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001000;&lt;br /&gt;
				4'd6: assist_ind &amp;lt;= 8'b01000000;&lt;br /&gt;
				4'd7: assist_ind &amp;lt;= 8'b00011110;&lt;br /&gt;
				4'd8: assist_ind &amp;lt;= 8'b00000000;&lt;br /&gt;
				4'd9: assist_ind &amp;lt;= 8'b00001000;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b11)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b0111;&lt;br /&gt;
		case (minutes_sr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	assign AN = assist_AN;&lt;br /&gt;
	assign ind = assist_ind;&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Здесь ucf файл отличается только отсутствием кнопки BTNS&amp;lt;br/&amp;gt;&lt;br /&gt;
--[[Участник:Belyanushkin|Belyanushkin]] ([[Обсуждение участника:Belyanushkin|обсуждение]]) 00:20, 25 ноября 2014 (MSK)&lt;/div&gt;</summary>
		<author><name>Belyanushkin</name></author>	</entry>

	<entry>
		<id>https://wiki.srns.ru/wiki/%D0%A7%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_Verilog</id>
		<title>Часы на Verilog</title>
		<link rel="alternate" type="text/html" href="https://wiki.srns.ru/wiki/%D0%A7%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_Verilog"/>
				<updated>2014-12-22T17:33:14Z</updated>
		
		<summary type="html">&lt;p&gt;Belyanushkin: /* Описание реализации счетчика времени нажатия кнопки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Введение ==&lt;br /&gt;
&lt;br /&gt;
Для освоения программирования ПЛИС на языке Verilog была поставлена задача написания программы смысл которой заключается в подсчете времени нажатия на кнопку.&lt;br /&gt;
&lt;br /&gt;
== Подзадачи ==&lt;br /&gt;
&lt;br /&gt;
1. Установка программы ISE Design Suite 14.7 на ОС Windows 8.1. &lt;br /&gt;
&amp;lt;br/&amp;gt;2. Написание простых программ для понимания языка Verilog:&lt;br /&gt;
&amp;lt;br/&amp;gt;- Счетчик нажатий, выполняющий вывод значений в двоичной системе на диоды;&lt;br /&gt;
&amp;lt;br/&amp;gt;- Программа для работы нескольких семисегментных индикаторов.&lt;br /&gt;
&amp;lt;br/&amp;gt;3. Синтез этих программ для того, чтобы решить поставленную задачу.&lt;br /&gt;
&amp;lt;br/&amp;gt;4. Для отработки навыков реализовать часы.&lt;br /&gt;
&amp;lt;br/&amp;gt;Реализация всех программ производилась на ПЛИС Xilinx Spartan-6 на отладочной плате  DIGILENT NEXYS 3&lt;br /&gt;
&lt;br /&gt;
== Проблемы в ходе выполнения подзадач ==&lt;br /&gt;
&lt;br /&gt;
В ходе решения подзадач возникла проблема с установкой программы ISE Design Suite 14.7 на ОС Windows 8.1.&lt;br /&gt;
Проблема заключается в зависании программы при создании нового проекта.&lt;br /&gt;
&amp;lt;br/&amp;gt;Проблема была решается следующим путем:&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 1: зайти в директорию: C:\Xilinx\14.5\ISE_DS\ISE\lib\nt64&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 2: переименовать файл libPortability.dll в libPortability.dll.orig&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 3: переименовать файл libPortabilityNOSH.dll в libPortability.dll&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 4: скопировать файл libPortability.dll &amp;lt;ctrl+c&amp;gt; &lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 5: зайти в директорию C:\Xilinx\14.5\ISE_DS\common\lib\nt64&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 6: вставить файл из шага 4  &amp;lt;libPortability.dll &amp;gt; в данную директорию&lt;br /&gt;
&amp;lt;br/&amp;gt;Оригинал статьи про проблемы с работой I SE Design Suite 14.7 на ОС Windows 8.1 находится по следующей ссылке&lt;br /&gt;
[http://stuffs4studies.blogspot.ru/2014/02/is-xilinx-147-ise-crashing-in-windows-8.html]&lt;br /&gt;
&lt;br /&gt;
== Описание реализации счетчика времени нажатия кнопки ==&lt;br /&gt;
&lt;br /&gt;
[[File:Схема_new.jpg|800px]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Основными частями реализации являются счетчики:&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчик суммы времени нажатия до одной секунды;&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчик времени нажатий в секундах;&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчики для работы семисегментного индикатора.&lt;br /&gt;
&amp;lt;br/&amp;gt;Алгоритм работы счетчика таков:&lt;br /&gt;
&amp;lt;br/&amp;gt;1. При нажатии на кнопку происходит начинается счет тактовых сигналов;&lt;br /&gt;
&amp;lt;br/&amp;gt;2. При достижении количества сигналов, равного 10^8 в счетчике суммы прибавляется одна секунда, счетчик импульсов сбрасывается в ноль;&lt;br /&gt;
&amp;lt;br/&amp;gt;3. Далее с регистра, содержащего информацию о количестве секунд, эти значению передаются на дальнейшую обработку для передачи на семисегментные индикаторы.&lt;br /&gt;
&amp;lt;br/&amp;gt;4. Реализация работы семисегментных индикаторов была произведена с помощью циклов.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;Подробнее про работу с семисегментными индикаторами.&lt;br /&gt;
&amp;lt;br/&amp;gt;Так как индикаторов 4 а катоды к ним общие, то принято было работать по следующему алгоритму. Есть 2 счетчика. Один счетчик считает количество тактовых сигналов. Когда это количество становится равным 200000 то на втором счетчике прибавляется единица. В зависимости от значения на втором счетчике выбирается тот анод, на котором будет низкий уровень и значит загорится этот индикатор. Так как время циклов очень мало, то мы мы не замечаем мигание индикаторов. Второй счетчик в схеме имеет 2 разряда, поэтому сбрасывать его нет необходимости.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Симисегментный индикатор.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; На данном ниже рисунке показана схема подключения катодов и анодов. Из этой схемы наглядно видно, что для того, чтобы зажечь определенный сегмент на одном из индикаторов необходимо подать на соответствующий катод и соответствующий анод низкий уровень.&lt;br /&gt;
[[:File:Работа индикатора.jpg]]&lt;br /&gt;
&amp;lt;br/&amp;gt; На рисунке ниже показано, на какие выводы необходимо подать низкий уровень, чтобы зажечь необходимый сегмент&lt;br /&gt;
[[:File:Индикатор.jpg]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Текст реализации счетчика времени нажатия&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
module main( &lt;br /&gt;
				input clk, &lt;br /&gt;
				input BTNS, // кнопка&lt;br /&gt;
				output [3:0] AN, // выводы к анодам для переключения семисегментных индикаторов&lt;br /&gt;
				output [7:0] ind // выводы к катодам семисегментного индикатора&lt;br /&gt;
    );&lt;br /&gt;
	 reg [3:0] assist_AN; // вспомогательный регистр для анодов семисегментных индикаторов&lt;br /&gt;
	 reg [7:0] assist_ind; // вспомогательный регистр для катодов семисегментного индикатора&lt;br /&gt;
	 reg [26:0] sum; // накапливаемое значение суммы для регистрации нажатия&lt;br /&gt;
	 reg [7:0] assist_ld; // сумматор времени нажатия кнопки&lt;br /&gt;
	 reg [3:0] nul_r; // младший сегмент индикатора&lt;br /&gt;
	 reg [3:0] first_r; // второй сегмент индикатора&lt;br /&gt;
	 reg [3:0] second_r; // третий сегмент индикатора&lt;br /&gt;
	 reg [17:0] counter; // регистр, хранящий время работы семисегментного индикатора&lt;br /&gt;
	 reg [1:0] c; // регистр указателя номера семисегментного индикатора&lt;br /&gt;
	 always @(posedge clk)&lt;br /&gt;
	 begin&lt;br /&gt;
		if (BTNS) // нажатие кнопки&lt;br /&gt;
			sum &amp;lt;= sum + 1'b1; &lt;br /&gt;
		else&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
		if (sum &amp;gt;= 27'd100000000) // суммирование времени нажатия до 1 секунды&lt;br /&gt;
			begin&lt;br /&gt;
			assist_ld &amp;lt;= assist_ld + 1'b1; // счет количества секунд&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
			end&lt;br /&gt;
		nul_r &amp;lt;= assist_ld % 10; // значение первого семисегментного индикатора&lt;br /&gt;
		first_r &amp;lt;= (assist_ld % 100 - nul_r)/10; // значение второго индикатора&lt;br /&gt;
		second_r &amp;lt;= assist_ld / 100; // значение третьего индикатора&lt;br /&gt;
		counter &amp;lt;= counter + 1'b1;&lt;br /&gt;
			if (counter == 17'd200000) // цикл работы семисегметных индикаторов&lt;br /&gt;
			begin&lt;br /&gt;
				c &amp;lt;= c + 1'b1;&lt;br /&gt;
				counter &amp;lt;= 17'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (c == 2'b00) // первый семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1110; // значение анодов&lt;br /&gt;
		case (nul_r)&lt;br /&gt;
			4'd0: assist_ind &amp;lt;= 8'b00000011; // значения катодов&lt;br /&gt;
			4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
			4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
			4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
			4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
			4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
			4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
			4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
			4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
			4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
			default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
		endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b01) // второй семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1101;&lt;br /&gt;
		case (first_r)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
				4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
				4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
				4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b10) // третий семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1011;&lt;br /&gt;
		case (second_r)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	assign AN = assist_AN; // значение на выходах к аноду равно значению вспомогательных регистров&lt;br /&gt;
	assign ind = assist_ind; // значение на выходах к катоду равно значению вспомогательных регистров&lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;ucf файл с описанием портов ввода-вывода&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NET &amp;quot;clk&amp;quot; LOC = V10;&lt;br /&gt;
NET &amp;quot;BTNS&amp;quot; LOC = B8;&lt;br /&gt;
NET &amp;quot;AN[0]&amp;quot; LOC = N16;&lt;br /&gt;
NET &amp;quot;AN[1]&amp;quot; LOC = N15;&lt;br /&gt;
NET &amp;quot;AN[2]&amp;quot; LOC = P18;&lt;br /&gt;
NET &amp;quot;AN[3]&amp;quot; LOC = P17;&lt;br /&gt;
NET &amp;quot;ind[0]&amp;quot; LOC = M13;&lt;br /&gt;
NET &amp;quot;ind[1]&amp;quot; LOC = L14;&lt;br /&gt;
NET &amp;quot;ind[2]&amp;quot; LOC = N14;&lt;br /&gt;
NET &amp;quot;ind[3]&amp;quot; LOC = M14;&lt;br /&gt;
NET &amp;quot;ind[4]&amp;quot; LOC = U18;&lt;br /&gt;
NET &amp;quot;ind[5]&amp;quot; LOC = U17;&lt;br /&gt;
NET &amp;quot;ind[6]&amp;quot; LOC = T18;&lt;br /&gt;
NET &amp;quot;ind[7]&amp;quot; LOC = T17;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализация часов ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Реализация часов отличается от счетчика времени нажатия незначительно.&lt;br /&gt;
Здесь отсутствует кнопка. Отличие в подсчете времени здесь состоит в том, что здесь счетчик времени представляет собой счетчики минут и секунд. Счет происходит до 59 минут 59 секунд, после чего все сбрасывается. В предыдущем случае счет шел до 255 секунд.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;Текст реализации&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module main( &lt;br /&gt;
				input clk, &lt;br /&gt;
				output [3:0] AN,&lt;br /&gt;
				output [7:0] ind&lt;br /&gt;
    );&lt;br /&gt;
	 reg [3:0] assist_AN;&lt;br /&gt;
	 reg [7:0] assist_ind;&lt;br /&gt;
	 reg [26:0] sum;&lt;br /&gt;
	 reg [5:0] seconds;&lt;br /&gt;
	 reg [5:0] minutes;&lt;br /&gt;
	 reg [3:0] seconds_jr; // регистр хранения значения первой цифры в счетчике секунд&lt;br /&gt;
	 reg [3:0] seconds_sr; // регистр хранения значения второй цифры в счетчике секунд&lt;br /&gt;
	 reg [3:0] minutes_jr; // регистр хранения значения первой цифры в счетчике минут&lt;br /&gt;
	 reg [3:0] minutes_sr; // регистр хранения значения второй цифры в счетчике минут&lt;br /&gt;
	 reg [17:0] counter;&lt;br /&gt;
	 reg [1:0] c;&lt;br /&gt;
	 always @(posedge clk)&lt;br /&gt;
	 begin&lt;br /&gt;
			sum &amp;lt;= sum + 1'b1;&lt;br /&gt;
		if (sum &amp;gt;= 27'd100000000)&lt;br /&gt;
			begin&lt;br /&gt;
			seconds &amp;lt;= seconds + 1'b1; //счетчик секунд&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (seconds == 6'd60)&lt;br /&gt;
			begin&lt;br /&gt;
			minutes &amp;lt;= minutes +1'b1; // счетчик минут&lt;br /&gt;
			seconds &amp;lt;= 6'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (minutes == 6'd60)&lt;br /&gt;
			minutes &amp;lt;= 6'd0;&lt;br /&gt;
		seconds_jr &amp;lt;= seconds % 10; // вычисление значения первой цифры в счетчике секунд&lt;br /&gt;
		seconds_sr &amp;lt;= seconds/10; // вычисление значения второй цифры в счетчике секунд&lt;br /&gt;
		minutes_jr &amp;lt;= minutes % 10; // вычисление значения первой цифры в счетчике минут&lt;br /&gt;
		minutes_sr &amp;lt;= minutes/10; 	// вычисление значения второй цифры в счетчике минут&lt;br /&gt;
		counter &amp;lt;= counter + 1'b1;&lt;br /&gt;
			if (counter == 17'd200000)&lt;br /&gt;
			begin&lt;br /&gt;
				c &amp;lt;= c + 1'b1;&lt;br /&gt;
				counter &amp;lt;= 17'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (c == 2'b00)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1110;&lt;br /&gt;
		case (seconds_jr)&lt;br /&gt;
			4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
			4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
			4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
			4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
			4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
			4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
			4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
			4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
			4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
			4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
			default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
		endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b01)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1101;&lt;br /&gt;
		case (seconds_sr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b10)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1011;&lt;br /&gt;
		case (minutes_jr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000010;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011110;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100100;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001100;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011000;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001000;&lt;br /&gt;
				4'd6: assist_ind &amp;lt;= 8'b01000000;&lt;br /&gt;
				4'd7: assist_ind &amp;lt;= 8'b00011110;&lt;br /&gt;
				4'd8: assist_ind &amp;lt;= 8'b00000000;&lt;br /&gt;
				4'd9: assist_ind &amp;lt;= 8'b00001000;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b11)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b0111;&lt;br /&gt;
		case (minutes_sr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	assign AN = assist_AN;&lt;br /&gt;
	assign ind = assist_ind;&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Здесь ucf файл отличается только отсутствием кнопки BTNS&amp;lt;br/&amp;gt;&lt;br /&gt;
--[[Участник:Belyanushkin|Belyanushkin]] ([[Обсуждение участника:Belyanushkin|обсуждение]]) 00:20, 25 ноября 2014 (MSK)&lt;/div&gt;</summary>
		<author><name>Belyanushkin</name></author>	</entry>

	<entry>
		<id>https://wiki.srns.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%D0%B0.jpg</id>
		<title>Файл:Работа индикатора.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.srns.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%D0%B0.jpg"/>
				<updated>2014-12-22T17:29:09Z</updated>
		
		<summary type="html">&lt;p&gt;Belyanushkin: Belyanushkin загружена новая версия «Файл:Работа индикатора.jpg»: MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MsUpload&lt;/div&gt;</summary>
		<author><name>Belyanushkin</name></author>	</entry>

	<entry>
		<id>https://wiki.srns.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%D0%B0.jpg</id>
		<title>Файл:Работа индикатора.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.srns.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%D0%B0.jpg"/>
				<updated>2014-12-22T17:19:05Z</updated>
		
		<summary type="html">&lt;p&gt;Belyanushkin: Belyanushkin загружена новая версия «Файл:Работа индикатора.jpg»: MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MsUpload&lt;/div&gt;</summary>
		<author><name>Belyanushkin</name></author>	</entry>

	<entry>
		<id>https://wiki.srns.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%D0%B0.jpg</id>
		<title>Файл:Работа индикатора.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.srns.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%D0%B0.jpg"/>
				<updated>2014-12-22T17:19:04Z</updated>
		
		<summary type="html">&lt;p&gt;Belyanushkin: MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MsUpload&lt;/div&gt;</summary>
		<author><name>Belyanushkin</name></author>	</entry>

	<entry>
		<id>https://wiki.srns.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:%D0%98%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80.jpg</id>
		<title>Файл:Индикатор.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.srns.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:%D0%98%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80.jpg"/>
				<updated>2014-12-22T17:19:04Z</updated>
		
		<summary type="html">&lt;p&gt;Belyanushkin: MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MsUpload&lt;/div&gt;</summary>
		<author><name>Belyanushkin</name></author>	</entry>

	<entry>
		<id>https://wiki.srns.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:RTOScreenshot_2014-12-22_1_123056.png</id>
		<title>Файл:RTOScreenshot 2014-12-22 1 123056.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.srns.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:RTOScreenshot_2014-12-22_1_123056.png"/>
				<updated>2014-12-22T17:19:03Z</updated>
		
		<summary type="html">&lt;p&gt;Belyanushkin: MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MsUpload&lt;/div&gt;</summary>
		<author><name>Belyanushkin</name></author>	</entry>

	<entry>
		<id>https://wiki.srns.ru/wiki/%D0%A7%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_Verilog</id>
		<title>Часы на Verilog</title>
		<link rel="alternate" type="text/html" href="https://wiki.srns.ru/wiki/%D0%A7%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_Verilog"/>
				<updated>2014-12-22T17:10:34Z</updated>
		
		<summary type="html">&lt;p&gt;Belyanushkin: /* Реализация часов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Введение ==&lt;br /&gt;
&lt;br /&gt;
Для освоения программирования ПЛИС на языке Verilog была поставлена задача написания программы смысл которой заключается в подсчете времени нажатия на кнопку.&lt;br /&gt;
&lt;br /&gt;
== Подзадачи ==&lt;br /&gt;
&lt;br /&gt;
1. Установка программы ISE Design Suite 14.7 на ОС Windows 8.1. &lt;br /&gt;
&amp;lt;br/&amp;gt;2. Написание простых программ для понимания языка Verilog:&lt;br /&gt;
&amp;lt;br/&amp;gt;- Счетчик нажатий, выполняющий вывод значений в двоичной системе на диоды;&lt;br /&gt;
&amp;lt;br/&amp;gt;- Программа для работы нескольких семисегментных индикаторов.&lt;br /&gt;
&amp;lt;br/&amp;gt;3. Синтез этих программ для того, чтобы решить поставленную задачу.&lt;br /&gt;
&amp;lt;br/&amp;gt;4. Для отработки навыков реализовать часы.&lt;br /&gt;
&amp;lt;br/&amp;gt;Реализация всех программ производилась на ПЛИС Xilinx Spartan-6 на отладочной плате  DIGILENT NEXYS 3&lt;br /&gt;
&lt;br /&gt;
== Проблемы в ходе выполнения подзадач ==&lt;br /&gt;
&lt;br /&gt;
В ходе решения подзадач возникла проблема с установкой программы ISE Design Suite 14.7 на ОС Windows 8.1.&lt;br /&gt;
Проблема заключается в зависании программы при создании нового проекта.&lt;br /&gt;
&amp;lt;br/&amp;gt;Проблема была решается следующим путем:&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 1: зайти в директорию: C:\Xilinx\14.5\ISE_DS\ISE\lib\nt64&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 2: переименовать файл libPortability.dll в libPortability.dll.orig&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 3: переименовать файл libPortabilityNOSH.dll в libPortability.dll&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 4: скопировать файл libPortability.dll &amp;lt;ctrl+c&amp;gt; &lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 5: зайти в директорию C:\Xilinx\14.5\ISE_DS\common\lib\nt64&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 6: вставить файл из шага 4  &amp;lt;libPortability.dll &amp;gt; в данную директорию&lt;br /&gt;
&amp;lt;br/&amp;gt;Оригинал статьи про проблемы с работой I SE Design Suite 14.7 на ОС Windows 8.1 находится по следующей ссылке&lt;br /&gt;
[http://stuffs4studies.blogspot.ru/2014/02/is-xilinx-147-ise-crashing-in-windows-8.html]&lt;br /&gt;
&lt;br /&gt;
== Описание реализации счетчика времени нажатия кнопки ==&lt;br /&gt;
&lt;br /&gt;
[[File:Схема_new.jpg|800px]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Основными частями реализации являются счетчики:&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчик суммы времени нажатия до одной секунды;&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчик времени нажатий в секундах;&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчики для работы семисегментного индикатора.&lt;br /&gt;
&amp;lt;br/&amp;gt;Алгоритм работы счетчика таков:&lt;br /&gt;
&amp;lt;br/&amp;gt;1. При нажатии на кнопку происходит начинается счет тактовых сигналов;&lt;br /&gt;
&amp;lt;br/&amp;gt;2. При достижении количества сигналов, равного 10^8 в счетчике суммы прибавляется одна секунда, счетчик импульсов сбрасывается в ноль;&lt;br /&gt;
&amp;lt;br/&amp;gt;3. Далее с регистра, содержащего информацию о количестве секунд, эти значению передаются на дальнейшую обработку для передачи на семисегментные индикаторы.&lt;br /&gt;
&amp;lt;br/&amp;gt;4. Реализация работы семисегментных индикаторов была произведена с помощью циклов.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;Подробнее про работу с семисегментными индикаторами.&lt;br /&gt;
&amp;lt;br/&amp;gt;Так как индикаторов 4 а катоды к ним общие, то принято было работать по следующему алгоритму. Есть 2 счетчика. Один счетчик считает количество тактовых сигналов. Когда это количество становится равным 200000 то на втором счетчике прибавляется единица. В зависимости от значения на втором счетчике выбирается тот анод, на котором будет низкий уровень и значит загорится этот индикатор. Так как время циклов очень мало, то мы мы не замечаем мигание индикаторов. Второй счетчик в схеме имеет 2 разряда, поэтому сбрасывать его нет необходимости.&lt;br /&gt;
&lt;br /&gt;
[[File:Симисегментный индикатор.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;Текст реализации счетчика времени нажатия&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
module main( &lt;br /&gt;
				input clk, &lt;br /&gt;
				input BTNS, // кнопка&lt;br /&gt;
				output [3:0] AN, // выводы к анодам для переключения семисегментных индикаторов&lt;br /&gt;
				output [7:0] ind // выводы к катодам семисегментного индикатора&lt;br /&gt;
    );&lt;br /&gt;
	 reg [3:0] assist_AN; // вспомогательный регистр для анодов семисегментных индикаторов&lt;br /&gt;
	 reg [7:0] assist_ind; // вспомогательный регистр для катодов семисегментного индикатора&lt;br /&gt;
	 reg [26:0] sum; // накапливаемое значение суммы для регистрации нажатия&lt;br /&gt;
	 reg [7:0] assist_ld; // сумматор времени нажатия кнопки&lt;br /&gt;
	 reg [3:0] nul_r; // младший сегмент индикатора&lt;br /&gt;
	 reg [3:0] first_r; // второй сегмент индикатора&lt;br /&gt;
	 reg [3:0] second_r; // третий сегмент индикатора&lt;br /&gt;
	 reg [17:0] counter; // регистр, хранящий время работы семисегментного индикатора&lt;br /&gt;
	 reg [1:0] c; // регистр указателя номера семисегментного индикатора&lt;br /&gt;
	 always @(posedge clk)&lt;br /&gt;
	 begin&lt;br /&gt;
		if (BTNS) // нажатие кнопки&lt;br /&gt;
			sum &amp;lt;= sum + 1'b1; &lt;br /&gt;
		else&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
		if (sum &amp;gt;= 27'd100000000) // суммирование времени нажатия до 1 секунды&lt;br /&gt;
			begin&lt;br /&gt;
			assist_ld &amp;lt;= assist_ld + 1'b1; // счет количества секунд&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
			end&lt;br /&gt;
		nul_r &amp;lt;= assist_ld % 10; // значение первого семисегментного индикатора&lt;br /&gt;
		first_r &amp;lt;= (assist_ld % 100 - nul_r)/10; // значение второго индикатора&lt;br /&gt;
		second_r &amp;lt;= assist_ld / 100; // значение третьего индикатора&lt;br /&gt;
		counter &amp;lt;= counter + 1'b1;&lt;br /&gt;
			if (counter == 17'd200000) // цикл работы семисегметных индикаторов&lt;br /&gt;
			begin&lt;br /&gt;
				c &amp;lt;= c + 1'b1;&lt;br /&gt;
				counter &amp;lt;= 17'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (c == 2'b00) // первый семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1110; // значение анодов&lt;br /&gt;
		case (nul_r)&lt;br /&gt;
			4'd0: assist_ind &amp;lt;= 8'b00000011; // значения катодов&lt;br /&gt;
			4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
			4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
			4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
			4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
			4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
			4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
			4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
			4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
			4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
			default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
		endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b01) // второй семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1101;&lt;br /&gt;
		case (first_r)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
				4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
				4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
				4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b10) // третий семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1011;&lt;br /&gt;
		case (second_r)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	assign AN = assist_AN; // значение на выходах к аноду равно значению вспомогательных регистров&lt;br /&gt;
	assign ind = assist_ind; // значение на выходах к катоду равно значению вспомогательных регистров&lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;ucf файл с описанием портов ввода-вывода&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NET &amp;quot;clk&amp;quot; LOC = V10;&lt;br /&gt;
NET &amp;quot;BTNS&amp;quot; LOC = B8;&lt;br /&gt;
NET &amp;quot;AN[0]&amp;quot; LOC = N16;&lt;br /&gt;
NET &amp;quot;AN[1]&amp;quot; LOC = N15;&lt;br /&gt;
NET &amp;quot;AN[2]&amp;quot; LOC = P18;&lt;br /&gt;
NET &amp;quot;AN[3]&amp;quot; LOC = P17;&lt;br /&gt;
NET &amp;quot;ind[0]&amp;quot; LOC = M13;&lt;br /&gt;
NET &amp;quot;ind[1]&amp;quot; LOC = L14;&lt;br /&gt;
NET &amp;quot;ind[2]&amp;quot; LOC = N14;&lt;br /&gt;
NET &amp;quot;ind[3]&amp;quot; LOC = M14;&lt;br /&gt;
NET &amp;quot;ind[4]&amp;quot; LOC = U18;&lt;br /&gt;
NET &amp;quot;ind[5]&amp;quot; LOC = U17;&lt;br /&gt;
NET &amp;quot;ind[6]&amp;quot; LOC = T18;&lt;br /&gt;
NET &amp;quot;ind[7]&amp;quot; LOC = T17;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализация часов ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Реализация часов отличается от счетчика времени нажатия незначительно.&lt;br /&gt;
Здесь отсутствует кнопка. Отличие в подсчете времени здесь состоит в том, что здесь счетчик времени представляет собой счетчики минут и секунд. Счет происходит до 59 минут 59 секунд, после чего все сбрасывается. В предыдущем случае счет шел до 255 секунд.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;Текст реализации&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module main( &lt;br /&gt;
				input clk, &lt;br /&gt;
				output [3:0] AN,&lt;br /&gt;
				output [7:0] ind&lt;br /&gt;
    );&lt;br /&gt;
	 reg [3:0] assist_AN;&lt;br /&gt;
	 reg [7:0] assist_ind;&lt;br /&gt;
	 reg [26:0] sum;&lt;br /&gt;
	 reg [5:0] seconds;&lt;br /&gt;
	 reg [5:0] minutes;&lt;br /&gt;
	 reg [3:0] seconds_jr; // регистр хранения значения первой цифры в счетчике секунд&lt;br /&gt;
	 reg [3:0] seconds_sr; // регистр хранения значения второй цифры в счетчике секунд&lt;br /&gt;
	 reg [3:0] minutes_jr; // регистр хранения значения первой цифры в счетчике минут&lt;br /&gt;
	 reg [3:0] minutes_sr; // регистр хранения значения второй цифры в счетчике минут&lt;br /&gt;
	 reg [17:0] counter;&lt;br /&gt;
	 reg [1:0] c;&lt;br /&gt;
	 always @(posedge clk)&lt;br /&gt;
	 begin&lt;br /&gt;
			sum &amp;lt;= sum + 1'b1;&lt;br /&gt;
		if (sum &amp;gt;= 27'd100000000)&lt;br /&gt;
			begin&lt;br /&gt;
			seconds &amp;lt;= seconds + 1'b1; //счетчик секунд&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (seconds == 6'd60)&lt;br /&gt;
			begin&lt;br /&gt;
			minutes &amp;lt;= minutes +1'b1; // счетчик минут&lt;br /&gt;
			seconds &amp;lt;= 6'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (minutes == 6'd60)&lt;br /&gt;
			minutes &amp;lt;= 6'd0;&lt;br /&gt;
		seconds_jr &amp;lt;= seconds % 10; // вычисление значения первой цифры в счетчике секунд&lt;br /&gt;
		seconds_sr &amp;lt;= seconds/10; // вычисление значения второй цифры в счетчике секунд&lt;br /&gt;
		minutes_jr &amp;lt;= minutes % 10; // вычисление значения первой цифры в счетчике минут&lt;br /&gt;
		minutes_sr &amp;lt;= minutes/10; 	// вычисление значения второй цифры в счетчике минут&lt;br /&gt;
		counter &amp;lt;= counter + 1'b1;&lt;br /&gt;
			if (counter == 17'd200000)&lt;br /&gt;
			begin&lt;br /&gt;
				c &amp;lt;= c + 1'b1;&lt;br /&gt;
				counter &amp;lt;= 17'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (c == 2'b00)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1110;&lt;br /&gt;
		case (seconds_jr)&lt;br /&gt;
			4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
			4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
			4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
			4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
			4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
			4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
			4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
			4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
			4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
			4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
			default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
		endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b01)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1101;&lt;br /&gt;
		case (seconds_sr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b10)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1011;&lt;br /&gt;
		case (minutes_jr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000010;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011110;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100100;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001100;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011000;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001000;&lt;br /&gt;
				4'd6: assist_ind &amp;lt;= 8'b01000000;&lt;br /&gt;
				4'd7: assist_ind &amp;lt;= 8'b00011110;&lt;br /&gt;
				4'd8: assist_ind &amp;lt;= 8'b00000000;&lt;br /&gt;
				4'd9: assist_ind &amp;lt;= 8'b00001000;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b11)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b0111;&lt;br /&gt;
		case (minutes_sr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	assign AN = assist_AN;&lt;br /&gt;
	assign ind = assist_ind;&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Здесь ucf файл отличается только отсутствием кнопки BTNS&amp;lt;br/&amp;gt;&lt;br /&gt;
--[[Участник:Belyanushkin|Belyanushkin]] ([[Обсуждение участника:Belyanushkin|обсуждение]]) 00:20, 25 ноября 2014 (MSK)&lt;/div&gt;</summary>
		<author><name>Belyanushkin</name></author>	</entry>

	<entry>
		<id>https://wiki.srns.ru/wiki/%D0%A7%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_Verilog</id>
		<title>Часы на Verilog</title>
		<link rel="alternate" type="text/html" href="https://wiki.srns.ru/wiki/%D0%A7%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_Verilog"/>
				<updated>2014-12-22T17:07:15Z</updated>
		
		<summary type="html">&lt;p&gt;Belyanushkin: /* Описание реализации счетчика времени нажатия кнопки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Введение ==&lt;br /&gt;
&lt;br /&gt;
Для освоения программирования ПЛИС на языке Verilog была поставлена задача написания программы смысл которой заключается в подсчете времени нажатия на кнопку.&lt;br /&gt;
&lt;br /&gt;
== Подзадачи ==&lt;br /&gt;
&lt;br /&gt;
1. Установка программы ISE Design Suite 14.7 на ОС Windows 8.1. &lt;br /&gt;
&amp;lt;br/&amp;gt;2. Написание простых программ для понимания языка Verilog:&lt;br /&gt;
&amp;lt;br/&amp;gt;- Счетчик нажатий, выполняющий вывод значений в двоичной системе на диоды;&lt;br /&gt;
&amp;lt;br/&amp;gt;- Программа для работы нескольких семисегментных индикаторов.&lt;br /&gt;
&amp;lt;br/&amp;gt;3. Синтез этих программ для того, чтобы решить поставленную задачу.&lt;br /&gt;
&amp;lt;br/&amp;gt;4. Для отработки навыков реализовать часы.&lt;br /&gt;
&amp;lt;br/&amp;gt;Реализация всех программ производилась на ПЛИС Xilinx Spartan-6 на отладочной плате  DIGILENT NEXYS 3&lt;br /&gt;
&lt;br /&gt;
== Проблемы в ходе выполнения подзадач ==&lt;br /&gt;
&lt;br /&gt;
В ходе решения подзадач возникла проблема с установкой программы ISE Design Suite 14.7 на ОС Windows 8.1.&lt;br /&gt;
Проблема заключается в зависании программы при создании нового проекта.&lt;br /&gt;
&amp;lt;br/&amp;gt;Проблема была решается следующим путем:&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 1: зайти в директорию: C:\Xilinx\14.5\ISE_DS\ISE\lib\nt64&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 2: переименовать файл libPortability.dll в libPortability.dll.orig&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 3: переименовать файл libPortabilityNOSH.dll в libPortability.dll&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 4: скопировать файл libPortability.dll &amp;lt;ctrl+c&amp;gt; &lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 5: зайти в директорию C:\Xilinx\14.5\ISE_DS\common\lib\nt64&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 6: вставить файл из шага 4  &amp;lt;libPortability.dll &amp;gt; в данную директорию&lt;br /&gt;
&amp;lt;br/&amp;gt;Оригинал статьи про проблемы с работой I SE Design Suite 14.7 на ОС Windows 8.1 находится по следующей ссылке&lt;br /&gt;
[http://stuffs4studies.blogspot.ru/2014/02/is-xilinx-147-ise-crashing-in-windows-8.html]&lt;br /&gt;
&lt;br /&gt;
== Описание реализации счетчика времени нажатия кнопки ==&lt;br /&gt;
&lt;br /&gt;
[[File:Схема_new.jpg|800px]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Основными частями реализации являются счетчики:&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчик суммы времени нажатия до одной секунды;&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчик времени нажатий в секундах;&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчики для работы семисегментного индикатора.&lt;br /&gt;
&amp;lt;br/&amp;gt;Алгоритм работы счетчика таков:&lt;br /&gt;
&amp;lt;br/&amp;gt;1. При нажатии на кнопку происходит начинается счет тактовых сигналов;&lt;br /&gt;
&amp;lt;br/&amp;gt;2. При достижении количества сигналов, равного 10^8 в счетчике суммы прибавляется одна секунда, счетчик импульсов сбрасывается в ноль;&lt;br /&gt;
&amp;lt;br/&amp;gt;3. Далее с регистра, содержащего информацию о количестве секунд, эти значению передаются на дальнейшую обработку для передачи на семисегментные индикаторы.&lt;br /&gt;
&amp;lt;br/&amp;gt;4. Реализация работы семисегментных индикаторов была произведена с помощью циклов.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;Подробнее про работу с семисегментными индикаторами.&lt;br /&gt;
&amp;lt;br/&amp;gt;Так как индикаторов 4 а катоды к ним общие, то принято было работать по следующему алгоритму. Есть 2 счетчика. Один счетчик считает количество тактовых сигналов. Когда это количество становится равным 200000 то на втором счетчике прибавляется единица. В зависимости от значения на втором счетчике выбирается тот анод, на котором будет низкий уровень и значит загорится этот индикатор. Так как время циклов очень мало, то мы мы не замечаем мигание индикаторов. Второй счетчик в схеме имеет 2 разряда, поэтому сбрасывать его нет необходимости.&lt;br /&gt;
&lt;br /&gt;
[[File:Симисегментный индикатор.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;Текст реализации счетчика времени нажатия&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
module main( &lt;br /&gt;
				input clk, &lt;br /&gt;
				input BTNS, // кнопка&lt;br /&gt;
				output [3:0] AN, // выводы к анодам для переключения семисегментных индикаторов&lt;br /&gt;
				output [7:0] ind // выводы к катодам семисегментного индикатора&lt;br /&gt;
    );&lt;br /&gt;
	 reg [3:0] assist_AN; // вспомогательный регистр для анодов семисегментных индикаторов&lt;br /&gt;
	 reg [7:0] assist_ind; // вспомогательный регистр для катодов семисегментного индикатора&lt;br /&gt;
	 reg [26:0] sum; // накапливаемое значение суммы для регистрации нажатия&lt;br /&gt;
	 reg [7:0] assist_ld; // сумматор времени нажатия кнопки&lt;br /&gt;
	 reg [3:0] nul_r; // младший сегмент индикатора&lt;br /&gt;
	 reg [3:0] first_r; // второй сегмент индикатора&lt;br /&gt;
	 reg [3:0] second_r; // третий сегмент индикатора&lt;br /&gt;
	 reg [17:0] counter; // регистр, хранящий время работы семисегментного индикатора&lt;br /&gt;
	 reg [1:0] c; // регистр указателя номера семисегментного индикатора&lt;br /&gt;
	 always @(posedge clk)&lt;br /&gt;
	 begin&lt;br /&gt;
		if (BTNS) // нажатие кнопки&lt;br /&gt;
			sum &amp;lt;= sum + 1'b1; &lt;br /&gt;
		else&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
		if (sum &amp;gt;= 27'd100000000) // суммирование времени нажатия до 1 секунды&lt;br /&gt;
			begin&lt;br /&gt;
			assist_ld &amp;lt;= assist_ld + 1'b1; // счет количества секунд&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
			end&lt;br /&gt;
		nul_r &amp;lt;= assist_ld % 10; // значение первого семисегментного индикатора&lt;br /&gt;
		first_r &amp;lt;= (assist_ld % 100 - nul_r)/10; // значение второго индикатора&lt;br /&gt;
		second_r &amp;lt;= assist_ld / 100; // значение третьего индикатора&lt;br /&gt;
		counter &amp;lt;= counter + 1'b1;&lt;br /&gt;
			if (counter == 17'd200000) // цикл работы семисегметных индикаторов&lt;br /&gt;
			begin&lt;br /&gt;
				c &amp;lt;= c + 1'b1;&lt;br /&gt;
				counter &amp;lt;= 17'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (c == 2'b00) // первый семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1110; // значение анодов&lt;br /&gt;
		case (nul_r)&lt;br /&gt;
			4'd0: assist_ind &amp;lt;= 8'b00000011; // значения катодов&lt;br /&gt;
			4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
			4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
			4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
			4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
			4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
			4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
			4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
			4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
			4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
			default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
		endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b01) // второй семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1101;&lt;br /&gt;
		case (first_r)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
				4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
				4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
				4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b10) // третий семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1011;&lt;br /&gt;
		case (second_r)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	assign AN = assist_AN; // значение на выходах к аноду равно значению вспомогательных регистров&lt;br /&gt;
	assign ind = assist_ind; // значение на выходах к катоду равно значению вспомогательных регистров&lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;ucf файл с описанием портов ввода-вывода&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NET &amp;quot;clk&amp;quot; LOC = V10;&lt;br /&gt;
NET &amp;quot;BTNS&amp;quot; LOC = B8;&lt;br /&gt;
NET &amp;quot;AN[0]&amp;quot; LOC = N16;&lt;br /&gt;
NET &amp;quot;AN[1]&amp;quot; LOC = N15;&lt;br /&gt;
NET &amp;quot;AN[2]&amp;quot; LOC = P18;&lt;br /&gt;
NET &amp;quot;AN[3]&amp;quot; LOC = P17;&lt;br /&gt;
NET &amp;quot;ind[0]&amp;quot; LOC = M13;&lt;br /&gt;
NET &amp;quot;ind[1]&amp;quot; LOC = L14;&lt;br /&gt;
NET &amp;quot;ind[2]&amp;quot; LOC = N14;&lt;br /&gt;
NET &amp;quot;ind[3]&amp;quot; LOC = M14;&lt;br /&gt;
NET &amp;quot;ind[4]&amp;quot; LOC = U18;&lt;br /&gt;
NET &amp;quot;ind[5]&amp;quot; LOC = U17;&lt;br /&gt;
NET &amp;quot;ind[6]&amp;quot; LOC = T18;&lt;br /&gt;
NET &amp;quot;ind[7]&amp;quot; LOC = T17;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализация часов ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Реализация часов отличается от счетчика времени нажатия незначительно.&lt;br /&gt;
Здесь отсутствует кнопка. Отличие в подсчете времени здесь состоит в том, что здесь счетчик времени представляет собой счетчики минут и секунд. Счет происходит до 59 минут 59 секунд, после чего все сбрасывается. В предыдущем случае счет шел до 255 секунд.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;Текст реализации&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module main( &lt;br /&gt;
				input clk, &lt;br /&gt;
				output [3:0] AN,&lt;br /&gt;
				output [7:0] ind&lt;br /&gt;
    );&lt;br /&gt;
	 reg [3:0] assist_AN;&lt;br /&gt;
	 reg [7:0] assist_ind;&lt;br /&gt;
	 reg [26:0] sum;&lt;br /&gt;
	 reg [5:0] seconds;&lt;br /&gt;
	 reg [5:0] minutes;&lt;br /&gt;
	 reg [3:0] seconds_jr; // регистр хранения значения первой цифры в счетчике секунд&lt;br /&gt;
	 reg [3:0] seconds_sr; // регистр хранения значения второй цифры в счетчике секунд&lt;br /&gt;
	 reg [3:0] minutes_jr; // регистр хранения значения первой цифры в счетчике минут&lt;br /&gt;
	 reg [3:0] minutes_sr; // регистр хранения значения второй цифры в счетчике минут&lt;br /&gt;
	 reg [17:0] counter;&lt;br /&gt;
	 reg [1:0] c;&lt;br /&gt;
	 always @(posedge clk)&lt;br /&gt;
	 begin&lt;br /&gt;
			sum &amp;lt;= sum + 1'b1;&lt;br /&gt;
		if (sum &amp;gt;= 27'd100000000)&lt;br /&gt;
			begin&lt;br /&gt;
			seconds &amp;lt;= seconds + 1'b1; //счетчик секунд&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (seconds == 6'd60)&lt;br /&gt;
			begin&lt;br /&gt;
			minutes &amp;lt;= minutes +1'b1; // счетчик минут&lt;br /&gt;
			seconds &amp;lt;= 6'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (minutes == 6'd60)&lt;br /&gt;
			minutes &amp;lt;= 6'd0;&lt;br /&gt;
		seconds_jr &amp;lt;= seconds % 10; // вычисление значения первой цифры в счетчике секунд&lt;br /&gt;
		seconds_sr &amp;lt;= seconds/10; // вычисление значения второй цифры в счетчике секунд&lt;br /&gt;
		minutes_jr &amp;lt;= minutes % 10; // вычисление значения первой цифры в счетчике минут&lt;br /&gt;
		minutes_sr &amp;lt;= minutes/10; 	// вычисление значения второй цифры в счетчике минут&lt;br /&gt;
		counter &amp;lt;= counter + 1'b1;&lt;br /&gt;
			if (counter == 17'd200000)&lt;br /&gt;
			begin&lt;br /&gt;
				c &amp;lt;= c + 1'b1;&lt;br /&gt;
				counter &amp;lt;= 17'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (c == 2'b00)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1110;&lt;br /&gt;
		case (seconds_jr)&lt;br /&gt;
			4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
			4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
			4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
			4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
			4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
			4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
			4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
			4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
			4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
			4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
			default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
		endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b01)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1101;&lt;br /&gt;
		case (seconds_sr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b10)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1011;&lt;br /&gt;
		case (minutes_jr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000010;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011110;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100100;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001100;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011000;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001000;&lt;br /&gt;
				4'd6: assist_ind &amp;lt;= 8'b01000000;&lt;br /&gt;
				4'd7: assist_ind &amp;lt;= 8'b00011110;&lt;br /&gt;
				4'd8: assist_ind &amp;lt;= 8'b00000000;&lt;br /&gt;
				4'd9: assist_ind &amp;lt;= 8'b00001000;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b11)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b0111;&lt;br /&gt;
		case (minutes_sr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	assign AN = assist_AN;&lt;br /&gt;
	assign ind = assist_ind;&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--[[Участник:Belyanushkin|Belyanushkin]] ([[Обсуждение участника:Belyanushkin|обсуждение]]) 00:20, 25 ноября 2014 (MSK)&lt;/div&gt;</summary>
		<author><name>Belyanushkin</name></author>	</entry>

	<entry>
		<id>https://wiki.srns.ru/wiki/%D0%A7%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_Verilog</id>
		<title>Часы на Verilog</title>
		<link rel="alternate" type="text/html" href="https://wiki.srns.ru/wiki/%D0%A7%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_Verilog"/>
				<updated>2014-11-30T19:02:40Z</updated>
		
		<summary type="html">&lt;p&gt;Belyanushkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Введение ==&lt;br /&gt;
&lt;br /&gt;
Для освоения программирования ПЛИС на языке Verilog была поставлена задача написания программы смысл которой заключается в подсчете времени нажатия на кнопку.&lt;br /&gt;
&lt;br /&gt;
== Подзадачи ==&lt;br /&gt;
&lt;br /&gt;
1. Установка программы ISE Design Suite 14.7 на ОС Windows 8.1. &lt;br /&gt;
&amp;lt;br/&amp;gt;2. Написание простых программ для понимания языка Verilog:&lt;br /&gt;
&amp;lt;br/&amp;gt;- Счетчик нажатий, выполняющий вывод значений в двоичной системе на диоды;&lt;br /&gt;
&amp;lt;br/&amp;gt;- Программа для работы нескольких семисегментных индикаторов.&lt;br /&gt;
&amp;lt;br/&amp;gt;3. Синтез этих программ для того, чтобы решить поставленную задачу.&lt;br /&gt;
&amp;lt;br/&amp;gt;4. Для отработки навыков реализовать часы.&lt;br /&gt;
&amp;lt;br/&amp;gt;Реализация всех программ производилась на ПЛИС Xilinx Spartan-6 на отладочной плате  DIGILENT NEXYS 3&lt;br /&gt;
&lt;br /&gt;
== Проблемы в ходе выполнения подзадач ==&lt;br /&gt;
&lt;br /&gt;
В ходе решения подзадач возникла проблема с установкой программы ISE Design Suite 14.7 на ОС Windows 8.1.&lt;br /&gt;
Проблема заключается в зависании программы при создании нового проекта.&lt;br /&gt;
&amp;lt;br/&amp;gt;Проблема была решается следующим путем:&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 1: зайти в директорию: C:\Xilinx\14.5\ISE_DS\ISE\lib\nt64&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 2: переименовать файл libPortability.dll в libPortability.dll.orig&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 3: переименовать файл libPortabilityNOSH.dll в libPortability.dll&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 4: скопировать файл libPortability.dll &amp;lt;ctrl+c&amp;gt; &lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 5: зайти в директорию C:\Xilinx\14.5\ISE_DS\common\lib\nt64&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 6: вставить файл из шага 4  &amp;lt;libPortability.dll &amp;gt; в данную директорию&lt;br /&gt;
&amp;lt;br/&amp;gt;Оригинал статьи про проблемы с работой I SE Design Suite 14.7 на ОС Windows 8.1 находится по следующей ссылке&lt;br /&gt;
[http://stuffs4studies.blogspot.ru/2014/02/is-xilinx-147-ise-crashing-in-windows-8.html]&lt;br /&gt;
&lt;br /&gt;
== Описание реализации счетчика времени нажатия кнопки ==&lt;br /&gt;
&lt;br /&gt;
[[File:Схема_new.jpg|800px]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Основными частями реализации являются счетчики:&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчик суммы времени нажатия до одной секунды;&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчик времени нажатий в секундах;&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчики для работы семисегментного индикатора.&lt;br /&gt;
&amp;lt;br/&amp;gt;Алгоритм работы счетчика таков:&lt;br /&gt;
&amp;lt;br/&amp;gt;1. При нажатии на кнопку происходит начинается счет тактовых сигналов;&lt;br /&gt;
&amp;lt;br/&amp;gt;2. При достижении количества сигналов, равного 10^8 в счетчике суммы прибавляется одна секунда, счетчик импульсов сбрасывается в ноль;&lt;br /&gt;
&amp;lt;br/&amp;gt;3. Далее с регистра, содержащего информацию о количестве секунд, эти значению передаются на дальнейшую обработку для передачи на семисегментные индикаторы.&lt;br /&gt;
&amp;lt;br/&amp;gt;4. Реализация работы семисегментных индикаторов была произведена с помощью циклов.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;Подробнее про работу с семисегментными индикаторами.&lt;br /&gt;
&amp;lt;br/&amp;gt;Так как индикаторов 4 а катоды к ним общие, то принято было работать по следующему алгоритму. Есть 2 счетчика. Один счетчик считает количество тактовых сигналов. Когда это количество становится равным 200000 то на втором счетчике прибавляется единица. В зависимости от значения на втором счетчике выбирается тот анод, на котором будет низкий уровень и значит загорится этот индикатор. Так как время циклов очень мало, то мы мы не замечаем мигание индикаторов. Второй счетчик в схеме имеет 2 разряда, поэтому сбрасывать его нет необходимости.&lt;br /&gt;
[[File:Симисегментный индикатор.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;Текст реализации счетчика времени нажатия&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
module main( &lt;br /&gt;
				input clk, &lt;br /&gt;
				input BTNS, // кнопка&lt;br /&gt;
				output [3:0] AN, // выводы к анодам для переключения семисегментных индикаторов&lt;br /&gt;
				output [7:0] ind // выводы к катодам семисегментного индикатора&lt;br /&gt;
    );&lt;br /&gt;
	 reg [3:0] assist_AN; // вспомогательный регистр для анодов семисегментных индикаторов&lt;br /&gt;
	 reg [7:0] assist_ind; // вспомогательный регистр для катодов семисегментного индикатора&lt;br /&gt;
	 reg [26:0] sum; // накапливаемое значение суммы для регистрации нажатия&lt;br /&gt;
	 reg [7:0] assist_ld; // сумматор времени нажатия кнопки&lt;br /&gt;
	 reg [3:0] nul_r; // младший сегмент индикатора&lt;br /&gt;
	 reg [3:0] first_r; // второй сегмент индикатора&lt;br /&gt;
	 reg [3:0] second_r; // третий сегмент индикатора&lt;br /&gt;
	 reg [17:0] counter; // регистр, хранящий время работы семисегментного индикатора&lt;br /&gt;
	 reg [1:0] c; // регистр указателя номера семисегментного индикатора&lt;br /&gt;
	 always @(posedge clk)&lt;br /&gt;
	 begin&lt;br /&gt;
		if (BTNS) // нажатие кнопки&lt;br /&gt;
			sum &amp;lt;= sum + 1'b1; &lt;br /&gt;
		else&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
		if (sum &amp;gt;= 27'd100000000) // суммирование времени нажатия до 1 секунды&lt;br /&gt;
			begin&lt;br /&gt;
			assist_ld &amp;lt;= assist_ld + 1'b1; // счет количества секунд&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
			end&lt;br /&gt;
		nul_r &amp;lt;= assist_ld % 10; // значение первого семисегментного индикатора&lt;br /&gt;
		first_r &amp;lt;= (assist_ld % 100 - nul_r)/10; // значение второго индикатора&lt;br /&gt;
		second_r &amp;lt;= assist_ld / 100; // значение третьего индикатора&lt;br /&gt;
		counter &amp;lt;= counter + 1'b1;&lt;br /&gt;
			if (counter == 17'd200000) // цикл работы семисегметных индикаторов&lt;br /&gt;
			begin&lt;br /&gt;
				c &amp;lt;= c + 1'b1;&lt;br /&gt;
				counter &amp;lt;= 17'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (c == 2'b00) // первый семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1110; // значение анодов&lt;br /&gt;
		case (nul_r)&lt;br /&gt;
			4'd0: assist_ind &amp;lt;= 8'b00000011; // значения катодов&lt;br /&gt;
			4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
			4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
			4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
			4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
			4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
			4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
			4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
			4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
			4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
			default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
		endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b01) // второй семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1101;&lt;br /&gt;
		case (first_r)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
				4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
				4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
				4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b10) // третий семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1011;&lt;br /&gt;
		case (second_r)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	assign AN = assist_AN; // значение на выходах к аноду равно значению вспомогательных регистров&lt;br /&gt;
	assign ind = assist_ind; // значение на выходах к катоду равно значению вспомогательных регистров&lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализация часов ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Реализация часов отличается от счетчика времени нажатия незначительно.&lt;br /&gt;
Здесь отсутствует кнопка. Отличие в подсчете времени здесь состоит в том, что здесь счетчик времени представляет собой счетчики минут и секунд. Счет происходит до 59 минут 59 секунд, после чего все сбрасывается. В предыдущем случае счет шел до 255 секунд.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;Текст реализации&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module main( &lt;br /&gt;
				input clk, &lt;br /&gt;
				output [3:0] AN,&lt;br /&gt;
				output [7:0] ind&lt;br /&gt;
    );&lt;br /&gt;
	 reg [3:0] assist_AN;&lt;br /&gt;
	 reg [7:0] assist_ind;&lt;br /&gt;
	 reg [26:0] sum;&lt;br /&gt;
	 reg [5:0] seconds;&lt;br /&gt;
	 reg [5:0] minutes;&lt;br /&gt;
	 reg [3:0] seconds_jr; // регистр хранения значения первой цифры в счетчике секунд&lt;br /&gt;
	 reg [3:0] seconds_sr; // регистр хранения значения второй цифры в счетчике секунд&lt;br /&gt;
	 reg [3:0] minutes_jr; // регистр хранения значения первой цифры в счетчике минут&lt;br /&gt;
	 reg [3:0] minutes_sr; // регистр хранения значения второй цифры в счетчике минут&lt;br /&gt;
	 reg [17:0] counter;&lt;br /&gt;
	 reg [1:0] c;&lt;br /&gt;
	 always @(posedge clk)&lt;br /&gt;
	 begin&lt;br /&gt;
			sum &amp;lt;= sum + 1'b1;&lt;br /&gt;
		if (sum &amp;gt;= 27'd100000000)&lt;br /&gt;
			begin&lt;br /&gt;
			seconds &amp;lt;= seconds + 1'b1; //счетчик секунд&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (seconds == 6'd60)&lt;br /&gt;
			begin&lt;br /&gt;
			minutes &amp;lt;= minutes +1'b1; // счетчик минут&lt;br /&gt;
			seconds &amp;lt;= 6'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (minutes == 6'd60)&lt;br /&gt;
			minutes &amp;lt;= 6'd0;&lt;br /&gt;
		seconds_jr &amp;lt;= seconds % 10; // вычисление значения первой цифры в счетчике секунд&lt;br /&gt;
		seconds_sr &amp;lt;= seconds/10; // вычисление значения второй цифры в счетчике секунд&lt;br /&gt;
		minutes_jr &amp;lt;= minutes % 10; // вычисление значения первой цифры в счетчике минут&lt;br /&gt;
		minutes_sr &amp;lt;= minutes/10; 	// вычисление значения второй цифры в счетчике минут&lt;br /&gt;
		counter &amp;lt;= counter + 1'b1;&lt;br /&gt;
			if (counter == 17'd200000)&lt;br /&gt;
			begin&lt;br /&gt;
				c &amp;lt;= c + 1'b1;&lt;br /&gt;
				counter &amp;lt;= 17'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (c == 2'b00)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1110;&lt;br /&gt;
		case (seconds_jr)&lt;br /&gt;
			4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
			4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
			4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
			4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
			4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
			4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
			4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
			4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
			4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
			4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
			default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
		endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b01)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1101;&lt;br /&gt;
		case (seconds_sr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b10)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1011;&lt;br /&gt;
		case (minutes_jr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000010;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011110;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100100;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001100;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011000;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001000;&lt;br /&gt;
				4'd6: assist_ind &amp;lt;= 8'b01000000;&lt;br /&gt;
				4'd7: assist_ind &amp;lt;= 8'b00011110;&lt;br /&gt;
				4'd8: assist_ind &amp;lt;= 8'b00000000;&lt;br /&gt;
				4'd9: assist_ind &amp;lt;= 8'b00001000;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b11)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b0111;&lt;br /&gt;
		case (minutes_sr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	assign AN = assist_AN;&lt;br /&gt;
	assign ind = assist_ind;&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--[[Участник:Belyanushkin|Belyanushkin]] ([[Обсуждение участника:Belyanushkin|обсуждение]]) 00:20, 25 ноября 2014 (MSK)&lt;/div&gt;</summary>
		<author><name>Belyanushkin</name></author>	</entry>

	<entry>
		<id>https://wiki.srns.ru/wiki/%D0%A7%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_Verilog</id>
		<title>Часы на Verilog</title>
		<link rel="alternate" type="text/html" href="https://wiki.srns.ru/wiki/%D0%A7%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_Verilog"/>
				<updated>2014-11-30T18:51:12Z</updated>
		
		<summary type="html">&lt;p&gt;Belyanushkin: /* Описание реализации счетчика времени нажатия кнопки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Введение ==&lt;br /&gt;
&lt;br /&gt;
Для освоения программирования ПЛИС на языке Verilog была поставлена задача написания программы смысл которой заключается в подсчете времени нажатия на кнопку.&lt;br /&gt;
&lt;br /&gt;
== Подзадачи ==&lt;br /&gt;
&lt;br /&gt;
1. Установка программы ISE Design Suite 14.7 на ОС Windows 8.1. &lt;br /&gt;
&amp;lt;br/&amp;gt;2. Написание простых программ для понимания языка Verilog:&lt;br /&gt;
&amp;lt;br/&amp;gt;- Счетчик нажатий, выполняющий вывод значений в двоичной системе на диоды;&lt;br /&gt;
&amp;lt;br/&amp;gt;- Программа для работы нескольких семисегментных индикаторов.&lt;br /&gt;
&amp;lt;br/&amp;gt;3. Синтез этих программ для того, чтобы решить поставленную задачу.&lt;br /&gt;
&amp;lt;br/&amp;gt;4. Для отработки навыков реализовать часы.&lt;br /&gt;
&amp;lt;br/&amp;gt;Реализация всех программ производилась на ПЛИС Xilinx Spartan-6 на отладочной плате  DIGILENT NEXYS 3&lt;br /&gt;
&lt;br /&gt;
== Проблемы в ходе выполнения подзадач ==&lt;br /&gt;
&lt;br /&gt;
В ходе решения подзадач возникла проблема с установкой программы ISE Design Suite 14.7 на ОС Windows 8.1.&lt;br /&gt;
Проблема заключается в зависании программы при создании нового проекта.&lt;br /&gt;
&amp;lt;br/&amp;gt;Проблема была решается следующим путем:&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 1: зайти в директорию: C:\Xilinx\14.5\ISE_DS\ISE\lib\nt64&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 2: переименовать файл libPortability.dll в libPortability.dll.orig&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 3: переименовать файл libPortabilityNOSH.dll в libPortability.dll&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 4: скопировать файл libPortability.dll &amp;lt;ctrl+c&amp;gt; &lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 5: зайти в директорию C:\Xilinx\14.5\ISE_DS\common\lib\nt64&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 6: вставить файл из шага 4  &amp;lt;libPortability.dll &amp;gt; в данную директорию&lt;br /&gt;
&amp;lt;br/&amp;gt;Оригинал статьи про проблемы с работой I SE Design Suite 14.7 на ОС Windows 8.1 находится по следующей ссылке&lt;br /&gt;
[http://stuffs4studies.blogspot.ru/2014/02/is-xilinx-147-ise-crashing-in-windows-8.html]&lt;br /&gt;
&lt;br /&gt;
== Описание реализации счетчика времени нажатия кнопки ==&lt;br /&gt;
&lt;br /&gt;
[[File:Схема_new.jpg|800px]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Основными частями реализации являются счетчики:&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчик суммы времени нажатия до одной секунды;&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчик времени нажатий в секундах;&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчики для работы семисегментного индикатора.&lt;br /&gt;
&amp;lt;br/&amp;gt;Алгоритм работы счетчика таков:&lt;br /&gt;
&amp;lt;br/&amp;gt;1. При нажатии на кнопку происходит начинается счет тактовых сигналов;&lt;br /&gt;
&amp;lt;br/&amp;gt;2. При достижении количества сигналов, равного 10^8 в счетчике суммы прибавляется одна секунда, счетчик импульсов сбрасывается в ноль;&lt;br /&gt;
&amp;lt;br/&amp;gt;3. Далее с регистра, содержащего информацию о количестве секунд, эти значению передаются на дальнейшую обработку для передачи на семисегментные индикаторы.&lt;br /&gt;
&amp;lt;br/&amp;gt;4. Реализация работы семисегментных индикаторов была произведена с помощью циклов.&lt;br /&gt;
&lt;br /&gt;
[[File:Симисегментный индикатор.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;Текст реализации счетчика времени нажатия&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
module main( &lt;br /&gt;
				input clk, &lt;br /&gt;
				input BTNS, // кнопка&lt;br /&gt;
				output [3:0] AN, // выводы к анодам для переключения семисегментных индикаторов&lt;br /&gt;
				output [7:0] ind // выводы к катодам семисегментного индикатора&lt;br /&gt;
    );&lt;br /&gt;
	 reg [3:0] assist_AN; // вспомогательный регистр для анодов семисегментных индикаторов&lt;br /&gt;
	 reg [7:0] assist_ind; // вспомогательный регистр для катодов семисегментного индикатора&lt;br /&gt;
	 reg [26:0] sum; // накапливаемое значение суммы для регистрации нажатия&lt;br /&gt;
	 reg [7:0] assist_ld; // сумматор времени нажатия кнопки&lt;br /&gt;
	 reg [3:0] nul_r; // младший сегмент индикатора&lt;br /&gt;
	 reg [3:0] first_r; // второй сегмент индикатора&lt;br /&gt;
	 reg [3:0] second_r; // третий сегмент индикатора&lt;br /&gt;
	 reg [17:0] counter; // регистр, хранящий время работы семисегментного индикатора&lt;br /&gt;
	 reg [1:0] c; // регистр указателя номера семисегментного индикатора&lt;br /&gt;
	 always @(posedge clk)&lt;br /&gt;
	 begin&lt;br /&gt;
		if (BTNS) // нажатие кнопки&lt;br /&gt;
			sum &amp;lt;= sum + 1'b1; &lt;br /&gt;
		else&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
		if (sum &amp;gt;= 27'd100000000) // суммирование времени нажатия до 1 секунды&lt;br /&gt;
			begin&lt;br /&gt;
			assist_ld &amp;lt;= assist_ld + 1'b1; // счет количества секунд&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
			end&lt;br /&gt;
		nul_r &amp;lt;= assist_ld % 10; // значение первого семисегментного индикатора&lt;br /&gt;
		first_r &amp;lt;= (assist_ld % 100 - nul_r)/10; // значение второго индикатора&lt;br /&gt;
		second_r &amp;lt;= assist_ld / 100; // значение третьего индикатора&lt;br /&gt;
		counter &amp;lt;= counter + 1'b1;&lt;br /&gt;
			if (counter == 17'd200000) // цикл работы семисегметных индикаторов&lt;br /&gt;
			begin&lt;br /&gt;
				c &amp;lt;= c + 1'b1;&lt;br /&gt;
				counter &amp;lt;= 17'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (c == 2'b00) // первый семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1110; // значение анодов&lt;br /&gt;
		case (nul_r)&lt;br /&gt;
			4'd0: assist_ind &amp;lt;= 8'b00000011; // значения катодов&lt;br /&gt;
			4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
			4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
			4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
			4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
			4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
			4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
			4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
			4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
			4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
			default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
		endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b01) // второй семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1101;&lt;br /&gt;
		case (first_r)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
				4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
				4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
				4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b10) // третий семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1011;&lt;br /&gt;
		case (second_r)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	assign AN = assist_AN; // значение на выходах к аноду равно значению вспомогательных регистров&lt;br /&gt;
	assign ind = assist_ind; // значение на выходах к катоду равно значению вспомогательных регистров&lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализация часов ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Реализация часов отличается от счетчика времени нажатия незначительно.&lt;br /&gt;
Здесь отсутствует кнопка. Отличие в подсчете времени здесь состоит в том, что здесь счетчик времени представляет собой счетчики минут и секунд. Счет происходит до 59 минут 59 секунд, после чего все сбрасывается. В предыдущем случае счет шел до 255 секунд.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;Текст реализации&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module main( &lt;br /&gt;
				input clk, &lt;br /&gt;
				output [3:0] AN,&lt;br /&gt;
				output [7:0] ind&lt;br /&gt;
    );&lt;br /&gt;
	 reg [3:0] assist_AN;&lt;br /&gt;
	 reg [7:0] assist_ind;&lt;br /&gt;
	 reg [26:0] sum;&lt;br /&gt;
	 reg [5:0] seconds;&lt;br /&gt;
	 reg [5:0] minutes;&lt;br /&gt;
	 reg [3:0] seconds_jr; // регистр хранения значения первой цифры в счетчике секунд&lt;br /&gt;
	 reg [3:0] seconds_sr; // регистр хранения значения второй цифры в счетчике секунд&lt;br /&gt;
	 reg [3:0] minutes_jr; // регистр хранения значения первой цифры в счетчике минут&lt;br /&gt;
	 reg [3:0] minutes_sr; // регистр хранения значения второй цифры в счетчике минут&lt;br /&gt;
	 reg [17:0] counter;&lt;br /&gt;
	 reg [1:0] c;&lt;br /&gt;
	 always @(posedge clk)&lt;br /&gt;
	 begin&lt;br /&gt;
			sum &amp;lt;= sum + 1'b1;&lt;br /&gt;
		if (sum &amp;gt;= 27'd100000000)&lt;br /&gt;
			begin&lt;br /&gt;
			seconds &amp;lt;= seconds + 1'b1; //счетчик секунд&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (seconds == 6'd60)&lt;br /&gt;
			begin&lt;br /&gt;
			minutes &amp;lt;= minutes +1'b1; // счетчик минут&lt;br /&gt;
			seconds &amp;lt;= 6'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (minutes == 6'd60)&lt;br /&gt;
			minutes &amp;lt;= 6'd0;&lt;br /&gt;
		seconds_jr &amp;lt;= seconds % 10; // вычисление значения первой цифры в счетчике секунд&lt;br /&gt;
		seconds_sr &amp;lt;= seconds/10; // вычисление значения второй цифры в счетчике секунд&lt;br /&gt;
		minutes_jr &amp;lt;= minutes % 10; // вычисление значения первой цифры в счетчике минут&lt;br /&gt;
		minutes_sr &amp;lt;= minutes/10; 	// вычисление значения второй цифры в счетчике минут&lt;br /&gt;
		counter &amp;lt;= counter + 1'b1;&lt;br /&gt;
			if (counter == 17'd200000)&lt;br /&gt;
			begin&lt;br /&gt;
				c &amp;lt;= c + 1'b1;&lt;br /&gt;
				counter &amp;lt;= 17'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (c == 2'b00)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1110;&lt;br /&gt;
		case (seconds_jr)&lt;br /&gt;
			4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
			4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
			4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
			4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
			4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
			4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
			4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
			4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
			4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
			4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
			default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
		endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b01)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1101;&lt;br /&gt;
		case (seconds_sr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b10)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1011;&lt;br /&gt;
		case (minutes_jr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000010;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011110;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100100;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001100;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011000;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001000;&lt;br /&gt;
				4'd6: assist_ind &amp;lt;= 8'b01000000;&lt;br /&gt;
				4'd7: assist_ind &amp;lt;= 8'b00011110;&lt;br /&gt;
				4'd8: assist_ind &amp;lt;= 8'b00000000;&lt;br /&gt;
				4'd9: assist_ind &amp;lt;= 8'b00001000;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b11)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b0111;&lt;br /&gt;
		case (minutes_sr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	assign AN = assist_AN;&lt;br /&gt;
	assign ind = assist_ind;&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--[[Участник:Belyanushkin|Belyanushkin]] ([[Обсуждение участника:Belyanushkin|обсуждение]]) 00:20, 25 ноября 2014 (MSK)&lt;/div&gt;</summary>
		<author><name>Belyanushkin</name></author>	</entry>

	<entry>
		<id>https://wiki.srns.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A1%D1%85%D0%B5%D0%BC%D0%B0_new.jpg</id>
		<title>Файл:Схема new.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.srns.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A1%D1%85%D0%B5%D0%BC%D0%B0_new.jpg"/>
				<updated>2014-11-30T18:49:07Z</updated>
		
		<summary type="html">&lt;p&gt;Belyanushkin: MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MsUpload&lt;/div&gt;</summary>
		<author><name>Belyanushkin</name></author>	</entry>

	<entry>
		<id>https://wiki.srns.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A1%D0%B8%D0%BC%D0%B8%D1%81%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80.jpg</id>
		<title>Файл:Симисегментный индикатор.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.srns.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A1%D0%B8%D0%BC%D0%B8%D1%81%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80.jpg"/>
				<updated>2014-11-30T18:49:06Z</updated>
		
		<summary type="html">&lt;p&gt;Belyanushkin: MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MsUpload&lt;/div&gt;</summary>
		<author><name>Belyanushkin</name></author>	</entry>

	<entry>
		<id>https://wiki.srns.ru/wiki/%D0%A7%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_Verilog</id>
		<title>Часы на Verilog</title>
		<link rel="alternate" type="text/html" href="https://wiki.srns.ru/wiki/%D0%A7%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_Verilog"/>
				<updated>2014-11-24T20:20:36Z</updated>
		
		<summary type="html">&lt;p&gt;Belyanushkin: Новая страница: «== Введение ==  Для освоения программирования ПЛИС на языке Verilog была поставлена задача на…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Введение ==&lt;br /&gt;
&lt;br /&gt;
Для освоения программирования ПЛИС на языке Verilog была поставлена задача написания программы смысл которой заключается в подсчете времени нажатия на кнопку.&lt;br /&gt;
&lt;br /&gt;
== Подзадачи ==&lt;br /&gt;
&lt;br /&gt;
1. Установка программы ISE Design Suite 14.7 на ОС Windows 8.1. &lt;br /&gt;
&amp;lt;br/&amp;gt;2. Написание простых программ для понимания языка Verilog:&lt;br /&gt;
&amp;lt;br/&amp;gt;- Счетчик нажатий, выполняющий вывод значений в двоичной системе на диоды;&lt;br /&gt;
&amp;lt;br/&amp;gt;- Программа для работы нескольких семисегментных индикаторов.&lt;br /&gt;
&amp;lt;br/&amp;gt;3. Синтез этих программ для того, чтобы решить поставленную задачу.&lt;br /&gt;
&amp;lt;br/&amp;gt;4. Для отработки навыков реализовать часы.&lt;br /&gt;
&amp;lt;br/&amp;gt;Реализация всех программ производилась на ПЛИС Xilinx Spartan-6 на отладочной плате  DIGILENT NEXYS 3&lt;br /&gt;
&lt;br /&gt;
== Проблемы в ходе выполнения подзадач ==&lt;br /&gt;
&lt;br /&gt;
В ходе решения подзадач возникла проблема с установкой программы ISE Design Suite 14.7 на ОС Windows 8.1.&lt;br /&gt;
Проблема заключается в зависании программы при создании нового проекта.&lt;br /&gt;
&amp;lt;br/&amp;gt;Проблема была решается следующим путем:&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 1: зайти в директорию: C:\Xilinx\14.5\ISE_DS\ISE\lib\nt64&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 2: переименовать файл libPortability.dll в libPortability.dll.orig&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 3: переименовать файл libPortabilityNOSH.dll в libPortability.dll&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 4: скопировать файл libPortability.dll &amp;lt;ctrl+c&amp;gt; &lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 5: зайти в директорию C:\Xilinx\14.5\ISE_DS\common\lib\nt64&lt;br /&gt;
&amp;lt;br/&amp;gt;Шаг 6: вставить файл из шага 4  &amp;lt;libPortability.dll &amp;gt; в данную директорию&lt;br /&gt;
&amp;lt;br/&amp;gt;Оригинал статьи про проблемы с работой I SE Design Suite 14.7 на ОС Windows 8.1 находится по следующей ссылке&lt;br /&gt;
[http://stuffs4studies.blogspot.ru/2014/02/is-xilinx-147-ise-crashing-in-windows-8.html]&lt;br /&gt;
&lt;br /&gt;
== Описание реализации счетчика времени нажатия кнопки ==&lt;br /&gt;
&lt;br /&gt;
[[File:Схема счетчика.jpg|400px]]&lt;br /&gt;
&amp;lt;br/&amp;gt;Основными частями реализации являются счетчики:&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчик суммы времени нажатия до одной секунды;&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчик времени нажатий в секундах;&lt;br /&gt;
&amp;lt;br/&amp;gt;- счетчики для работы семисегментного индикатора.&lt;br /&gt;
&amp;lt;br/&amp;gt;Алгоритм работы счетчика таков:&lt;br /&gt;
&amp;lt;br/&amp;gt;1. При нажатии на кнопку происходит начинается счет тактовых сигналов;&lt;br /&gt;
&amp;lt;br/&amp;gt;2. При достижении количества сигналов, равного 10^8 в счетчике суммы прибавляется одна секунда, счетчик импульсов сбрасывается в ноль;&lt;br /&gt;
&amp;lt;br/&amp;gt;3. Далее с регистра, содержащего информацию о количестве секунд, эти значению передаются на дальнейшую обработку для передачи на семисегментные индикаторы.&lt;br /&gt;
&amp;lt;br/&amp;gt;4. Реализация работы семисегментных индикаторов была произведена с помощью циклов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;Текст реализации счетчика времени нажатия&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
module main( &lt;br /&gt;
				input clk, &lt;br /&gt;
				input BTNS, // кнопка&lt;br /&gt;
				output [3:0] AN, // выводы к анодам для переключения семисегментных индикаторов&lt;br /&gt;
				output [7:0] ind // выводы к катодам семисегментного индикатора&lt;br /&gt;
    );&lt;br /&gt;
	 reg [3:0] assist_AN; // вспомогательный регистр для анодов семисегментных индикаторов&lt;br /&gt;
	 reg [7:0] assist_ind; // вспомогательный регистр для катодов семисегментного индикатора&lt;br /&gt;
	 reg [26:0] sum; // накапливаемое значение суммы для регистрации нажатия&lt;br /&gt;
	 reg [7:0] assist_ld; // сумматор времени нажатия кнопки&lt;br /&gt;
	 reg [3:0] nul_r; // младший сегмент индикатора&lt;br /&gt;
	 reg [3:0] first_r; // второй сегмент индикатора&lt;br /&gt;
	 reg [3:0] second_r; // третий сегмент индикатора&lt;br /&gt;
	 reg [17:0] counter; // регистр, хранящий время работы семисегментного индикатора&lt;br /&gt;
	 reg [1:0] c; // регистр указателя номера семисегментного индикатора&lt;br /&gt;
	 always @(posedge clk)&lt;br /&gt;
	 begin&lt;br /&gt;
		if (BTNS) // нажатие кнопки&lt;br /&gt;
			sum &amp;lt;= sum + 1'b1; &lt;br /&gt;
		else&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
		if (sum &amp;gt;= 27'd100000000) // суммирование времени нажатия до 1 секунды&lt;br /&gt;
			begin&lt;br /&gt;
			assist_ld &amp;lt;= assist_ld + 1'b1; // счет количества секунд&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
			end&lt;br /&gt;
		nul_r &amp;lt;= assist_ld % 10; // значение первого семисегментного индикатора&lt;br /&gt;
		first_r &amp;lt;= (assist_ld % 100 - nul_r)/10; // значение второго индикатора&lt;br /&gt;
		second_r &amp;lt;= assist_ld / 100; // значение третьего индикатора&lt;br /&gt;
		counter &amp;lt;= counter + 1'b1;&lt;br /&gt;
			if (counter == 17'd200000) // цикл работы семисегметных индикаторов&lt;br /&gt;
			begin&lt;br /&gt;
				c &amp;lt;= c + 1'b1;&lt;br /&gt;
				counter &amp;lt;= 17'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (c == 2'b00) // первый семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1110; // значение анодов&lt;br /&gt;
		case (nul_r)&lt;br /&gt;
			4'd0: assist_ind &amp;lt;= 8'b00000011; // значения катодов&lt;br /&gt;
			4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
			4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
			4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
			4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
			4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
			4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
			4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
			4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
			4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
			default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
		endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b01) // второй семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1101;&lt;br /&gt;
		case (first_r)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
				4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
				4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
				4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b10) // третий семисегментный индикатор&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1011;&lt;br /&gt;
		case (second_r)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	assign AN = assist_AN; // значение на выходах к аноду равно значению вспомогательных регистров&lt;br /&gt;
	assign ind = assist_ind; // значение на выходах к катоду равно значению вспомогательных регистров&lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Реализация часов ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Реализация часов отличается от счетчика времени нажатия незначительно.&lt;br /&gt;
Здесь отсутствует кнопка. Отличие в подсчете времени здесь состоит в том, что здесь счетчик времени представляет собой счетчики минут и секунд. Счет происходит до 59 минут 59 секунд, после чего все сбрасывается. В предыдущем случае счет шел до 255 секунд.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;Текст реализации&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module main( &lt;br /&gt;
				input clk, &lt;br /&gt;
				output [3:0] AN,&lt;br /&gt;
				output [7:0] ind&lt;br /&gt;
    );&lt;br /&gt;
	 reg [3:0] assist_AN;&lt;br /&gt;
	 reg [7:0] assist_ind;&lt;br /&gt;
	 reg [26:0] sum;&lt;br /&gt;
	 reg [5:0] seconds;&lt;br /&gt;
	 reg [5:0] minutes;&lt;br /&gt;
	 reg [3:0] seconds_jr; // регистр хранения значения первой цифры в счетчике секунд&lt;br /&gt;
	 reg [3:0] seconds_sr; // регистр хранения значения второй цифры в счетчике секунд&lt;br /&gt;
	 reg [3:0] minutes_jr; // регистр хранения значения первой цифры в счетчике минут&lt;br /&gt;
	 reg [3:0] minutes_sr; // регистр хранения значения второй цифры в счетчике минут&lt;br /&gt;
	 reg [17:0] counter;&lt;br /&gt;
	 reg [1:0] c;&lt;br /&gt;
	 always @(posedge clk)&lt;br /&gt;
	 begin&lt;br /&gt;
			sum &amp;lt;= sum + 1'b1;&lt;br /&gt;
		if (sum &amp;gt;= 27'd100000000)&lt;br /&gt;
			begin&lt;br /&gt;
			seconds &amp;lt;= seconds + 1'b1; //счетчик секунд&lt;br /&gt;
			sum &amp;lt;= 27'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (seconds == 6'd60)&lt;br /&gt;
			begin&lt;br /&gt;
			minutes &amp;lt;= minutes +1'b1; // счетчик минут&lt;br /&gt;
			seconds &amp;lt;= 6'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (minutes == 6'd60)&lt;br /&gt;
			minutes &amp;lt;= 6'd0;&lt;br /&gt;
		seconds_jr &amp;lt;= seconds % 10; // вычисление значения первой цифры в счетчике секунд&lt;br /&gt;
		seconds_sr &amp;lt;= seconds/10; // вычисление значения второй цифры в счетчике секунд&lt;br /&gt;
		minutes_jr &amp;lt;= minutes % 10; // вычисление значения первой цифры в счетчике минут&lt;br /&gt;
		minutes_sr &amp;lt;= minutes/10; 	// вычисление значения второй цифры в счетчике минут&lt;br /&gt;
		counter &amp;lt;= counter + 1'b1;&lt;br /&gt;
			if (counter == 17'd200000)&lt;br /&gt;
			begin&lt;br /&gt;
				c &amp;lt;= c + 1'b1;&lt;br /&gt;
				counter &amp;lt;= 17'd0;&lt;br /&gt;
			end&lt;br /&gt;
		if (c == 2'b00)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1110;&lt;br /&gt;
		case (seconds_jr)&lt;br /&gt;
			4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
			4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
			4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
			4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
			4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
			4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
			4'd6: assist_ind &amp;lt;= 8'b01000001;&lt;br /&gt;
			4'd7: assist_ind &amp;lt;= 8'b00011111;&lt;br /&gt;
			4'd8: assist_ind &amp;lt;= 8'b00000001;&lt;br /&gt;
			4'd9: assist_ind &amp;lt;= 8'b00001001;&lt;br /&gt;
			default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
		endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b01)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1101;&lt;br /&gt;
		case (seconds_sr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase&lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b10)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b1011;&lt;br /&gt;
		case (minutes_jr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000010;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011110;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100100;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001100;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011000;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001000;&lt;br /&gt;
				4'd6: assist_ind &amp;lt;= 8'b01000000;&lt;br /&gt;
				4'd7: assist_ind &amp;lt;= 8'b00011110;&lt;br /&gt;
				4'd8: assist_ind &amp;lt;= 8'b00000000;&lt;br /&gt;
				4'd9: assist_ind &amp;lt;= 8'b00001000;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
		if (c == 2'b11)&lt;br /&gt;
		begin&lt;br /&gt;
		assist_AN &amp;lt;= 4'b0111;&lt;br /&gt;
		case (minutes_sr)&lt;br /&gt;
				4'd0: assist_ind &amp;lt;= 8'b00000011;&lt;br /&gt;
				4'd1: assist_ind &amp;lt;= 8'b10011111;&lt;br /&gt;
				4'd2: assist_ind &amp;lt;= 8'b00100101;&lt;br /&gt;
				4'd3: assist_ind &amp;lt;= 8'b00001101;&lt;br /&gt;
				4'd4: assist_ind &amp;lt;= 8'b10011001;&lt;br /&gt;
				4'd5: assist_ind &amp;lt;= 8'b01001001;&lt;br /&gt;
				default: assist_ind &amp;lt;= 8'b11111111;&lt;br /&gt;
				endcase &lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	assign AN = assist_AN;&lt;br /&gt;
	assign ind = assist_ind;&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--[[Участник:Belyanushkin|Belyanushkin]] ([[Обсуждение участника:Belyanushkin|обсуждение]]) 00:20, 25 ноября 2014 (MSK)&lt;/div&gt;</summary>
		<author><name>Belyanushkin</name></author>	</entry>

	<entry>
		<id>https://wiki.srns.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A1%D1%85%D0%B5%D0%BC%D0%B0_%D1%81%D1%87%D0%B5%D1%82%D1%87%D0%B8%D0%BA%D0%B0.jpg</id>
		<title>Файл:Схема счетчика.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.srns.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A1%D1%85%D0%B5%D0%BC%D0%B0_%D1%81%D1%87%D0%B5%D1%82%D1%87%D0%B8%D0%BA%D0%B0.jpg"/>
				<updated>2014-11-24T19:53:32Z</updated>
		
		<summary type="html">&lt;p&gt;Belyanushkin: MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MsUpload&lt;/div&gt;</summary>
		<author><name>Belyanushkin</name></author>	</entry>

	</feed>