Jump to content

    

agathodaimon

Участник
  • Content Count

    7
  • Joined

  • Last visited

Community Reputation

0 Обычный

Recent Profile Visitors

81 profile views
  1. почему отсутствуют-то? Данные для отображения содержаться в регистре CNT, который путем сдвига на 4 бита, преобразуется в число для каждого сегмента. Изначальное значение этого регистра задается при его объявлении, а инекремент происходит при просчете счетчика CTCQ. Вы предлагаете понизить частоту смены переключения индикаторов? Звучит логично.... надо попробовать. А на сколько детально вы рисуете схемы? Наверное, если бы я рисовал схему сейчас, то в моей схеме бы присутствовал один блок, с входим тактовой частоты и выходом на семисегментный индикатор) Да, когда начинал изучать эту тему, сложно было свыкнуться, что в ПЛИС все процессы происходят одновременно
  2. В общем, подправил немного код. Теперь он выглядит так: module helloworlds ( input [3:0]btn, output [3:0]led , output reg [3:0] digits, output reg [7:0] dots, output speaker, output reg strobe, input clk); assign led[0] = btn[0]; reg [23:0]CTCQ; reg [16:0]CTFQ; reg [16:0]freq; reg [1:0]dig = 2'd0; reg [3:0]curr_digit; reg [15:0]CNT = 16'ha5a5; //reg strobe = 1; reg [7:0]strobe_ct = 0; always @(posedge clk) begin CTCQ <= CTCQ + 1'd1; strobe_ct <= strobe_ct + 1'd1; if(strobe_ct > 8'hf0) begin strobe <= 0; end else begin strobe <= 1; end // // ___ // b | g | f // |___| // | a | // c |___| e // d if (strobe) begin case(curr_digit)// ABCDEFG 4'h0: dots = ~7'b0111111; 4'h1: dots = ~7'b0000110; 4'h2: dots = ~7'b1011011; 4'h3: dots = ~7'b1001111; 4'h4: dots = ~7'b1100110; 4'h5: dots = ~7'b1101101; 4'h6: dots = ~7'b1111101; 4'h7: dots = ~7'b0000111; 4'h8: dots = ~7'b1111111; 4'h9: dots = ~7'b1101111; 4'ha: dots = ~7'b1110111; 4'hb: dots = ~7'b1111100; 4'hc: dots = ~7'b0111001; 4'hd: dots = ~7'b1011110; 4'he: dots = ~7'b1111001; 4'hf: dots = ~7'b1110001; endcase end else begin dots = ~7'b0000000; end end always @(posedge strobe) begin dig <= dig + 1'd1; curr_digit <= CNT >> (dig * 4); case(dig) 2'd0: digits = ~4'd1; 2'd1: digits = ~4'd2; 2'd2: digits = ~4'd4; 2'd3: digits = ~4'd8; endcase end always @(posedge CTCQ[23]) CNT <= CNT + 1'd1; endmodule По временной диаграмме должно быть все хорошо и наложения должны пропасть: Однако реально нажелезяке продолжаю видеть старое поведение. Сегодня попробую пример тов. Flip-fl0p. Может что-то проясниться у меня.
  3. Кажется, я понял в чем у меня проблема. На симуляторе сейчас все красиво, приду домой - проверю, если все ок, выложу свой код :)
  4. На железке clk напрямую от кварца - 50МГц Да, спасибо! я и сам планировал разбить, только хотел вначале привести к рабочему варианту) По поводу сдвигового регистра, там получается выбор, либо сдвигать, и делать case на вот эту строчку curr_digit <= CNT >> (dig * 4); либо оставлять как было.
  5. Правда, симуляция говорит ровно то, что я вижу своими глазами. Переключение digits происходит до смены значения на dots. осталось теперь понять, почему это происходит)
  6. Добрый день, форумчане. Есть такая странная ситуация. Написал код для динамической индикации 7-сегментного индикатора. Все работает, однако наблюдаю странное поеведение. Разряд, который выступает следующим, светится тускло знаком предыдущего. Может кто увидит сразу и дкнет в проблему? пытался гуглить примеры, но они вроде от моего кода не слишком отличаются. Плис Altera Cyclone 4, EDI Quartus. module helloworlds ( input [3:0]btn, output [3:0]led , output reg [3:0] digits, output reg [7:0] dots, output speaker, input clk); assign led[0] = btn[0]; reg [23:0]CTCQ; reg [16:0]CTFQ; reg [16:0]freq; reg [1:0]dig = 2'd0; reg [3:0]curr_digit; reg [15:0]CNT; reg strobe = 1; reg [7:0]strobe_ct = 0; always @(posedge clk) begin CTCQ <= CTCQ + 1'd1; if (curr_digit == 4'd0 || curr_digit == 4'd8) CTFQ <= CTFQ + 1'd1; else CTFQ <= 14'd0; strobe_ct <= strobe_ct + 1'd1; if(strobe_ct == 8'hff) begin dig <= dig + 1'd1; end if(strobe_ct > 8'hf0) begin strobe = 0; end else begin strobe = 1; end curr_digit <= CNT >> (dig * 4); case(dig) 2'd0: digits = ~4'd1; 2'd1: digits = ~4'd2; 2'd2: digits = ~4'd4; 2'd3: digits = ~4'd8; endcase // // ___ // b | g | f // |___| // | a | // c |___| e // d if (strobe) begin case(curr_digit)// ABCDEFG 4'h0: dots = ~7'b0111111; 4'h1: dots = ~7'b0000110; 4'h2: dots = ~7'b1011011; 4'h3: dots = ~7'b1001111; 4'h4: dots = ~7'b1100110; 4'h5: dots = ~7'b1101101; 4'h6: dots = ~7'b1111101; 4'h7: dots = ~7'b0000111; 4'h8: dots = ~7'b1111111; 4'h9: dots = ~7'b1101111; 4'ha: dots = ~7'b1110111; 4'hb: dots = ~7'b1111100; 4'hc: dots = ~7'b0111001; 4'hd: dots = ~7'b1011110; 4'he: dots = ~7'b1111001; 4'hf: dots = ~7'b1110001; endcase end else begin dots = ~7'b0000000; end end // Speaker wire //assign speaker = CTFQ[16]; //always @(posedge CTCQ[23]) CTQ <= CTQ + 1'd1; always @(posedge CTCQ[23]) CNT <= CNT + 1'd1; //always digits = 4'd0; endmodule Моделирование пока не освоил... пока что не разобрался как это сделать. Выглядит это примерно как на фото, правда плохо видно. Четверка самого верхнего сегмента отдает восьмеркой, которая является предыдущем. Буду признателен любой наводке)