Форум программистов, компьютерный форум, киберфорум
Программируемая логика: ПЛИС, ПАИС
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 03.08.2017
Сообщений: 92

Создание структурного описания из поведенческого описания, модуль индикатора

20.02.2025, 04:24. Показов 336. Ответов 2

Author24 — интернет-сервис помощи студентам
У меня запустился проект, вывод на индикатор счетчика нажатия кнопки,главный модуль смешанного типа, структурное описание модуля антидребезга, остальное в самом модуле. В этом главном модуле есть переменная seg1[4][8], отвечающая за 4 цифры индикатора. В процессе с комментарием Millisecond 4 значения этой переменной seg1 выдаются в индикатор (я использую 1 цифру, остальные 3 значения 0xFF). Но как только пробую выделить процесс Millisecond в отдельный модуль и дать структурное описание модуля Millisecond то на индикаторе загораются 4 восьмерки и не соответствует первому варианту программы. Что я сделал не правильно, из-за чего вторая программа не соответствует первой?
Первая программа:
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
153
154
155
156
157
module button_debouncer
//! Параметры
#(
    parameter       CNT_WIDTH = 16
)
//! Порты
(
    input clk_i,
    input rst_i,
    input sw_i,  
 
    output reg sw_state_o,  
    output reg sw_down_o,  
    output reg sw_up_o   
);
 
//! Синхронизируем вход с текущим тактовым доменом.
reg  [1:0] sw_r;
always @ (posedge rst_i or posedge clk_i)
if (rst_i)
        sw_r    <= 2'b00;
else
        sw_r    <= {sw_r[0], ~sw_i};
 
 reg [CNT_WIDTH-1:0] sw_count;
 reg unsigned [15:0] clk_Millisecond = 0;
 
wire sw_change_f = (sw_state_o != sw_r[1]);
//wire sw_cnt_max = (sw_count == {CNT_WIDTH{1'b1}}) ;   
wire sw_cnt_max = &sw_count;    
 
always @(posedge rst_i or posedge clk_i)
if (rst_i)
begin
    sw_count <= 0;
    sw_state_o <= 0;
end 
else if(sw_change_f)    
    begin
        sw_count <= sw_count + 'd1;  
        if(sw_cnt_max) sw_state_o <= ~sw_state_o;  
    end
    else  sw_count <= 0;  
 
always @(posedge clk_i)
begin
    sw_down_o <= sw_change_f & sw_cnt_max & ~sw_state_o;
    sw_up_o <= sw_change_f & sw_cnt_max &  sw_state_o;
end
 
endmodule
 
//******************************************
module Homew16(
   output reg unsigned [3:0] enable = 15,
    output reg unsigned[7:0]seg = 255,
    output reg led = 1,
    // Генератор
    input                   clk_50MHz_i,
 
    
 
    // Кнопка
    input                   sw_i
 
);
 
wire sw_down;
button_debouncer  debouncer 
(   
    .clk_i(clk_50MHz_i),
    .rst_i(),
 
    .sw_i(sw_i),
 
    .sw_state_o(),
    .sw_down_o(sw_down),
    .sw_up_o()
);  
 
   reg unsigned [15:0] clk_Millisecond = 0;
   reg unsigned[7:0]seg1[3:0];
    integer BCounter = 0;
 
   initial begin
      seg1[0]=255;
       seg1[1]=255;
       seg1[2]=255;
       seg1[3]=255; 
    end
 
  always @ (negedge clk_50MHz_i)  //millisecond вывод что в seg1, на индикатор
 
    begin
     
     clk_Millisecond = clk_Millisecond + 1;
     if(clk_Millisecond == 0)
        begin
         
        
        if(enable == 15) 
         begin 
         enable <= 7; seg= seg1[0];
         end
         else
         if(enable == 7)
         begin 
         enable = 11; seg = seg1[1];
         end
         else
         if(enable == 11)
         begin
         enable <= 13;seg = seg1[2];
         end
         else
         if(enable == 13)
         begin
         enable <= 14; seg = seg1[3];
         end
         else
         begin
         //if(enable == 14)
         enable <= 15;seg = 255;
         end
         
         
         
         
        end;//clk_Millisecond
 
    end //of process millisecond
    
    always @ (posedge sw_down)
    
    begin
      
      
       
         BCounter = BCounter + 1;
         case(BCounter)
             0 : seg1[0] = 192;//"11000000";
             1 : seg1[0] = 249;//"11111001";
             2 : seg1[0] = 164;//"10100100";
             3 : seg1[0] = 8'hB0;//"10110000";
             4 : seg1[0] = 8'h99;//"10011001";
             5 : seg1[0] = 8'h92;//"10010010";
             6 : seg1[0] = 8'h82;//"10000010";
             7 : seg1[0] = 8'hF8;//"11111000";
             8 : seg1[0] = 128;//"10000000";
             9 : seg1[0] = 8'h90;//"10010000";
        
           default: seg1[0] = 192;//"11000000"
           endcase
        
        
    end
