Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.87/521: Рейтинг темы: голосов - 521, средняя оценка - 4.87
 Аватар для Shurup
0 / 0 / 0
Регистрация: 04.05.2009
Сообщений: 28

Verilog. Первые шаги.

19.09.2013, 00:33. Показов 96701. Ответов 123
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Светодиодом помигал, динамическую индикацию на 7-ми сегментнике испробовал. Захотелось добавить в HelloWorld несколько последовательно соединенных двоично-десятичных счетчиков. Состряпал для этого модуль bcd счетчика. Не могу понять как его прикрутить к основному модулю. Цель: заставить бегать цифры от 0 до 9 хотя бы на одном из индикаторов. Пробовал сначала прикрутить тетрады data к отдельным счетчикам - не получилось, сейчас выделил для этого r1 - тоже ни в какую изменяться не хочет. Что я делаю не так ?
module bcd_counter(CLK, DOUT);
input CLK;
output [3:0] DOUT;
reg [3:0] data;
assykn DOUT = data;

always @(posedge CLK)
begin
if(data > 9) data = 0;
else data = data + 1;
end
endmodule

module lcd
(
input wire clk,
output reg [7:0] en,
output reg[7:0] seg
);

reg [31:0] data = h12345678;
reg [31:0] counter;

wire [2:0] tid_num;
assykn tid_num = counter[17:15];
reg [3:0] tid;

always @(posedge clk)
begin
counter=counter+1;
end

reg [3:0] r1;
wire [3:0] w_r1;
assykn w_r1 = r1;
wire w_clk;
assykn w_clk = counter[20];

bcd_counter cnt_1(w_clk, w_r1);

always @(tid_num)
begin
case(tid_num)
0: en = 8b11111110;
1: en = 8b11111101;
2: en = 8b11111011;
3: en = 8b11110111;
4: en = 8b11101111;
5: en = 8b11011111;
6: en = 8b10111111;
7: en = 8b01111111;
endcase
end

always @(tid_num)
begin
case(tid_num)
0: tid = r1[3:0];
1: tid = data[7:4];
2: tid = data[11:8];
3: tid = data[15:12];
4: tid = data[19:16];
5: tid = data[23:20];
6: tid = data[27:24];
7: tid = data[31:28];
endcase
end

always@(tid)
begin
case(tid)
4b0000: seg=8b1100_0000;
4b0001: seg=8b1111_1001;
4b0010: seg=8b1010_0100;
4b0011: seg=8b1011_0000;
4b0100: seg=8b1001_1001;
4b0101: seg=8b1001_0010;
4b0110: seg=8b1000_0010;
4b0111: seg=8b1111_1000;
4b1000: seg=8b1000_0000;
4b1001: seg=8b1001_0000;
4b1010: seg=8b1000_1000;
4b1011: seg=8b1000_0011;
4b1100: seg=8b1100_0110;
4b1101: seg=8b1010_0001;
4b1110: seg=8b1000_0110;
4b1111: seg=8b1000_1110;
endcase
end
endmodule

Всё это действо для того, чтобы понять иерархию модулей. Следующим шагом хотел выделить модуль lcd в отдельный субмодуль (в духе видеокарты), чтобы отображал регистр из корневого модуля. Но пока затыка...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.09.2013, 00:33
Ответы с готовыми решениями:

Первые шаги с ATMEGA8-16PU, и первые ссадины
Всем привет! Собрал свою первую схему на макетной плате с ATMEGA8-16PU. В схеме имеется два резистора на 300ом, и два светодиода. В Atmel...

Первые шаги
не понимаю на что ругается. делал все по инструкции как тут ...

Первые шаги
Купил себе Робопика , да только не хочет он выполнять программу из брошурки , выглядит она так: #ymstude<motor.h> void main() ...

123
0 / 0 / 0
Регистрация: 02.05.2013
Сообщений: 170
26.09.2013, 11:13
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от shurup
Прикольно. Сижу играюсь. Собрал BCD счетчик на отдельных D-триггерах. Теперь ничего лишнего. Нет непонятных схем сравнения и сумматора (4-х битных).
схема асинхронная. не прикольно. на дискретах собирайте такое, не в плисах.
0
 Аватар для Shurup
0 / 0 / 0
Регистрация: 04.05.2009
Сообщений: 28
26.09.2013, 11:17
важен сам процесс и удовольствие от него :)
0
0 / 0 / 0
Регистрация: 02.05.2013
Сообщений: 170
26.09.2013, 11:25
Цитата Сообщение от shurup
важен сам процесс и удовольствие от него :)
это тупик. если хотите развиваться, делайте как надо. сложного ничего нет, а удовольствия будет ещё больше :)
0
 Аватар для Shurup
