реклама на сайте
подробности

 
 
> Вопрос по работе CASE в Verilog, CASE в Verilog
jurist
сообщение Aug 11 2018, 19:53
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 11-08-18
Из: Санкт-Петербург
Пользователь №: 106 717



Всем привет!
Осваиваюсь с Verilog и с ПЛИС. Возник вопрос по работе оператора CASE.
Значение регистра dig в приведённом коде должно(в моём понимании) становиться становиться 4'b0010, либо 4'b1000, либо 4'b0001 и должно меняться в трёх случаях:
когда значение disp_dat становится 0, 1 или 4.
На деле же оно меняется и тогда, когда disp_dat становится 2 и 5. В этих случаях оно становится 4'b0010 и 4'b1001.
Но у меня даже числа такие нигде в коде не фигурируют. Вопрос: почему dig меняется и в случаях, когда disp_dat становится 2 и 5?

Прилагаю код и скриншот отладки в SignalTap Quartus 2.11
CODE

module sled(seg,dig,clock,disp_dat);
input clock;
output [7:0] seg;
output [3:0] dig;
reg [7:0] seg;
reg [3:0] dig;
output reg [3:0] disp_dat;
reg [36:0] count;


always @ (posedge clock )
begin
count = count + 1'b1;
end

always @ (count[24])
begin
disp_dat = {count[28:25]};
end
always @ (disp_dat)
begin
case (disp_dat)
4'h0 : begin
seg <= 8'hc0; //"0"
dig <= 4'b0010;
end
4'h1 : begin
seg <= 8'hf9; //"1"
dig <= 4'b1000;
end
4'h2 : begin
seg <= 8'ha4; //"2"
end
4'h3 : begin
seg <= 8'hb0; //"3"
end
4'h4 : begin
seg <= 8'h99; //"4"
dig<=4'b0001;
end
4'h5 : seg <= 8'h92; //"5"
4'h6 : seg <= 8'h82; //"6"
4'h7 : seg <= 8'hf8; //"7"
4'h8 : seg <= 8'h80; //"8"
4'h9 : seg <= 8'h90; //"9"
4'ha : seg <= 8'h88; //"a"
4'hb : seg <= 8'h83; //"b"
4'hc : seg <= 8'hc6; //"c"
4'hd : seg <= 8'ha1; //"d"
4'he : seg <= 8'h86; //"e"
4'hf : seg <= 8'h8e; //"f"
endcase

end
endmodule




Сообщение отредактировал jurist - Aug 11 2018, 19:55
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
jurist
сообщение Aug 12 2018, 19:31
Сообщение #2





Группа: Новичок
Сообщений: 4
Регистрация: 11-08-18
Из: Санкт-Петербург
Пользователь №: 106 717



Цитата(_4afc_ @ Aug 12 2018, 09:41) *
Мне в этом коде не нравится:
1 в always стоят не клоки
2 входные данные внутри always не зафиксированы на предыдущем такте / полутакте.

Цитата(andrew_b @ Aug 12 2018, 09:52) *
...... Во-первых, вы заводите на тактовый вход триггера нетактовый сигнал. ...

_4afc_, Идею с программой, к сожалению, не совсем понял, но Вы сказали ключевую фразу. andrew_b тоже указал на это. Спасибо!
Поставил один always с "posedge clock" всё заработало как должно. biggrin.gif
Даже приведу новый код:
CODE
module sled(seg,dig,clock,disp_dat);
input clock;
output [7:0] seg;
output [3:0] dig;
reg [7:0] seg;
reg [3:0] dig;
output reg [3:0] disp_dat;
reg [36:0] count;

always @ (posedge clock )
begin
count = count + 1'b1;
disp_dat = {count[28:25]};

case (disp_dat)
4'h0 : begin
seg <= 8'hc0; //"0"
dig <= 4'b0010;
end
4'h1 : begin
seg <= 8'hf9; //"1"
dig <= 4'b1000;//
end
4'h2 : begin
seg <= 8'ha4; //"2"
end
4'h3 : begin
seg <= 8'hb0; //"3"
end
4'h4 : begin
seg <= 8'h99; //"4"
dig<=4'b0001; //
end
4'h5 : seg <= 8'h92; //"5"
4'h6 : seg <= 8'h82; //"6"
4'h7 : seg <= 8'hf8; //"7"
4'h8 : seg <= 8'h80; //"8"
4'h9 : seg <= 8'h90; //"9"
4'ha : seg <= 8'h88; //"a"
4'hb : seg <= 8'h83; //"b"
4'hc : seg <= 8'hc6; //"c"
4'hd : seg <= 8'ha1; //"d"
4'he : seg <= 8'h86; //"e"
4'hf : seg <= 8'h8e; //"f"
endcase
end
endmodule
Программа была из набора примеров для отладочной платы, а я решил с ней поковыряться. Думал, что примеры пишут более подготовленные люди.

Цитата(iosifk @ Aug 12 2018, 09:51) *
Т.е. ТС надо почитать о "синхронном проектировании". И о метастабильности... И прочитать, когда в case образуются latch...
Делалась ли RTL симуляция? Или сразу непроверенный код - в железо?
В RTL Viever смотрел, но мне на данном этапе сложно читать программу в виде логических элементов.

Правило с правильным тактированием я усвоил. Но я ещё не осознал, почему я указываю изменение всех данных строго после изменения disp_dat, а они меняются сами, как попало. Статьи на рекомендованные темы обязательно прочитаю и постараюсь разобраться.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 23:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.02731 секунд с 7
ELECTRONIX ©2004-2016