endmodule
Вторая программа, большая часть модуля millisecond выделяю в отдельный модуль
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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
module button_debouncer
//! Параметры
#(
    parameter       CNT_WIDTH = 16
)
//! Порты
(
    input clk_i,
    input rst_i,
    input sw_i,  
 
    output reg sw_state_o,  
    output reg sw_down_o,  
    output reg sw_up_o   
);
 
//! Синхронизируем вход с текущим тактовым доменом.
reg  [1:0] sw_r;
always @ (posedge rst_i or posedge clk_i)
if (rst_i)
        sw_r    <= 2'b00;
else
        sw_r    <= {sw_r[0], ~sw_i};
 
 reg [CNT_WIDTH-1:0] sw_count;
 reg unsigned [15:0] clk_Millisecond = 0;
 
wire sw_change_f = (sw_state_o != sw_r[1]);
//wire sw_cnt_max = (sw_count == {CNT_WIDTH{1'b1}}) ;   
wire sw_cnt_max = &sw_count;    
 
always @(posedge rst_i or posedge clk_i)
if (rst_i)
begin
    sw_count <= 0;
    sw_state_o <= 0;
end 
else if(sw_change_f)    
    begin
        sw_count <= sw_count + 'd1;  
        if(sw_cnt_max) sw_state_o <= ~sw_state_o;  
    end
    else  sw_count <= 0;  
 
always @(posedge clk_i)
begin
    sw_down_o <= sw_change_f & sw_cnt_max & ~sw_state_o;
    sw_up_o <= sw_change_f & sw_cnt_max &  sw_state_o;
end
 
endmodule
//******************************************
module indicator(
output reg unsigned [3:0] enable=15,
output reg unsigned [7:0] seg=255,
input [15:0] clk_Millisecond,
input [7:0] seg1,
input [7:0] seg2,
input [7:0] seg3,
input [7:0] seg4
);
 
   
always @ (clk_Millisecond[0])
//reg unsigned [3:0]enable
begin
if(clk_Millisecond == 0)
        begin
         
        if(enable == 15) 
         begin 
         enable <= 7; seg= seg1;
         end
         else
         if(enable == 7)
         begin 
         enable = 11; seg = seg2;
         end
         else
         if(enable == 11)
         begin
         enable <= 13;seg = seg3;
         end
         else
         if(enable == 13)
         begin
         enable <= 14; seg = seg4;
         end
         else
         begin
         //if(enable == 14)
         enable <= 15;seg = 255;
         end
         end;//clk_Millisecond
end
endmodule
 
//******************************************
module Homew16(
   output reg unsigned [3:0] enable = 15,
    output reg unsigned[7:0]seg = 255,
    output reg led = 1,
    // Генератор
    input                   clk_50MHz_i,
 
    
 
    // Кнопка
    input                   sw_i
 
);
 
wire sw_down;
button_debouncer  debouncer 
(   
    .clk_i(clk_50MHz_i),
    .rst_i(),
 
    .sw_i(sw_i),
 
    .sw_state_o(),
    .sw_down_o(sw_down),
    .sw_up_o()
);  
 
   reg unsigned [15:0] clk_Millisecond = 0;
   reg unsigned[7:0]seg1[3:0];
    integer BCounter = 0;
 
//на входы индикатора практически wire:clk_Millisecond, seg1 (расщепленный)
wire [15:0]w_Millisecond = clk_Millisecond;//[15:0];
wire [7:0]w_seg1 = seg1[0];//[7:0];
wire [7:0]w_seg2 = seg1[1];//[7:0];
wire [7:0]w_seg3 = seg1[2];//[7:0];
wire [7:0]w_seg4 = seg1[3];//[7:0];
//assign w_Millisecond[15:0] = clk_Millisecond[15:0];
wire [3:0]w_enable = enable; 
wire [7:0]w_seg  =  seg;
 
    
    indicator ict(
.enable(w_enable),
.seg(w_seg),
.clk_Millisecond(w_Millisecond),
.seg1(w_seg1),
.seg2(w_seg2),
.seg3(w_seg3),
.seg4(w_seg4)
);
 
 
   initial begin
      seg1[0]=192;//1100 0000
       seg1[1]=255;
       seg1[2]=255;
       seg1[3]=255; 
    end 
    
  always @ (negedge clk_50MHz_i)  //millisecond вывод что в seg1, на индикатор
 
  begin
     
     clk_Millisecond = clk_Millisecond + 1;
    
  end //of process millisecond
    
    always @ (posedge sw_down)
    
    begin
      
      
       
         BCounter = BCounter + 1;
         case(BCounter)
             0 : seg1[0] = 192;//"11000000";
             1 : seg1[0] = 249;//"11111001";
             2 : seg1[0] = 164;//"10100100";
             3 : seg1[0] = 8'hB0;//"10110000";
             4 : seg1[0] = 8'h99;//"10011001";
             5 : seg1[0] = 8'h92;//"10010010";
             6 : seg1[0] = 8'h82;//"10000010";
             7 : seg1[0] = 8'hF8;//"11111000";
             8 : seg1[0] = 128;//"10000000";
             9 : seg1[0] = 8'h90;//"10010000";
        
           default: seg1[0] = 192;//"11000000"
           endcase
        
        
    end
endmodule
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.02.2025, 04:24
Ответы с готовыми решениями:

Написать программу структурного описания каталога одной книги
//2. Написать следующие функции: // - вывести список всех книг; // - обеспечить хранение книг в следующей последовательности:...

Разработать модуль для описания системы Аэрофлот
Здравствуйте, сессия задалась трудная, в связи с эпидемией и прочим, никак не хватает времени вкатиться в C#. Может кто-нибудь помочь с...

Разработать модуль для описания системы Гостиница
Разработать модуль для описания системы Гостиница. Описать следующие классы: Номер (номер, категория, стоимость), одноместный номер...

2
 Аватар для Zhavoronkov5
54 / 49 / 24
Регистрация: 27.07.2015
Сообщений: 149
20.02.2025, 08:36
Начните с симуляции Вашего проекта, напишите тестбенч.
0
3 / 2 / 1
Регистрация: 16.12.2024
Сообщений: 23
20.02.2025, 10:33
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
module indicator(
    output reg unsigned [3:0] enable = 15,
    output reg unsigned [7:0] seg = 255,
    input [15:0] clk_Millisecond,
    input [7:0] seg1,
    input [7:0] seg2,
    input [7:0] seg3,
    input [7:0] seg4
);
 
always @ (posedge clk_Millisecond[0]) begin
    if (clk_Millisecond == 0) begin
        if (enable == 15) begin
            enable <= 7;
            seg <= seg1;
        end
        else if (enable == 7) begin
            enable <= 11;
            seg <= seg2;
        end
        else if (enable == 11) begin
            enable <= 13;
            seg <= seg3;
        end
        else if (enable == 13) begin
            enable <= 14;
            seg <= seg4;
        end
        else begin
            enable <= 15;
            seg <= 255;
        end
    end
end
 
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
module Homew16(
    output reg unsigned [3:0] enable = 15,
    output reg unsigned [7:0] seg = 255,
    output reg led = 1,
    input clk_50MHz_i,
    input sw_i
);
 
wire sw_down;
button_debouncer debouncer (
    .clk_i(clk_50MHz_i),
    .rst_i(),
    .sw_i(sw_i),
    .sw_state_o(),
    .sw_down_o(sw_down),
    .sw_up_o()
);
 
reg unsigned [15:0] clk_Millisecond = 0;
reg unsigned [7:0] seg1 [3:0];
integer BCounter = 0;
 
wire [15:0] w_Millisecond = clk_Millisecond;
wire [7:0] w_seg1 = seg1[0];
wire [7:0] w_seg2 = seg1[1];
wire [7:0] w_seg3 = seg1[2];
wire [7:0] w_seg4 = seg1[3];
wire [3:0] w_enable = enable;
wire [7:0] w_seg = seg;
 
indicator ict (
    .enable(w_enable),
    .seg(w_seg),
    .clk_Millisecond(w_Millisecond),
    .seg1(w_seg1),
    .seg2(w_seg2),
    .seg3(w_seg3),
    .seg4(w_seg4)
);
 
initial begin
    seg1[0] = 192; // 1100 0000
    seg1[1] = 255;
    seg1[2] = 255;
    seg1[3] = 255;
end
 
always @ (negedge clk_50MHz_i) begin
    clk_Millisecond <= clk_Millisecond + 1;
end
 
always @ (posedge sw_down) begin
    BCounter = BCounter + 1;
    case (BCounter)
        0: seg1[0] = 192; // "11000000"
        1: seg1[0] = 249; // "11111001"
        2: seg1[0] = 164; // "10100100"
        3: seg1[0] = 8'hB0; // "10110000"
        4: seg1[0] = 8'h99; // "10011001"
        5: seg1[0] = 8'h92; // "10010010"
        6: seg1[0] = 8'h82; // "10000010"
        7: seg1[0] = 8'hF8; // "11111000"
        8: seg1[0] = 128; // "10000000"
        9: seg1[0] = 8'h90; // "10010000"
        default: seg1[0] = 192; // "11000000"
    endcase