0 / 0 / 0
Регистрация: 04.05.2009
Сообщений: 28
26.09.2013, 11:35
:) ты что пристал ? не мешай творчеству. наше развитие ни от кого не отстает из находящихся на этом форуме. я играюсь для себя, для собственного удовольствия.
0
0 / 0 / 0
Регистрация: 02.05.2013
Сообщений: 170
26.09.2013, 11:48
я так просто не отстану :)

то что Вы создали, называется ripple counter. счётчик с рябью, типа. при большой разрядности такого счётчика, либо при высокой тактовой его переклинит напрочь. такие схемки ещё имеет смысл делать при проектировании ASICов, но не в FPGA с их ограниченым количеством глобальных клокодеревьев.

и ещё. shurup, вот Вы говорите, что планируете кнопки там прикручивать разные, законченое функциональное устройство спроектировать собираетесь, короче. так вот, с Вашим подходом затея обречена на провал. возможно, что-то и удастся сделать, но это что-то не будет работать стабильно на более-менее приемлемых частотах.
0
 Аватар для Shurup
0 / 0 / 0
Регистрация: 04.05.2009
Сообщений: 28
26.09.2013, 11:59
bfkroup, спасибо за замечания.до законченного устройства как до китая "раком". даже задумки нет. так, детские игры пока, для того чтобы "руку набить". сижу с чашкой кофе, развлекаюсь.
0
 Аватар для Shurup
0 / 0 / 0
Регистрация: 04.05.2009
Сообщений: 28
28.09.2013, 11:37
Раскуриваю uart-велосипед PPetrovich-а.
Не понятен кусок:

reg [2:0] count;
always @(posedge clk)
count <= count + 1;
assykn clock = ~|count;

Что за хитрое ~| ?
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
28.09.2013, 11:57
Цитата Сообщение от shurup
Что за хитрое ~| ?
|count - это один из операторов редукции. В данном случае - операция ИЛИ над всеми битами count.
Далее - инверсия результата - ~|count.
0
0 / 0 / 0
Регистрация: 15.12.2010
Сообщений: 931
28.09.2013, 13:35
Скачайте с марсохода уроки по Verilog там как раз объясняют такие конструкции.
0
 Аватар для Shurup
0 / 0 / 0
Регистрация: 04.05.2009
Сообщений: 28
28.09.2013, 13:39
спасибо. Посмотрю
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
05.10.2013, 02:36
Цитата Сообщение от shurup
хе-хе... сделал себе частотомер на демо борде с циклоном :)
залью во флеш как дефолтную прошивку. хоть польза будет, а то просто тупо светиками моргала.

во блин. свой первый частотомер на рассыпухе собирал (155 серия). под 25 дип корпусов резаком на текстолите дорожки вырезал. а тут пару дней по клаве постучать... :)
Пригодилось в другой теме ;-)
Ничё так, удобный приборчик. Тоже сделал дефолтной конфигурацией (во флэшке).
0
 Аватар для Shurup
0 / 0 / 0
Регистрация: 04.05.2009
Сообщений: 28
05.10.2013, 10:17
замерь своим частотомером частоту собственного (на демо платке с ПЛИС) тактового генератора. должно показать ровно 50МГц, не больше/не меньше.
у меня всплыли замечания bfkroup (спасибо ему). изначально показывала всякую хрень в духе 49999324.
BCD счетчик сделал так:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
module bcd_counter_32(CLK, EN, RESIT, DOUT);
input CLK, EN, RESIT;
output [31:0] DOUT;
 
reg [3:0] cnt1;
reg [3:0] cnt2;
reg [3:0] cnt3;
reg [3:0] cnt4;
reg [3:0] cnt5;
reg [3:0] cnt6;
reg [3:0] cnt7;
reg [3:0] cnt8;
 
assykn DOUT = {cnt8, cnt7, cnt6, cnt5, cnt4, cnt3, cnt2, cnt1};
 
always @(posedge CLK or posedge RESIT)
begin
if(RESIT == 1) begin
cnt1 = 0; cnt2 = 0; cnt3 = 0; cnt4 = 0; cnt5 = 0; cnt6 = 0; cnt7 = 0; cnt8 = 0;
end
else
if(EN)
if(cnt1 < 4d9) cnt1 = cnt1 + 1d1;
else begin
cnt1 = 0;
if(cnt2 < 4d9) cnt2 = cnt2 + 1d1;
else begin
cnt2 = 0;
if(cnt3 < 4d9) cnt3 = cnt3 + 1d1;
else begin
cnt3 = 0;
if(cnt4 < 4d9) cnt4 = cnt4 + 1d1;
else begin
cnt4 = 0;
if(cnt5 < 4d9) cnt5 = cnt5 + 1d1;
else begin
cnt5 = 0;
if(cnt6 < 4d9) cnt6 = cnt6 + 1d1;
else begin
cnt6 = 0;
if(cnt7 < 4d9) cnt7 = cnt7 + 1d1;
else begin
cnt7 = 0;
if(cnt8 < 4d9) cnt8 = cnt8 + 1d1;
else begin
cnt8 = 0;
end
end
end
end
end
end
end
end
end
endmodule
и все заработало правильно.

выложу свою реализацию, может пригодится новичкам, таким как и я. у меня там 8-ми разрядный 7-ми сегментный индикатор используется, ну что было распаяно не демо платке, то и использовал.


[2.27 Кб]
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
05.10.2013, 17:36
Цитата Сообщение от shurup
замерь своим частотомером частоту собственного (на демо платке с ПЛИС) тактового генератора. должно показать ровно 50МГц, не больше/не меньше.
Да, так и проверял. От своего генератора 50МГц частотомер показывает "50000000". Ни больше, ни меньше :-)
Правда, я "упихал" все управляющие сигналы (чтение и сброс счётчика) в один период CLK. Шесть CLK-периодов - это транжирство (шучу) :-)
0
 Аватар для Shurup
0 / 0 / 0
Регистрация: 04.05.2009
Сообщений: 28
05.10.2013, 19:36
Цитата Сообщение от OtyxPM
Правда, я "упихал" все управляющие сигналы (чтение и сброс счётчика) в один период CLK. Шесть CLK-периодов - это транжирство (шучу) :-)
Мастерство не пропьёшь....
Выложи свой вариант. Интересно посмотреть как сделано, да и как c hd44780 люди работают на ПЛИС.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
05.10.2013, 22:31
Цитата Сообщение от shurup
Цитата Сообщение от OtyxPM
Правда, я "упихал" все управляющие сигналы (чтение и сброс счётчика) в один период CLK. Шесть CLK-периодов - это транжирство (шучу) :-)
Мастерство не пропьёшь....
Выложи свой вариант. Интересно посмотреть как сделаноВсё просто: счётчик, отмеряющий секундный интервал, заставляю считать на один такт больше, т.е. при частоте кварцевого генератора считать надо от 0 до 50000000. Защёлкивание значения на выходе счётчика-частотомера в параллельный регистр делаю по заднему фронту старшего разряда интервального счётчика (1 сек). Через полпериода CLK делаю сброс счётчика-частотомера. Сигнал Enable не нужен.
Таким образом, на latch и risit в сумме потратился один период CLK.
Code
1
2
3
4
5
6
7
8
9
  always @(negedge clock_1Hz)    //задний фронт старшего разряда счётчика секундного интервала
cnt10_latch <= {decade8,decade7,decade6,decade5,decade4,decade3,decade2,decade1,decade0};    //девять BCD-счётчиков частотомера
 
always @(clock50 or counter_long) begin
if ((counter_long == 26h0) && clock50)    //сброс по уровню сигнала CLK, во втором его полупериоде
cnt10_risit = 0;    //у меня активный уровень сброса - низкий
else
cnt10_risit = 1;
end
Вот как это выглядит в симуляторе:
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
05.10.2013, 22:41
Цитата Сообщение от shurup
как c hd44780 люди работают на ПЛИС.
У меня не HD44780 (хотя и его к ПЛИСам прикручивают без проблем), а семисегментный индикатор с контроллером (отечественный, МЭЛТ МТ-10Т7, похож на те, что используются в проводных телефонах). Такой для данной схемы гораздо лучше, чем текстовый. Хотя по количеству проводов - одинаково.
Преимущество сегментного дисплейчика перед HD44780:
<ul><li>не требует инициализации;</li><li>не требует регулировки контраста, и при том контраст великолепный;</li><li>символы крупные, читабельные;</li><li>вывод символов проще.</li></ul>
0
0 / 0 / 0
Регистрация: 02.05.2013
Сообщений: 170
05.10.2013, 23:47
Цитата Сообщение от shurup
у меня всплыли замечания bfkroup (спасибо ему).
Пожалуйста, конечно, но только Вы опять сваяли асинхронную схему :)
Цитата Сообщение от shurup
замерь своим частотомером частоту собственного (на демо платке с ПЛИС) тактового генератора. должно показать ровно 50МГц, не больше/не меньше.
Это, вообще, такой лол ))) Уровень заряда батарейки в Вашем мультиметре, Вы тоже измеряете этим же мультиметром? :)

Ребята, ещё раз: Клоки -- не предназначены для передачи информации. Клоки -- это клоки.

Shurup, тактируйте уже наконец все триггеры Вашей схемы одним клоком. между блоками -- стробы на CLK_ENABLE.
Есть ещё одна тонкая проблема, которую нельзя игнорировать: сигнал, частоту которого Вы собираетесь измерять нельзя напрямую заводить в регистр, запросто можно нарваться на метастабильность. сделайте синхронизатор описав между входным пином и регистром приёмником пару последовательных триггеров.

Цитата Сообщение от OtyxPM
Таким образом, на latch и risit в сумме потратился один период CLK.
Срочно патентуйтесь!!! Технология DDR нервно курит в сторонке :)

Цитата Сообщение от OtyxPM
Вот как это выглядит в симуляторе:
Гораздо интереснее было бы взглянуть на отчёт RTL Viewera.

Не стоит использовать латчи в FPGA.

И да, стоит отметить, что я вообще не понимаю, как эти схемы могут работать!
0
 Аватар для Shurup
0 / 0 / 0
Регистрация: 04.05.2009
Сообщений: 28
06.10.2013, 01:18
Цитата Сообщение от bfkroup
Это, вообще, такой лол ))) Уровень заряда батарейки в Вашем мультиметре, Вы тоже измеряете этим же мультиметром? :)
:) подав свои собственные тактовые клоки я точно знаю сколько должно протикать периодов. ради интереса ткнулся и увидел совсем не то, что ожидал. это позволило оценить разные версии моих bcd счетчиков. я же еще в самом начале пути, и увидеть что схема работает плохо тоже полезно для понимания.
Цитата Сообщение от bfkroup
Shurup, тактируйте уже наконец все триггеры Вашей схемы одним клоком. между блоками -- стробы на CLK_ENABLE.
Я не совсем понимаю, как это должно правильно выглядеть и был бы благодарен если бы мне показали где и что подправить в моих исходниках.
Цитата Сообщение от bfkroup
Есть ещё одна тонкая проблема, которую нельзя игнорировать: сигнал, частоту которого Вы собираетесь измерять нельзя напрямую заводить в регистр, запросто можно нарваться на метастабильность. сделайте синхронизатор описав между входным пином и регистром приёмником пару последовательных триггеров.
Тут, насколько я понимаю, мне придется использовать PLL. Пока не пробовал с ним возиться. Чуть позже.

:) думаю для первого "блина" не так уж и плохо, работает. не на продажу же, учусь...
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
06.10.2013, 01:45
Цитата Сообщение от shurup
Цитата Сообщение от bfkroup
Есть ещё одна тонкая проблема, которую нельзя игнорировать: сигнал, частоту которого Вы собираетесь измерять нельзя напрямую заводить в регистр, запросто можно нарваться на метастабильность. сделайте синхронизатор описав между входным пином и регистром приёмником пару последовательных триггеров.
Тут, насколько я понимаю, мне придется использовать PLL. Пока не пробовал с ним возиться. Чуть позже.Здесь не про PLL. Посмотрите о метастабильности и стандартном способе борьбы с ней - синхронизаторе на двух триггерных ступенях. На Марсоходе: 1, 2, 3.
0
 Аватар для Shurup
0 / 0 / 0
Регистрация: 04.05.2009
Сообщений: 28
06.10.2013, 01:54
Цитата Сообщение от OtyxPM
Цитата Сообщение от shurup
Цитата Сообщение от bfkroup
Есть ещё одна тонкая проблема, которую нельзя игнорировать: сигнал, частоту которого Вы собираетесь измерять нельзя напрямую заводить в регистр, запросто можно нарваться на метастабильность. сделайте синхронизатор описав между входным пином и регистром приёмником пару последовательных триггеров.
Тут, насколько я понимаю, мне придется использовать PLL. Пока не пробовал с ним возиться. Чуть позже.
Здесь не про PLL. Посмотрите о метастабильности и стандартном способе борьбы с ней - синхронизаторе на двух триггерных ступенях. На Марсоходе: 1, 2, 3.
да я их видел. но в этом случае мне придется поднимать частоту опроса входного сигнала. при 50 МГц тактовом генераторе в данном случае не получится производить замеры до 99999999 Гц (8 разрядов).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.10.2013, 01:54

Первые шаги с AVR
Привествую! Решил, что пора слезать с Arduino и недоязыка, писать на чистом C под настоящие AVR и приобрел пару ATtiny13A на попробовать,...

C++ первые шаги (абсолютно первые)
Привет, пользователи CyberForum. Я относительно давний юзер этого форума, и вот, наконец-то решил воплощать мечту в реальность, а именно...

первые шаги
Всем добрый день-врядли, вечер-скорее всего, или ночь, я начал изучать асп.нет и хотел бы там заюзать sqlite базу -наткнулся на интересную...

Первые шаги
Привет всем! Я хочу попробовать себя в контекстной рекламе. Тематику выбрали - кулинария. Я по бегуну посмотрел и ахнул, цена бида 2-3...

первые шаги в c#
начал изучать c#.и вот столкнулся с первой проблемой. почем-то программа возводит в степень не то число что я ввел. using System; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Салют, шампанское, овации! :drink:
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru