Счетчик звонков в Verilog

Мне нужно изменить этот кольцевой счетчик, чтобы он переходил от самого старшего бита к наименее значимому, а затем сбрасывался обратно к самому значимому биту. Вывод должен выглядеть так:

100000 
010000 
001000 
000100  
000010 
000001 
100000 

Счетчик звонков

module ringcounter(clk, rst, count);  
    input clk, rst; 
    output [5:0] count; 
    wire clk, rst; 
    reg [5:0] count = 6'b1;  
    // Respond to the positive-going pulse edge     
    always @ ( posedge clk ) 
        begin   
        if ( ~rst )   
            begin     
            count <= count << 1;    
            count[0] <= count[5];   
        end 
    end  
    // Respond to the positive-going reset signal 
    always @ ( posedge rst ) 
    begin   
        count <= 6'b1; 
    end  
endmodule 

Тестовый стенд счетчика звонков

module ringcounter_tb();  
    reg clk = 0, rst = 0; 
    wire [5:0] count;  
    always #1 clk = !clk; // Create a clock pulse  

    initial begin   
    $monitor("At time %4t, count = %b", $time, count );  
        #20 rst = 1;   
        #1  rst = 0;
        #20 $finish; 
    end  

    ringcounter cntr01 ( .clk(clk), .rst(rst), .count(count) );  
endmodule 

Я все еще очень новичок в цифровой логике, поэтому, пожалуйста, потерпите меня. Я просто немного смущен тем, как я могу изменить этот счетчик колец. Будем очень признательны за любую помощь или объяснение того, как именно это будет работать.


person Scruffy Nerfherder    schedule 07.12.2015    source источник


Ответы (2)


Тут вопрос не очень ясен. Но пару вещей нужно изменить.

Во-первых, никогда не используйте одну и ту же переменную в двух разных always блоках. Просто добавьте rst в список конфиденциальности. что-то вроде следующего:

// sensitive to clock and reset both
always @ ( posedge clk, posedge rst )
        begin   
        if ( ~rst )   
            begin     
            count <= count << 1;    
            count[0] <= count[5];   
        end 
          else 
            count <= 8'b1;
    end  

Использование блоков чувствительных к краям always приводит к созданию триггера. Если это сделать в двух разных блоках, возникнут проблемы синтеза. Это можно визуализировать с помощью логики, которую вы хотите, с точки зрения вентилей и регистров.

Кроме того, во время генерации часов рекомендуется использовать побитовое отрицание (~).

Символ ! представляет собой логическое или логическое отрицание. В то время как символ ~ представляет собой побитовое отрицание.

// Replace this
always #1 clk = !clk;
// With this
always #1 clk = ~clk;

Применение rst после 20ns и завершение симуляции после 20ns не должно быть тем, что вам нужно. Вместо этого вы можете использовать #200 $finish;.

Вот некоторые моменты, которые я хотел прояснить. Я смоделировал код на EDAPlayground здесь, возможно, вы захотите увидеть формы волны, который, кажется, соответствует описанному в вопросе.

Дополнительные рекомендации по синтезу можно найти в этом PDF< /а>.

См. Всегда блокировать аппаратную реализацию и Разница в операторах отрицания для получения дополнительной информации.

person sharvil111    schedule 07.12.2015
comment
Спасибо за ваш ответ и отличные объяснения. Ресурсы, которые мне дали для занятий, были не очень хорошими. Так что это очень помогает. Что касается того, что мне нужно сделать, прямо сейчас он смещается от наименее значащего бита к наиболее значимому, и мне нужно это переключить. От старшего к младшему значащему биту. У меня такое ощущение, что это проще, чем кажется, но, как я уже упоминал в своем посте, я все еще новичок в цифровой логике. - person Scruffy Nerfherder; 07.12.2015
comment
Учебника на урок нам тоже не дали, а то я бы поискал. Тем не менее, спасибо, я ценю это. - person Scruffy Nerfherder; 07.12.2015
comment
Не упоминайте.. :) Этот код просто выполняет циклический сдвиг count[5] (MSB) в count[0] (LSB). И сдвигая остальные биты оператором <<. Вы также можете выполнить сдвиг в другую сторону, используя оператор >> и count[5]<=count[0]. Просто чтобы ты знал. - person sharvil111; 07.12.2015
comment
Работал как шарм! Я знал, что это было что-то проще, чем я представлял. Спасибо еще раз! :) - person Scruffy Nerfherder; 07.12.2015

https://gist.github.com/vividvilla/4605985

Это должно работать, оно содержит как тестовый стенд, так и вывод для программы :)

person droidmainiac    schedule 07.12.2015