Перейти к содержанию
    

Как реализовать на Verilog'e

Здравствуйте, уважаемые форумчане. Пытаюсь на Verilog реализовать следующую схему: дешифратор, выходы которого разрешают 2И.

На приведенном рисунке удалось реализовать дешифратор. А 2И - не удается реализовать(то что не удалось реализовать нарисовано синим цветом).

post-41333-1358098101_thumb.jpg

Вот реализация дешифратора

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

выбирайте, что больше нравится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Задам еще один вопрос. У меня есть делитель частоты:

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.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нужно ввести вам сигнал, напримиер "counter_reset", по нему сбрасывать счетчик в том always, где он считает, а формировать его там, откуда надо сбрасывать. Нельзя из разных блоков always делать присваивания одному регистру.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот таким образом я могу записать:

    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 работает, а счетчик не считает и соответственно не сбрасывается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что Вы этим кодом вообще хотели сказать? Извиняйте, но я сколько не смотрел на него, понять глубины этого супернаворота так и не смог.

 

Это делается примерно так:

 

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


Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что Вы этим кодом вообще хотели сказать? Извиняйте, но я сколько не смотрел на него, понять глубины этого супернаворота так и не смог.

 

Я хотел чтобы при отрицательном фронте CLOCK_0 счетчик считал, и сбрасывался с приходом любого значения code (т.е. 1 или 2 или 3 и т.д.). В Вашем примере счетчик сбросится только при дефолтном состоянии.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я хотел чтобы при отрицательном фронте CLOCK_0 счетчик считал, и сбрасывался с приходом любого значения code (т.е. 1 или 2 или 3 и т.д.). В Вашем примере счетчик сбросится только при дефолтном состоянии.

ну переставьте резет туда, куда надо, из дефолтного во все другие. А вообще, сами себе противоречите - я за образец брал вот это - http://electronix.ru/forum/index.php?showt...t&p=1133239 - там оно стоит в дефолтном.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну переставьте резет туда, куда надо, из дефолтного во все другие.

Так и сделал, но теперь вообще счетчик не работает ни в железе, ни в тестбенче.

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

 

Вот временные диаграммы тестбенча:

post-41333-1359809710_thumb.jpg

Видно, что на выходе exit установилась единица и счетчик не считает.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А я вообще то вижу, что считает, на диаграммах там четко видны прямоугольные импульсы. Правда почему-то не до двух, как в коде, а по полному кругу (до 100? как было в предыдущих примерах?). Да и еще на code у вас "xxx" - в железе такое не бывает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В тестбенче у меня описан дополнительный счетчик cnt - который имитирует приход кода, поэтому тут code - xxx, т.е. вместо code надо смотреть cnt. Программный же счетчик, в данном случае выход exit - не меняется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

счетчик это не выход, это массив сигналов. И выведите тогда уж и резет туда, чтобы видеть, кто виноват

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...