end
 
endmodule
Добавлено через 2 минуты
В модуле indicator вы используете clk_Millisecond[0] как чувствительный сигнал для always-блока. Это может привести к тому, что логика срабатывает только при изменении младшего бита clk_Millisecond, а не при изменении всего значения.

В модуле Homew16 вы передаете clk_Millisecond как wire, но не обновляете его значение в indicator корректно.
В модуле indicator вы передаете отдельные элементы массива seg1 как входные сигналы (seg1, seg2, seg3, seg4). Однако в Verilog массивы не могут быть напрямую переданы как порты. Вместо этого нужно передавать каждый элемент массива отдельно.
В модуле indicator вы используете блокирующие присваивания (=) вместо неблокирующих (<=). Это может привести к гонкам сигналов и некорректной работе.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.02.2025, 10:33
Помогаю со студенческими работами здесь

Разработать модуль для описания системы ГИБДД
Добрый день, помогите написать программу: Разработать модуль для описания системы ГИБДД. Опи-сать следующие объекты: Транспортное...

Создание описания классов
Здраствуйте, у меня такой вопрос (речь об интерфесе самого visual 2008). Скажем при наведении мыши на стандартный класс (пример,класс...

Создание описания монтажного узла
На форме имеется 2 текстбокса, пикчербокс, датагрид. В одном текстбоке будет название узла. В другом текстбоксе будет подробное описание...

Модуль описания системы объектов для векторов, задаваемых координатами концов в трехмерном пространстве.
Ребята,Очень нужно написать модуль в паскале по этому заданию.Буду очень благодарна,потому,что сама не знаю,как это сделать,честно. ...

Создание описания сайта для ЯНДЕКСа
Никак не могу разобраться с описанием сайта при индексирование. Сниппеты в записях это понятно, ЯКОСТ СЕО помогает в этом вопросе, но...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Не удержался от оценки концепции двигателя Стирлинга.
Hrethgir 03.04.2025
Сколько не пытался - она выдавала правильные схемы, причём случайно рисовала горячие области в середине, холодные по краям, трубки с краёв в низ и магнит в соединяющей, но при этой выдавала описание. . .
Метод с двумя буферами (или double buffering) или ping-pong buffering
Hrethgir 02.04.2025
Из ответов LM модели. Метод, который предполагает использование двух массивов для хранения промежуточных результатов сложения векторов, обычно применяется в сценариях, где необходимо минимизировать. . .
На любовном киберфронте
Alexander-7 01.04.2025
Недавно на одном малоизвестном сайте знакомств мною заинтересовалась девушка: «Текст немного странный. Но, судя по адресу почты, иностранка», – подумал я. Поколебавшись пару суток, я ответил ей:. . .
Как работает Node.js изнутри
run.dev 29.03.2025
Node. js изменил подход к разработке веб-приложений, позволив использовать JavaScript не только на стороне клиента, но и на сервере. Созданный в 2009 году Райаном Далем, этот открытый,. . .
Моки в Python: Mock Object Library
py-thonny 29.03.2025
Тестирование кода требует особого подхода, когда речь идёт о компонентах, взаимодействующих с внешним миром. Мы часто сталкиваемся с непредсказуемостью HTTP-запросов, чтением данных из базы или. . .
JavaScript: Управление памятью и улучшение производительности
run.dev 29.03.2025
В отличие от низкоуровневых языков программирования, JavaScript не требует ручного выделения и освобождения памяти. Здесь работает автоматический сборщик мусора, который определяет, какие объекты. . .
Мультитенантная архитектура со SpringBoot и PostgreSQL
ArchitectMsa 29.03.2025
SaaS-приложения редко обслуживают одного клиента и обычно они должны поддерживать множество организаций, каждая из которых работает в своём изолированном пространстве. Мультитенантная архитектура. . .
std::span в C++: Производительность и лучшие практики
NullReferenced 28.03.2025
std::span — одно из самых недооценённых нововведений стандарта C++20, которое радикально меняет подход к работе с непрерывными последовательностями данных. По сути, это невладеющее представление. . .
Многопоточность в C#: Threadpool
UnmanagedCoder 28.03.2025
Пул потоков в C# — это коллекция заранее созданных и готовых к использованию потоков, которые находятся в распоряжении приложения. Вместо того чтобы создавать и уничтожать потоки для каждой небольшой. . .
Вопросы на собеседованиях по микросервисам
ArchitectMsa 27.03.2025
Работодатели ищут не просто разработчиков, знающих базовые концепции, а специалистов, разбирающихся в тонкостях масштабирования, отказоустойчивости и производительности. Сейчас на первый план выходят. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер