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

 
 
> Вопрос по работе 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, 08:53
Сообщение #2





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



eugen_pcad_ru
Значение disp_dat состоит из 4 бит и чисто физически может принимать значения от 0h до Fh. Все 16 состояний у меня описаны и последовательно отрабатываются. Это видно по приложенной к первому сообщению картинке - все значения строго от 0h до Fh.
Я слышал, что в Verylog бывают неопределённые состояния... Даже если предположить, что в disp_dat могло попасть другое значение, оно было бы проигнорировано, т.к. не подходит ни под одно из условий CASE.

Для верности, дописал обработку для значения default, запустил на отладочной плате, но ничего не поменялось.


andrew_b
Каждый раз, когда меняется значение count[24], в disp_dat заносятся 4 бита count[28] - count[25].
Можно заменить count[24] на count[25] или на posedge clock, на конечный результат в данном случае это никак не повлияет.

И ещё, Verilog пишет следующее предупреждение, касательно dig: Warning (13012): Latch dig[0]$latch has unsafe behavior
Нашёл статью по теме: https://marsohod.org/verilog/155-verilogmux
Но всё равно пока не могу понять, как значения могут меняться на самопроизвольные, если я конкретно описал нужные мне случаи и значения?
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 6th September 2025 - 19:41
Рейтинг@Mail.ru


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