Verilog - азбука Морзе (распознавать точки и тире) - PullRequest
0 голосов
/ 20 апреля 2020

Я немного новичок в Верилоге. Я хотел бы реализовать машину, которая принимает 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...