Форум программистов, компьютерный форум, киберфорум
Программируемая логика: ПЛИС, ПАИС
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
3 / 3 / 1
Регистрация: 25.03.2011
Сообщений: 178
1

Verilog. Битстаффинг и дестаффинг

28.10.2015, 11:50. Просмотров 913. Ответов 2
Метки нет (Все метки)

Попытался я сымитировать битстаффинг (предупреждение появления последовательностей из 5 нулей или единиц) и возврат к исходным сигналам.
Появились вопросы:
  1. Как сделать так, чтобы изменённая последовательность битов (stuffed_seq) стала длиннее исходной (inp_seq) за счёт вставленных инвертированных битов? Чтобы на каждый сигнал приходился 1 такт clk, а не 0.5, как у меня сейчас -- последовательности равны по времени. (см. скриншот)
  2. Почему stuffed_seq имеет обратные графику значения? (см. скриншот)
    Time | stuffed_seq
    20 1
    40 0
    60 1
    80 0
    100 0
    120 0
    140 1
    160 1
    180 1
    200 0
    220 1
    240 1
    260 0
    280 0
    300 0
    320 0
    340 0
    360 0
    380 0
    400 1
    420 1
    440 1
    460 1
    480 1
    500 0
    520 0
    540 0
    560 0
    580 0
    600 1
    620 1
    640 1
    660 0
    680 0
    700 0
    720 1
    740 0
    760 1
    780 1
    800 1
    820 1
    840 0
    860 1
    880 1
  3. Откуда взялась задержка для destuffed_seq? (см. скриншот)
Спасибо за внимание.
Verilog. Битстаффинг и дестаффинг

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
`timescale 1ns/10ps
module bit_stuffing(input logic inp_seq, bs, clk, reset,
                    output logic stuffed_seq, bs_flag);
  logic [2:0] num_of_ones = 0, num_of_zeroes = 0;
  always @(posedge clk, posedge reset)
    if (reset)
      begin
        stuffed_seq <= inp_seq;
        bs_flag = 0;
      end
    else if (bs)
      if (inp_seq)
        begin
          num_of_ones = num_of_ones + 1;
          if (num_of_ones == 3'd5)
            begin
              stuffed_seq <= ~inp_seq;
              num_of_zeroes <= 1;
              num_of_ones <= 0;
              bs_flag = 1;
          #10 stuffed_seq <= inp_seq;
              num_of_ones <= 1;
              num_of_zeroes <= 0;
              bs_flag = 0;
            end
          else
            begin
              num_of_zeroes = 0;
              stuffed_seq <= inp_seq;
            end
        end
      else
        begin
          num_of_zeroes = num_of_zeroes + 1;
          if (num_of_zeroes == 3'd5)
            begin
              stuffed_seq <= ~inp_seq;
              num_of_ones <= 1;
              num_of_zeroes <= 0;
              bs_flag = 1;
          #10 stuffed_seq <= inp_seq;
              num_of_zeroes <= 1;
              num_of_ones <= 0;
              bs_flag = 0;
            end
          else
            begin
              num_of_ones = 0;
              stuffed_seq <= inp_seq;
            end
        end
    else
      begin
        num_of_ones = 0;
        num_of_zeroes = 0;
        stuffed_seq <= inp_seq;
        bs_flag = 0;
      end
endmodule
 
module destuffing(input logic stuffed_seq, bs_flag, clk, reset,
                         output logic destuffed_seq);
 
  always @(posedge clk, posedge reset)
    begin
      destuffed_seq <= stuffed_seq;
      $display($time, " ", stuffed_seq);
    end
 
  always @(bs_flag)
    destuffed_seq <= ~stuffed_seq;
endmodule
 
module testbench();
  logic inp_seq, bs, clk, reset;
 
  bit_stuffing stuff(inp_seq, bs, clk, reset, stuffed_seq, bs_flag);
  destuffing destuff(stuffed_seq, bs_flag, clk, reset, destuffed_seq);
 
  always
    begin
      clk = ~clk; #10;
    end
 
  initial
    begin 
      $dumpfile("dump.vcd");
      $dumpvars;
      
      clk = 1;
      reset = 1;
      inp_seq = 1;
      bs = 0;
      
      #20 reset = 0;
          bs = 1;
          inp_seq = 0;
      #20 inp_seq = 1;
      #20 inp_seq = 0;
      #20 inp_seq = 0;
      #20 inp_seq = 0;
      #20 inp_seq = 1;
      #20 inp_seq = 1;
      #20 inp_seq = 1;
      #20 inp_seq = 0;
      #20 inp_seq = 1;
      #20 inp_seq = 1;
      #20 inp_seq = 0;
      #20 inp_seq = 0;
      #20 inp_seq = 0;
      #20 inp_seq = 0;
      #20 inp_seq = 0;
      #20 inp_seq = 0;
      #20 inp_seq = 0;
      #20 inp_seq = 1;
      #20 inp_seq = 1;
      #20 inp_seq = 1;
      #20 inp_seq = 1;
      #20 inp_seq = 1;
      #20 inp_seq = 0;
      #20 inp_seq = 0;
      #20 inp_seq = 0;
      #20 inp_seq = 0;
      #20 inp_seq = 0;
      #20 inp_seq = 1;
      #20 inp_seq = 1;
      #20 inp_seq = 1;
      #20 inp_seq = 0;
      #20 inp_seq = 0;
      #20 inp_seq = 0;
      #20 inp_seq = 1;
      #20 inp_seq = 0;
      #20 inp_seq = 1;
      #20 inp_seq = 1;
      #20 inp_seq = 1;
      #20 inp_seq = 1;
      #20 inp_seq = 0;
      #20 inp_seq = 1;
      #20 bs = 0;
      #20 $finish;
    end
endmodule
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.10.2015, 11:50
Ответы с готовыми решениями:

Битстаффинг
Всем привет. Есть такой термин - Битстаффинг. Это бит-ориетированная процедура по вставке &quot;0&quot; после...

C\C++ Битстаффинг (Bitstuffing)
Добрый день, уважаемые господа и дамы. Стоит задача реализовать битстаффинг, забитстаффить инфу на...

VHDL-Verilog
Есть задание,реализовать защелку с входом разрешения. Есть вот такая таблица истинности: ...

Блок always. Verilog
module lalala ( input logic clk, input logic risit, output logic out ); always @(posedge clk...

2
10207 / 6588 / 494
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
28.10.2015, 12:13 2
Разве не:
Stuffing заменяет семь подряд идущих единиц 1111111 на восьмибитовую последовательность 11111110.
DeStuffing - восемь бит 11111110 на семь бит 1111111, т.е. удаляется вставленный нулевой бит.
?
0
3 / 3 / 1
Регистрация: 25.03.2011
Сообщений: 178
28.10.2015, 12:27  [ТС] 3
В моём случае нужно не более 5 одинаковых разрядов.
https://en.wikipedia.org/wiki/CAN_bus#Bit_stuffing
Дополняющие биты (bit stuffing): после передачи пяти одинаковых битов подряд автоматически передаётся бит противоположного значения.
Добавлено через 6 минут
В этом примере я вообще вставляю после 4-го разряда, чтобы избежать ситуации, когда за вставленным окажутся биты той же полярности.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.10.2015, 12:27

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Verilog и светодиод
Всем привет. Начал изучат Verilog и сразу такой вопрос. Делаю тестовое задание мигания светодиодом...

Функции в Verilog
Приветствую. С удивлением обнаружил, что в Verilog функция должна быть описана в теле модуля. Но...

Семисегментный индикатор verilog
Добрый вечер! Вопрос по коду: module Indicator_Sum_Count( output reg segments, input clk...

Многоногий сумматор на Verilog
Добрый день. Вопрос по синтаксису Verilog. Допустим, есть массив из 4 чисел, надо вычислить их...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.