sidy 1 13 января, 2013 Опубликовано 13 января, 2013 · Жалоба Здравствуйте, уважаемые форумчане. Пытаюсь на Verilog реализовать следующую схему: дешифратор, выходы которого разрешают 2И. На приведенном рисунке удалось реализовать дешифратор. А 2И - не удается реализовать(то что не удалось реализовать нарисовано синим цветом). Вот реализация дешифратора module test( input wire signal_1, input wire signal_2, input wire [3:0]code, output reg [6:0]segments ); always @* begin case(code) 4'd0: segments = 7'b0111111; 4'd1: segments = 7'b0000110; 4'd2: segments = 7'b1011011; 4'd3: segments = 7'b1001111; 4'd4: segments = 7'b1100110; 4'd5: segments = 7'b1101101; 4'd6: segments = 7'b1111101; 4'd7: segments = 7'b0000111; 4'd8: segments = 7'b1111111; 4'd9: segments = 7'b1101111; default: segments = 7'b1000000; endcase end endmodule] Полагаю что нужно ввести промежуточный регистр, но нужное все равно не получается module test( input wire signal_1, input wire signal_2, input wire [3:0]code, output reg [6:0]segments ); always @* begin reg [6:0]ali; case(code) 4'd0: ali= 7'b0111111; 4'd1: ali= 7'b0000110; 4'd2: ali= 7'b1011011; 4'd3: ali= 7'b1001111; 4'd4: ali= 7'b1100110; 4'd5: ali= 7'b1101101; 4'd6: ali= 7'b1111101; 4'd7: ali= 7'b0000111; 4'd8: ali= 7'b1111111; 4'd9: ali= 7'b1101111; default: ali = 7'b1000000; endcase segments=(ali&(signal_1|signal_2)); end endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 13 января, 2013 Опубликовано 13 января, 2013 · Жалоба output wire [6:0] segments; ...... assign segments = ali & {7{(signal_1|signal_2)}}; или assign segments = (signal_1|signal_2) ? ali : 7'h0; или сразу же в блоке always if (signal_1|signal_2) case .... endcase else ali <= 7'h00; или casex ({(signal_1|signal_2), code}) 5'b0xxxx: ali <= 7'h00; 5'h10: ali <= 7'b0111111; 5'h11: ali <= .... endcase выбирайте, что больше нравится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sidy 1 15 января, 2013 Опубликовано 15 января, 2013 · Жалоба Спасибо за разъяснение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sidy 1 31 января, 2013 Опубликовано 31 января, 2013 · Жалоба Задам еще один вопрос. У меня есть делитель частоты: reg [7:0] cnt=0; //Счетчик предделителя reg duty_cycle=1; always @ (negedge CLOCK_0) begin if (cnt==100) begin cnt<=0; duty_cycle=!duty_cycle; end else cnt<=cnt+1; end и дешифратор: reg [5:0]temp; assign out = temp & {6{(~INIT)&(signal_1|signal_2)}}; always @* begin case(code) 3'd0: begin temp = 6'b001_001; end 3'd1: begin temp = 6'b100_001; end 3'd2: begin temp = 6'b100_100; end 3'd3: begin temp = 6'b000_110; end 3'd4: begin temp = 6'b010_010; end 3'd5: begin temp = 6'b011_000; end default: temp = 6'b000_000; cnt=0; end endcase end С приходом нового кода (code) мне нужно сбросить счетчик (cnt). Я пытаюсь записать следующим образом: 3'd0: begin temp = 6'b001_001; cnt=0; end И Quartus выдает ошибку: Error (10028): Can't resolve multiple constant drivers for net "cnt[7]" at project.v(136). Я думаю это связано с тем что изменение cnt происходит сразу в двух блоках. Поэтому возник такой вопрос как записать одновременно чтобы и счетчик считал, и сбрасывался по приходу нового значения code. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 31 января, 2013 Опубликовано 31 января, 2013 · Жалоба нужно ввести вам сигнал, напримиер "counter_reset", по нему сбрасывать счетчик в том always, где он считает, а формировать его там, откуда надо сбрасывать. Нельзя из разных блоков always делать присваивания одному регистру. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sidy 1 1 февраля, 2013 Опубликовано 1 февраля, 2013 · Жалоба А вот таким образом я могу записать: always @* begin @(code) begin case(code) 3'd0: begin temp = 6'b001_001; cnt=0; end//Разрешаем работу VS1-1 VS2-2 3'd1: begin temp = 6'b100_001; cnt=0; end//Разрешаем работу VS1-1 VS3-2 3'd2: begin temp = 6'b100_100; cnt=0; end//Разрешаем работу VS3-2 VS2-1 3'd3: begin temp = 6'b000_110; cnt=0; end//Разрешаем работу VS2-1 VS1-2 3'd4: begin temp = 6'b010_010; cnt=0; end//Разрешаем работу VS1-2 VS3-1 3'd5: begin temp = 6'b011_000; cnt=0; end//Разрешаем работу VS3-1 VS2-2 default: temp = 6'b000_000; endcase end @(negedge CLOCK_0) begin case(cnt) 100: frequency=0; 200: begin frequency=1; cnt=0; end endcase cnt<=cnt+1; end end Попробовал, часть которая под @code работает, а счетчик не считает и соответственно не сбрасывается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 1 февраля, 2013 Опубликовано 1 февраля, 2013 · Жалоба А что Вы этим кодом вообще хотели сказать? Извиняйте, но я сколько не смотрел на него, понять глубины этого супернаворота так и не смог. Это делается примерно так: reg [7:0] cnt=0; //Счетчик предделителя reg duty_cycle=1; reg cntr_reset; always @ (negedge CLOCK_0) begin if (cntr_reset) cnt <= 0; else if (cnt==100) begin cnt<=0; duty_cycle=!duty_cycle; end else cnt<=cnt+1; end reg [5:0]temp; assign out = temp & {6{(~INIT)&(signal_1|signal_2)}}; always @* begin cntr_reset <= 1'b0; case(code) 3'd0: begin temp = 6'b001_001; end 3'd1: begin temp = 6'b100_001; end 3'd2: begin temp = 6'b100_100; end 3'd3: begin temp = 6'b000_110; end 3'd4: begin temp = 6'b010_010; end 3'd5: begin temp = 6'b011_000; end default: begin temp = 6'b000_000; cntr_reset<=1'b1; end endcase end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sidy 1 2 февраля, 2013 Опубликовано 2 февраля, 2013 · Жалоба А что Вы этим кодом вообще хотели сказать? Извиняйте, но я сколько не смотрел на него, понять глубины этого супернаворота так и не смог. Я хотел чтобы при отрицательном фронте CLOCK_0 счетчик считал, и сбрасывался с приходом любого значения code (т.е. 1 или 2 или 3 и т.д.). В Вашем примере счетчик сбросится только при дефолтном состоянии. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 2 февраля, 2013 Опубликовано 2 февраля, 2013 · Жалоба Я хотел чтобы при отрицательном фронте CLOCK_0 счетчик считал, и сбрасывался с приходом любого значения code (т.е. 1 или 2 или 3 и т.д.). В Вашем примере счетчик сбросится только при дефолтном состоянии. ну переставьте резет туда, куда надо, из дефолтного во все другие. А вообще, сами себе противоречите - я за образец брал вот это - http://electronix.ru/forum/index.php?showt...t&p=1133239 - там оно стоит в дефолтном. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sidy 1 2 февраля, 2013 Опубликовано 2 февраля, 2013 · Жалоба ну переставьте резет туда, куда надо, из дефолтного во все другие. Так и сделал, но теперь вообще счетчик не работает ни в железе, ни в тестбенче. reg [5:0]temp; reg rst; assign out = temp & {6{/*INIT*/&(signal_1|signal_2)}}; always @* begin rst<=0; case(code) 3'd0: begin temp = 6'b001_001; rst<=1; end 3'd1: begin temp = 6'b100_001; rst<=1; end 3'd2: begin temp = 6'b100_100; rst<=1; end 3'd3: begin temp = 6'b000_110; rst<=1; end 3'd4: begin temp = 6'b010_010; rst<=1; end 3'd5: begin temp = 6'b011_000; rst<=1; end default: begin temp = 6'b000_000; end endcase end reg [7:0] cnt = 0; reg frequency=1; always @ (negedge clock) begin if (rst) cnt <= 0; else if (cnt==2) begin cnt<=0; frequency=!frequency; end else cnt<=cnt+1; end assign exit = frequency; endmodule Вот временные диаграммы тестбенча: Видно, что на выходе exit установилась единица и счетчик не считает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 2 февраля, 2013 Опубликовано 2 февраля, 2013 · Жалоба А я вообще то вижу, что считает, на диаграммах там четко видны прямоугольные импульсы. Правда почему-то не до двух, как в коде, а по полному кругу (до 100? как было в предыдущих примерах?). Да и еще на code у вас "xxx" - в железе такое не бывает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sidy 1 2 февраля, 2013 Опубликовано 2 февраля, 2013 · Жалоба В тестбенче у меня описан дополнительный счетчик cnt - который имитирует приход кода, поэтому тут code - xxx, т.е. вместо code надо смотреть cnt. Программный же счетчик, в данном случае выход exit - не меняется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 2 февраля, 2013 Опубликовано 2 февраля, 2013 · Жалоба счетчик это не выход, это массив сигналов. И выведите тогда уж и резет туда, чтобы видеть, кто виноват Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sidy 1 2 февраля, 2013 Опубликовано 2 февраля, 2013 · Жалоба Вывел резет - не меняется, т.е. всегда единица. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 2 февраля, 2013 Опубликовано 2 февраля, 2013 · Жалоба ну вот и ищите ошибку, почему он всегда в 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться