Я немного новичок в Верилоге. Я хотел бы реализовать машину, которая принимает 4 точки и тире и выводит символ. Сначала я должен спроектировать ту часть, где машина распознает, что вход является точкой или da sh. Это мой код для распознавания точек и тире.
Проблема в том, что кажется, что машина предполагает, что она видит DA SH, когда кнопка не нажата, но горит один светодиод (из - если (~ btn) ... часть кода)
Когда я удерживаю кнопку, дисплей из семи сегментов становится пустым.
Цель состоит в том, чтобы семь сегментов НЕ светились, когда нет входа, освещали все сегменты, когда вход - точка, и подсвечивали средний сегмент, когда вход - DA SH. Мой семисегментный дисплейный декодер работает.
У меня есть несколько идей, почему машина работает не так, как задумано, но я не слишком уверен.
1) Кнопка не деблокирована, что может вызвать проблемы.
2) Эту часть кода следует рассматривать как конечный автомат.
3) Я должен case операторы вместо.
Буду очень признателен за любые ваши указатели, ребята.
Спасибо !!
module morse_button_timing(
input wire clk,
input wire btn,
input wire reset,
output reg [1:0] LED, // for debugging
output wire [6:0] ssdCathode,
output wire [3:0] ssdAnode);
reg [1:0] dit_dah; ///dit_dah = 1(dash) | dit_dah = 2 (dot) | dit_dah = 0 (no output)
reg [31:0] count; // counter to count how much time has past
assign ssdAnode = 4'b1110; // lights up the first seven segment from the right
heartbeat #(.TOPCOUNT(20_000_000))
heartbeat (.clk(clk),.reset(reset),.beat(beat)); // heartbeat generator, used for counter
Seven_seg_decoder decoder (.dit_dah(dit_dah), .ssd(ssdCathode)) ;
always @(posedge clk ) begin
if (reset) begin // when reset button is pressed
count <= 32'b0;
dit_dah <= 2'b00;
end
if (~btn) begin // when button is NOT pressed
LED <= 2'b01;
dit_dah <= 2'b00 ;
end
if (btn && beat) begin // when button is pressed
LED <= 2'b10;
count <= count + 32'b1; //start the counter
if (count < 32'd5)
dit_dah <= 2'd2; // dot
else
dit_dah <= 2'd1; // dash
end
if ((~btn) && count > 0) begin // when button is released
count <= 32'b0;
dit_dah <= 2'd0; // blank
end
end
endmodule