Форум программистов, компьютерный форум, киберфорум
Программируемая логика: ПЛИС, ПАИС
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.81/42: Рейтинг темы: голосов - 42, средняя оценка - 4.81
5 / 5 / 0
Регистрация: 27.12.2009
Сообщений: 69

Xilinx ISE 14.1. Реализация конечного автомата генератора последовательностей

25.11.2012, 16:31. Показов 9113. Ответов 38

Всем привет.

Стоит задача построения конечного автомата (КА) - генератора последовательности.
Вариант исполнения, по сути, представляет собой реверсивный счетчик:


Также мы имеем таблицу, нашу последовательность состояний:


В Xilinx нужно все это реализовать на HDL Verilog схемотехнически и в симуляторе получить временные диаграммы.

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

Вот что рисовал преподаватель:


Насколько я понял это все в общих чертах, и каждый элемент будь то регистр или мультиплексор, их нужно раскрывать. Регистры мы строем на готовых элементах Xilinx: FDC/FDD, а мультиплексор на логических элементах. CL1 ЛР1 - это комбинационная схема из моей первой лабораторной работы, это ДНФ в базисе И-НЕ, если будет нужна, скину проект.

Попробовал немного раскрыть, получилось:


А дальше не понимаю ничего.

Сначала мы создаем HDL проект. В нем создаем New Source - Verilog Module. Для моих старых работ я описывал данный модуль так:
Code
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
`timescale 1ns / 1ps
 
module lab_1_dnf(
    input      X0,
    input      X1,
    input      X2,
    input      X3,
    output     Y0,
    output     Y1,
    output     Y2,
    output     Y3
    );
 
// Sch.* Module Connection:
 lr_1_dnf                DNF_EXAMPLE(
 .X0(X0),
 .X1(X1),
 .X2(X2),
 .X3(X3),
 .Y_0(Y0),
 .Y_1(Y1),
 .Y_2(Y2),
 .Y_3(Y3)
 );
//------------------------------------------
 
endmodule
Но для данной работы я не могу понять какие мы задаем входы и выходы, например CLK и RST мы прописываем в файле для симулятора Verilog Test Fixture. Поэтому не знаю что задать в данном модуле...

Далее строим саму схему через New Source - Schematic. Тут тоже не совсем понятно как она будет выглядеть, какие wire для входов рисовать, а какие нет, да и вообще на каких элементах ее строить, ибо как OE изобразить я тоже не понимаю...

Далее перебираемся к симулятору, New Source - Verilog Test Fixture, для старых работ описывал так:
Code
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
143
144
145
146
147
148
149
150
151
152
`timescale 1ns / 1ps
 
module lr_1_dnf_tb;
 
    // Inputs
    reg CLK;
    reg RST;
    reg X0;
    reg X1;
    reg X2;
    reg X3;
 
    // Outputs
    wire Y0;
    wire Y1;
    wire Y2;
    wire Y3;
 
    // Instantiate the Unit Under Test (UUT)
    lab_1_dnf uut (
        .X0(X0), 
        .X1(X1), 
        .X2(X2), 
        .X3(X3), 
        .Y0(Y0), 
        .Y1(Y1), 
        .Y2(Y2), 
        .Y3(Y3)
    );
 
 
//------------------------------------------
   // Clock Generator
   parameter PERIOD = 5;
   parameter DUTY_CYCLE = 0.4;
 
   initial
    forever
     begin
      CLK = 1'b0;
      #(PERIOD-(PERIOD*DUTY_CYCLE)) CLK = 1'b1;
      #(PERIOD*DUTY_CYCLE);
     end
//------------------------------------------
    // Init. Reset startup pulse
   initial
    begin
     RST = 1;
      #10 RST = 0;
     //#219 RST = 1;
     //#3 RST = 0;
 
    end
//------------------------------------------
    initial begin
        // Initialize Inputs
        X0 = 1; // F
        X1 = 1;
        X2 = 1;
        X3 = 1;
 
        // Wait 20 ns for global reset to finish
        #20;
        
        // Add stimulus here
 
      @(posedge CLK); // Clock Rising Edge Couple
 
      #1; // Delay 1 ns After Rising Clock Edge
           X0          = 0; // E
           X1          = 1;
           X2          = 1;
           X3          = 1;
 
      #5   X0          = 1; // D
           X1          = 0;
           X2          = 1;
           X3          = 1;
 
      #5   X0          = 0; // C
           X1          = 0;
           X2          = 1;
           X3          = 1;
 
      #5   X0          = 1; // B
           X1          = 1;
           X2          = 0;
           X3          = 1;
 
      #5   X0          = 0; // A
           X1          = 1;
           X2          = 0;
           X3          = 1;
 
      #5   X0          = 1; // 9
           X1          = 0;
           X2          = 0;
           X3          = 1;
 
      #5   X0          = 0; // 8
           X1          = 0;
           X2          = 0;
           X3          = 1;
 
      #5   X0          = 1; // 7
           X1          = 1;
           X2          = 1;
           X3          = 0;
 
      #5   X0          = 0; // 6
           X1          = 1;
           X2          = 1;
           X3          = 0;
 
      #5   X0          = 1; // 5
           X1          = 0;
           X2          = 1;
           X3          = 0;
 
      #5   X0          = 0; // 4
           X1          = 0;
           X2          = 1;
           X3          = 0;
 
      #5   X0          = 1; // 3
           X1          = 1;
           X2          = 0;
           X3          = 0;
 
      #5   X0          = 0; // 2
           X1          = 1;
           X2          = 0;
           X3          = 0;
 
      #5   X0          = 1; // 1
           X1          = 0;
           X2          = 0;
           X3          = 0;
 
      #5   X0          = 0; // 0
           X1          = 0;
           X2          = 0;
           X3          = 0;
 
      #5   X0          = 1; // F
           X1          = 1;
           X2          = 1;
           X3          = 1;
 
    end
      
endmodule
Насколько я понял отсюда можно взять готовые CLK и RST, Иксы нам будут нужны? А как описывать LOAD, UP и т.д., ума не приложу...

Собственно ищу сочувствующих, кто поможет натолкнуть на правильные мысли или подсказать как что делать, ибо моих знаний на данную работу вообще не хватает, к сожалению... (
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.11.2012, 16:31
Ответы с готовыми решениями:

Реализация конечного автомата
Помогите решить такую задачу: Реализовать детерминированный конечный автомат, автомат есть из 0 и 1. Могу написать его, но меня...

Реализация конечного автомата
Написать программу на Прологе реализующую конечный автомат, который распознает слова, имеющие следующий общий вид:https://ibb.co/q9ps9ws

Реализация работы конечного автомата
Задача: Построить конечный автомат, проверяющий есть ли во входной цепочке S хотя бы одна из следующих подстрок: X1=“aaa”; X2=“aab”;...

38
5 / 5 / 0
Регистрация: 27.12.2009
Сообщений: 69
04.12.2012, 14:57  [ТС]
- Вопрос по регистрам снимаю, убрал я FDP чтобы не усложнять себе жизнь, все строю на FDC.

- По поводу объединения четырех выходов в один вход. Вроде бы получилось нарисовать шину, вот только правильно ли я сделал что подал на вход тристабильного буфера шину, или же мне нужно взять четыре таких буфера под каждый выход предыдущих регистров и уже выходы буфера объединить в шину и назвать ее DATA_O(3:0)?

Схемы проекта: revers_sch.rar
Скрины: screenshots.rar

- По поводу ADSU4. Первый ADSU4 у меня реализует функцию DEC (CL-1), т.е. вычитание. Согласно таблице логики на входы А мы подаем наше текущее состояние Q, например 0000. Вход ADD мы должны поставить в состояние 0, чтобы происходил вычет, также CI, CO тоже должны быть равны 0 и тогда мы из А будем вычитать В. На этом мое понимание заканчивается о том что такое В и откуда мы его берем.
Второй ADSU4 реализует функцию INC (CL+1), т.е. сложение. Далее все аналогично, только на ADD, CI и CO мы теперь подаем 1 и в итоге получим А+В.
Или получается что мы на В постоянно 0001 подаем, что ее плюсовать или вычитать?
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
04.12.2012, 16:08
или же мне нужно взять четыре таких буфера под каждый выход предыдущих регистров и уже выходы буфера объединить в шину и назвать ее DATA_O(3:0)?
в библиотеке есть управляемые выходные буферы: OBUFE, OBUFE4, OBUFE8, OBUFE16. Если ведете шиной, то удобно использовать совмещенные, к примеру, для шины [3:0] - OBUFE4.

Или получается что мы на В постоянно 0001 подаем
именно.
1
5 / 5 / 0
Регистрация: 27.12.2009
Сообщений: 69
04.12.2012, 16:35  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
в библиотеке есть управляемые выходные буферы: OBUFE, OBUFE4, OBUFE8, OBUFE16. Если ведете шиной, то удобно использовать совмещенные, к примеру, для шины [3:0] - OBUFE4.
К сожалению такого элемента у меня нет:

Думаю ошибкой не будет, если я реализую это так (у регистра шину убрал):
Миниатюры
Xilinx ISE 14.1. Реализация конечного автомата генератора последовательностей   Xilinx ISE 14.1. Реализация конечного автомата генератора последовательностей  
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
04.12.2012, 16:41
...это как кому удобнее, ошибкой не будет.
0
5 / 5 / 0
Регистрация: 27.12.2009
Сообщений: 69
04.12.2012, 16:52  [ТС]
raxp, хорошо, спасибо. Но еще остались вопросы (((
- Про ADD, CI, CO я правильно написал выше? Но как быть с OFL ибо в таблице логики он никак не описан...

- Дальше мне нужно сделать привязку данной схемы в файле верилога где буду описывать входы и выходы, но меня интересует следующее: куда мы подаем наш вариант задания, т.е. последовательность состояний?
Когда я писал это задание на верилоге:
Code
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
`timescale 1ns / 1ps
 
module generator
   (
      input wire           clk,
      input wire           rst,
      input wire           load,
      input wire           up,
      input wire           oe,      
      input wire  [3:0]    data_i,
      output wire [3:0]    data_o,
      output wire [3:0]    seq
   );
   
   wire [3:0] cntr_q;
   
   // Используем univ_bin_counter как компонент‚
   univ_bin_counter #(.N (4)) counter
   (
            .clk       (clk),
            .reset     (1'b0),
            .load      (load),
            .syn_clr   (rst),
            .en        (1'b1),
            .up        (up),
            .d         (data_i),
            .q         (cntr_q)
   );
 
   // DATA_O - выходы с Z состоянием
   assign data_o = (oe) ?  cntr_q : 4'bz;
 
   assign seq = (cntr_q == 4'h0) ? 4'hF :
                (cntr_q == 4'h1) ? 4'h8 :
                (cntr_q == 4'h2) ? 4'h7 :
                (cntr_q == 4'h3) ? 4'h0 :
                (cntr_q == 4'h4) ? 4'h5 :
                (cntr_q == 4'h5) ? 4'h2 :
                (cntr_q == 4'h6) ? 4'hC :
                (cntr_q == 4'h7) ? 4'hB :
                (cntr_q == 4'h8) ? 4'h4 :
                (cntr_q == 4'h9) ? 4'h3 :
                (cntr_q == 4'hA) ? 4'hE :
                (cntr_q == 4'hB) ? 4'h9 :
                (cntr_q == 4'hC) ? 4'h6 :
                (cntr_q == 4'hD) ? 4'h1 :
                (cntr_q == 4'hE) ? 4'hD : 4'hA;
 
endmodule   // generator
 
 
module univ_bin_counter
    #(parameter N=8)
    (
        input wire clk, reset,
        input wire syn_clr, load, en, up,
        input wire [N-1:0] d,
        output wire max_tick, min_tick,
        output wire [N-1:0] q
    );
 
   // signal declaration
   reg [N-1:0] r_reg, r_next;
 
   // body
   // register
   always @(negedge clk, negedge reset)
      if (reset)
         r_reg <= 0;  //
      else
         r_reg <= r_next;
 
   // next-state logic
   always @*
      if (syn_clr)
         r_next = 0;
      else if (load)
         r_next = d;
      else if (en & up)
         r_next = r_reg + 1;
      else if (en & ~up)
          r_next = r_reg - 1;
      else
          r_next = r_reg;
 
   // output logic
   assign q = r_reg;
   assign max_tick = (r_reg==2**N-1) ? 1'b1 : 1'b0;
   assign min_tick = (r_reg==0) ? 1'b1 : 1'b0;
 
endmodule   // univ_bin_counter
Я собственно данную последовательность отобразил в SEQ, но тут мы должны описывать именно входные сигналы, или же все равно можно также повесить на выход SEQ мою последовательность состояний, в чем я очень сомневаюсь...
Или же есть идея на 5-м листе где ДНФ И-НЕ входы сделать маркерами и описать их:
Code
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
initial begin
        // Initialize Inputs
        X0 = 1; // F
        X1 = 1;
        X2 = 1;
        X3 = 1;
 
        // Wait 20 ns for global reset to finish
        #20;
        
        // Add stimulus here
 
      @(posedge CLK); // Clock Rising Edge Couple
 
      #1; // Delay 1 ns After Rising Clock Edge
           X0          = 0; // E
           X1          = 1;
           X2          = 1;
           X3          = 1;
 
      #5   X0          = 1; // D
           X1          = 0;
           X2          = 1;
           X3          = 1;
 
      #5   X0          = 0; // C
           X1          = 0;
           X2          = 1;
           X3          = 1;
 
      #5   X0          = 1; // B
           X1          = 1;
           X2          = 0;
           X3          = 1;
 
      #5   X0          = 0; // A
           X1          = 1;
           X2          = 0;
           X3          = 1;
 
      #5   X0          = 1; // 9
           X1          = 0;
           X2          = 0;
           X3          = 1;
 
      #5   X0          = 0; // 8
           X1          = 0;
           X2          = 0;
           X3          = 1;
 
      #5   X0          = 1; // 7
           X1          = 1;
           X2          = 1;
           X3          = 0;
 
      #5   X0          = 0; // 6
           X1          = 1;
           X2          = 1;
           X3          = 0;
 
      #5   X0          = 1; // 5
           X1          = 0;
           X2          = 1;
           X3          = 0;
 
      #5   X0          = 0; // 4
           X1          = 0;
           X2          = 1;
           X3          = 0;
 
      #5   X0          = 1; // 3
           X1          = 1;
           X2          = 0;
           X3          = 0;
 
      #5   X0          = 0; // 2
           X1          = 1;
           X2          = 0;
           X3          = 0;
 
      #5   X0          = 1; // 1
           X1          = 0;
           X2          = 0;
           X3          = 0;
 
      #5   X0          = 0; // 0
           X1          = 0;
           X2          = 0;
           X3          = 0;
 
      #5   X0          = 1; // F
           X1          = 1;
           X2          = 1;
           X3          = 1;
 
    end
В чем я собственно тоже не совсем уверен...
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
04.12.2012, 17:04
Но как быть с OFL ибо в таблице логики он никак не описан...
а что оное реализует?

интересует следующее: куда мы подаем наш вариант задания, т.е. последовательность состояний?
обычно собранный VHDL модуль или кишочки схемотехники сохраняю в библиотеку, далее в общую схему.

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

Или же есть идея на 5-м листе где ДНФ И-НЕ входы сделать маркерами
или речь про то, что все на одном листе не вмещается?
0
5 / 5 / 0
Регистрация: 27.12.2009
Сообщений: 69
04.12.2012, 17:11  [ТС]
raxp, OFL это переполнение, у ADSU4 стоит как выход, что с ним делать не знаю)

Да я про Test Bench. Как задавать CLK, RST, UP, LOAD и OE я знаю, но нам же еще нужно что-то задать чтобы он гонял нашу последовательность, в верилоге я ее объявлял через assign а тут она по нашей схеме сама воссоздастся? Ибо для ДНФ И-НЕ я руками прописывал иксы но теперь здесь вместо них идет связь Q_NXT с мультиплексора... Грубо говоря нормального входа описывающего последовательность у нас нет.
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
04.12.2012, 17:19
OFL это переполнение, у ADSU4 стоит как выход, что с ним делать не знаю)
а вы в симуляторе доведите процесс суммирования до конца и посмотрите, что будет, если его не задействовать.

Да я про Test Bench. Как задавать CLK, RST, UP, LOAD и OE я знаю, но нам же еще нужно что-то задать чтобы он гонял нашу последовательность
если не изменяет склероз, то задать формульно как вариант, если конечно последовательность можно ею описать.
0
5 / 5 / 0
Регистрация: 27.12.2009
Сообщений: 69
04.12.2012, 17:24  [ТС]
raxp, хех а в этом то и фишка!) наш преподаватель разделяет задания на два типа, первый это схемотехнически, а второй с помощью assign или always case. Вот как раз таки в нашем случае схемотехника... и в главном файле мы можем лишь сделать только привязку к схеме и все... а в файл тест бенча, что-то я еще ниразу не видел, чтобы в него вливали значения для выхода...)
Собственно попробую что-нибудь начудь, выложу что получилось) Еще раз спасибо.
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
04.12.2012, 17:32
еще ниразу не видел, чтобы в него вливали значения для выхода...
а вам не надо задавать для выхода, вам нужно задать входные последовательности и проверить, что будет на выходе автомата. Тем паче симулятор можно задействовать на любом участке схемы-комопнента.
0
5 / 5 / 0
Регистрация: 27.12.2009
Сообщений: 69
04.12.2012, 17:41  [ТС]
raxp, под входными воздействиями подразумеваете CLK, RST, UP, LOAD и OE как основные и ADD, CI, CO, OFL, верно?

Ну тогда начнем симуляцию. Если все оставить по нулям, то соответственно ничего и не увидим... Включим CLK и RST - у нас должна побежать SEQ. Включим OE - побежит DATA_O. Ну UP, LOAD, DATA_I - понятно что будет...
Берусь, посмотрим что будет, пока все равно тяжело представляю...
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
04.12.2012, 17:48
CO, OFL - они ж выходные.
0
5 / 5 / 0
Регистрация: 27.12.2009
Сообщений: 69
04.12.2012, 18:47  [ТС]
raxp, ага, только слова ваши смутили про OFL "посмотри что будет" не придется ли менять их значения, ведь CO для DEC и INC должен быть разным или в данном случае это не учитывается и напрямую зависит от CI...

Добавлено через 13 минут
Собственно симулятор не заработал...
Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ERROR:DesignEntry:239 - Incorrect bus tap at (640 160, 544 160); destination
   branch "DATA_O0" is not part of the source branch "DATA_O(3:0)".
ERROR:DesignEntry:239 - Incorrect bus tap at (640 352, 544 352); destination
   branch "DATA_O1" is not part of the source branch "DATA_O(3:0)".
ERROR:DesignEntry:239 - Incorrect bus tap at (640 544, 544 544); destination
   branch "DATA_O2" is not part of the source branch "DATA_O(3:0)".
ERROR:DesignEntry:239 - Incorrect bus tap at (640 752, 544 752); destination
   branch "DATA_O3" is not part of the source branch "DATA_O(3:0)".
ERROR:DesignEntry:239 - Incorrect bus tap at (1248 240, 1152 240); destination
   branch "SEQ0" is not part of the source branch "SEQ(3:0)".
ERROR:DesignEntry:239 - Incorrect bus tap at (1248 656, 1152 656); destination
   branch "SEQ1" is not part of the source branch "SEQ(3:0)".
ERROR:DesignEntry:239 - Incorrect bus tap at (1248 1056, 1152 1056); destination
   branch "SEQ2" is not part of the source branch "SEQ(3:0)".
ERROR:DesignEntry:239 - Incorrect bus tap at (1248 1488, 1152 1488); destination
   branch "SEQ3" is not part of the source branch "SEQ(3:0)".


Код главного файла:
Кликните здесь для просмотра всего текста
Code
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
`timescale 1ns / 1ps
 
module revers(
        input wire           ci_dec,
        input wire           add_dec,
        input wire           ci_inc,
        input wire           add_inc,
        output wire             co_dec,
        output wire             ofl_dec,
        output wire             co_inc,
        output wire             ofl_inc,
        
      input wire           clk,
      input wire           rst,
      input wire           load,
      input wire           up,
      input wire           oe,      
      input wire  [3:0]    data_i,
      output wire [3:0]    data_o,
      output wire [3:0]    seq
    );
 
// Sch.* Module Connection:
 revers_sch                SCH_EXAMPLE(
 .ci_dec(ci_dec),
 .add_dec(add_dec),
 .ci_inc(ci_inc),
 .add_inc(add_inc),
 .co_dec(co_dec),
 .ofl_dec(ofl_dec),
 .co_inc(co_inc),
 .ofl_inc(ofl_inc),
 
 .clk(clk),
 .rst(rst),
 .load(load),
 .up(up),
 .oe(oe),       
 .data_i(data_i),
 .data_o(data_o),
 .seq(seq)
 );
//------------------------------------------
 
endmodule


Код файла тест бенч:
Кликните здесь для просмотра всего текста
Code
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
`timescale 1ns / 1ps
 
module revers_tb;
 
    // Inputs
    reg ci_dec;
    reg add_dec;
    reg ci_inc;
    reg add_inc;
    reg clk;
    reg rst;
    reg load;
    reg up;
    reg oe;
    reg [3:0] data_i;
 
    // Outputs
    wire co_dec;
    wire ofl_dec;
    wire co_inc;
    wire ofl_inc;
    wire [3:0] data_o;
    wire [3:0] seq;
 
    // Instantiate the Unit Under Test (UUT)
    revers uut (
        .ci_dec(ci_dec), 
        .add_dec(add_dec), 
        .ci_inc(ci_inc), 
        .add_inc(add_inc), 
        .co_dec(co_dec), 
        .ofl_dec(ofl_dec), 
        .co_inc(co_inc), 
        .ofl_inc(ofl_inc), 
        .clk(clk), 
        .rst(rst), 
        .load(load), 
        .up(up), 
        .oe(oe), 
        .data_i(data_i), 
        .data_o(data_o), 
        .seq(seq)
    );
 
    initial begin
        // Initialize Inputs
        ci_dec = 0;
        add_dec = 0;
        ci_inc = 1;
        add_inc = 1;
        clk = 0;
        rst = 0;
        load = 0;
        up = 0;
        oe = 0;
        data_i = 0;
 
        // Wait 100 ns for global reset to finish
        #20;
        
    end
 
// Объявление CLK 
    always 
        #5  clk =  ! clk; 
 
    // Объявление RST 
   initial
        begin
            #20 rst = 1;
            #10 rst = 0;
        end 
    
 // Объявление OE
    initial 
        begin
            @ (negedge clk); // ждем переход CLK из лог. 1 в лог. 0
            @ (negedge rst); // ждем переход RST из лог. 1 в лог. 0
                #10 oe = 1;
                @ (negedge clk);
                #490 oe = 0;
        end
 
 // Объявление UP
    initial 
        begin
            @ (negedge clk); // ждем переход CLK из лог. 1 в лог. 0
            @ (negedge rst); // ждем переход RST из лог. 1 в лог. 0
                #190 up = 1;
                @ (negedge clk);
                #210 up = 0;
        end 
        
 // Объявление LOAD
    initial 
        begin
            data_i = 4'h5;
            @ (negedge clk); // ждем переход CLK из лог. 1 в лог. 0
            @ (negedge rst); // ждем переход RST из лог. 1 в лог. 0
                #450 load = 1;
                @ (negedge clk);
                #10 load = 0;
        end     
        
 
endmodule


Добавлено через 44 минуты
Ошибки с шиной устранил, теперь вылезли новые...
0
5 / 5 / 0
Регистрация: 27.12.2009
Сообщений: 69
04.12.2012, 19:14  [ТС]
Ошибки устранил, симулятор заработал, но непонятно как... SEQ от DATA_O строится верно, но сама DATA_O перепрыгивает, а не четко идет +1 или -1, на UP неправильно реагирует... вообщем работает непонятно как...
И можно ли в симуляторе скрыть ненужные мне линии, а оставить только те, которые меня реально интересуют?
_ _ _

Код главного файла:
Кликните здесь для просмотра всего текста
Code
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
`timescale 1ns / 1ps
 
module revers(
        input wire           b0,
        input wire           b1,
        input wire           b2,
        input wire           b3,
        input wire           ci_dec,
        input wire           add_dec,
        input wire           ci_inc,
        input wire           add_inc,
        output wire             co_dec,
        output wire             ofl_dec,
        output wire             co_inc,
        output wire             ofl_inc,
        
      input wire           clk,
      input wire           rst,
      input wire           load,
      input wire           up,
      input wire           oe,      
      input wire  [3:0]    data_i,
      output wire [3:0]    data_o,
      output wire [3:0]    seq
    );
 
// Sch.* Module Connection:
 revers_sch                SCH_EXAMPLE(
 .B0(b0),
 .B1(b1),
 .B2(b2),
 .B3(b3),
 .CI_DEC(ci_dec),
 .ADD_DEC(add_dec),
 .CI_INC(ci_inc),
 .ADD_INC(add_inc),
 .CO_DEC(co_dec),
 .OFL_DEC(ofl_dec),
 .CO_INC(co_inc),
 .OFL_INC(ofl_inc),
 
 .CLK(clk),
 .RST(rst),
 .LOAD(load),
 .UP(up),
 .OE(oe),       
 .DATA_I(data_i),
 .DATA_O(data_o),
 .SEQ(seq)
 );
//------------------------------------------
 
endmodule


Код файла тест бенч:
Кликните здесь для просмотра всего текста
Code
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
`timescale 1ns / 1ps
 
module revers_tb;
 
    // Inputs
    reg clk;
    reg rst;
    reg load;
    reg up;
    reg oe;
    reg [3:0] data_i;
    reg b0;
    reg b1;
    reg b2;
    reg b3;
    reg ci_dec;
    reg add_dec;
    reg ci_inc;
    reg add_inc;
    
 
    // Outputs
    wire co_dec;
    wire ofl_dec;
    wire co_inc;
    wire ofl_inc;
    wire [3:0] data_o;
    wire [3:0] seq;
 
    // Instantiate the Unit Under Test (UUT)
    revers uut (
       .b0(b0),
        .b1(b1),
        .b2(b2),
        .b3(b3),
        .ci_dec(ci_dec),
        .add_dec(add_dec),
        .ci_inc(ci_inc),
        .add_inc(add_inc),
        .co_dec(co_dec),
        .ofl_dec(ofl_dec),
        .co_inc(co_inc),
        .ofl_inc(ofl_inc),
 
        .clk(clk),
        .rst(rst),
        .load(load),
        .up(up),
        .oe(oe),        
        .data_i(data_i),
        .data_o(data_o),
        .seq(seq)
    );
 
    initial begin
        // Initialize Inputs
        b0 = 1;
        b1 = 0;
        b2 = 0;
        b3 = 0;
        ci_dec = 0;
        add_dec = 0;
        ci_inc = 1;
        add_inc = 1;
        clk = 0;
        rst = 0;
        load = 0;
        up = 0;
        oe = 0;
        data_i = 0;
 
        // Wait 20 ns for global reset to finish
        #20;
        
    end
 
// Объявление CLK 
    always 
        #5  clk =  ! clk; 
 
    // Объявление RST 
   initial
        begin
            #20 rst = 1;
            #10 rst = 0;
        end 
    
 // Объявление OE
    initial 
        begin
            @ (negedge clk); // ждем переход CLK из лог. 1 в лог. 0
            @ (negedge rst); // ждем переход RST из лог. 1 в лог. 0
                #10 oe = 1;
                @ (negedge clk);
                #490 oe = 0;
        end
 
 // Объявление UP
    initial 
        begin
            @ (negedge clk); // ждем переход CLK из лог. 1 в лог. 0
            @ (negedge rst); // ждем переход RST из лог. 1 в лог. 0
                #190 up = 1;
                @ (negedge clk);
                #210 up = 0;
        end 
        
 // Объявление LOAD
    initial 
        begin
            data_i = 4'h5;
            @ (negedge clk); // ждем переход CLK из лог. 1 в лог. 0
            @ (negedge rst); // ждем переход RST из лог. 1 в лог. 0
                #450 load = 1;
                @ (negedge clk);
                #10 load = 0;
        end     
        
 
endmodule


revers_sch.rar
screenshots.rar
0
5 / 5 / 0
Регистрация: 27.12.2009
Сообщений: 69
06.12.2012, 18:06  [ТС]
соединил CI с CO у ADSU4 DEC, счет пошел правильно - последовательно, но на UP циклится на 1111, а на LOAD вообще не реагирует...

Добавлено через 21 час 59 минут
Собственно выявил некую закономерность: у меня UP работает как LOAD, а LOAD как UP... Изменил схему мультиплексоров, поменял местами входы UP и LOAD, теперь вроде бы работать стало верно, но не совсем... Когда подаем UP счет действительно начинает идти в другую сторону, но не последовательно, а через 1, т.е. 0011, 0101, 0111 и т.д., DATA_I делаю равным 0110, подгружаю LOAD и в DATA_O должна была загрузить 0110 соотвественно, но загружается 1111, а также временная диаграмма сама обрезается на 285 нс, хотя должна идти до 1000 нс.
И еще симулятор выводит данное предупреждение: WARNING: File "D:/Xilinx/project/my/lab_3/revers.v" Line 31. For instance uut/SCH_EXAMPLE/, width 1 of formal port DATA_I is not equal to width 4 of actual signal data_i.

Помогите разобраться, совсем немножко то остается...

Добавлено через 25 минут
Предупреждение убрал, добавил DATA_O как шину в схему мультиплексоров, LOAD заработал как надо, а вот UP все равно продолжает прыгать через один, и диаграмма снова обрезается самовольно...

Добавлено через 46 минут
И с UP справился...
ci_inc = 0; - до этого была единица, теперь считает обратно последовательно.

Остался последний вопрос, почему он режет диаграмму?
0
5 / 5 / 0
Регистрация: 27.12.2009
Сообщений: 69
06.12.2012, 18:20  [ТС]
Ну и с этим справился... Убрал замыкание между CI_DEC и CO_DEC на ADSU4, и изменил ci_dec = 1; (до этого был ноль).

Остался последний вопрос, почему когда мы уже подали сигнал OE = 1 у нас все равно идут 0000, чего он ждет то?
Миниатюры
Xilinx ISE 14.1. Реализация конечного автомата генератора последовательностей  
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
12.12.2012, 01:25
OE - это всего лишь разрешение работы.
0
5 / 5 / 0
Регистрация: 27.12.2009
Сообщений: 69
12.12.2012, 01:29  [ТС]
raxp, это все понятно) работу сдал, так что все хорошо. Только буфер я не тот использовал, нужно было OBUFT в нем как раз zzzz состояние есть, проверял на диаграмме все четко, а задержка с нулями так и осталась для меня загадкой, ну да ладно.
Огромное спасибо за помощь и наведение на правильные мысли
0
5 / 5 / 0
Регистрация: 27.12.2009
Сообщений: 69
22.12.2012, 15:56  [ТС]
Для тех кому интересно, по поводу того почему идет задержка в нулях. Ответ нашелся, это особенность схемотехнического способа, оттуда она и берется и ничего с ней не сделаешь... если описывать счетчик на verilog то данной задержки не будет, соответственно)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.12.2012, 15:56

Реализация конечного автомата на Haskell
Релизация конечного автомата на Haskell

Реализация конечного автомата по регулярному выражению
Здравствуйте, мне надо реализовать конечный автомат по регулярному выражению в алгебре Клини('*'-1 или больше предшествующих звезде...

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

Реализация конечного автомата Мура в консольном приложении
Товарищи, нужна ваша помощь в программе, которая реализует действие со схемой. Никакой визуальной реализации. просто в консоли. Завтра...

XILINX ISE
Ребят подскажите кто разбирается в данной программе?


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru