Я пишу код verilog и получаю код ошибки «Не удается разрешить несколько постоянных драйверов»? - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь реализовать отображение кода Морзе на моей FPGA.Я написал много кода, но получаю одно и то же сообщение об ошибке.Прежде чем я углублюсь в это, пожалуйста, взгляните на задание.Чтобы было ясно, я не прошу, чтобы кто-то сделал задание для меня.Мне просто нужна помощь в отладке моего кода.

"Часть IV В этой части упражнения вы должны реализовать кодировщик азбуки Морзе с использованием автомата. Код Морзе использует шаблоны коротких и длинных импульсов для представления сообщения.Каждая буква представлена ​​в виде последовательности точек (короткий импульс) и тире (длинный импульс). Например, первые восемь букв алфавита имеют следующее представление:

A • -

B - • • •

C - • - •

D - • •

E •

F • • - •

G - - *

H • • • •

Разработайте и внедрите схему кодера Морзе с использованием FSM. Ваша схема должна принимать в качестве входа одну из первых восьмибуквы алфавита и отображают код Морзе для него на красном светодиоде.Используйте переключатели SW2−0 и кнопки KEY1−0 в качестве входов. Когда пользователь нажимает KEY1, схема должна отображать код Морзе для буквы, указанной SW2−0(000 для A, 001 для B,и т. д.), используя 0,5-секундные импульсы для представления точек и 1,5-секундные импульсы для представления штрихов.Кнопка KEY0 должна работать как асинхронный сброс.

Вот код, который я написал:

module part4 (SELECT, button, CLOCK_50, RESET, led);
input [2:0]SELECT;
input RESET, button, CLOCK_50;
output reg led=0;
reg [26:0] COUNT=0; //register that keeps track of count
reg [1:0] COUNT2=0; //keeps track of half seconds
reg halfsecflag=0; //goes high every time half second passes
reg dashflag=0; // goes high every time 1 and half second passes
reg [3:0] code; //1 is dot and 0 is dash. There are 4 total
reg [1:0] c3=2'b00; //keeps track of the index we are on in the code.
reg [2:0] STATE; //register to keep track of states in the state machine
wire done=0; //a flag that goes up when one morse pulse is done.
reg ending=0; //another flag that goes up when a whole morse letter has 
flashed
reg [1:0] length; //This is the length of the morse letter. It varies from 1 
to 4
wire i; // if i is 1, then the state machine goes to "dot". if 0 "dash"

assign i = code[c3];
assign done= (halfsecflag)&&(~ending)&&~led;

parameter START= 3'b000, DOT= 3'b001, DASH= 3'b010, DELAY= 3'b011, IDLE= 
3'b100;

parameter A= 3'b000, B=3'b001, C=3'b010, D=3'b011, E=3'b100, F=3'b101, 
G=3'b110, H=3'b111;


always @(posedge CLOCK_50 or posedge RESET) //making counter
begin
if (RESET == 1)
COUNT <= 0;
else if (COUNT==25'd25000000)
begin
COUNT <= 0;
halfsecflag <= 1;
end
else
begin
COUNT <= COUNT+1;
halfsecflag <=0;
end
end

always @(posedge CLOCK_50 or posedge RESET)
begin
if (RESET == 1)
begin
COUNT2 <= 2'd00;
dashflag<=1'b0;
end
else if ((COUNT2==2)&&(halfsecflag))
begin
COUNT2 <= 2'd0;
dashflag<=1'b1;
end
else if ((halfsecflag)&&(COUNT2!=2))
begin
COUNT2<= COUNT2+2'd1;
dashflag<=1'b0;
end
end


always @(posedge button or RESET) //asynchronous reset
begin
STATE<=IDLE;
end


always@(*) begin //State machine
case (STATE)

START: begin
led <= 1;
if (i) STATE <= DOT;
else STATE <= DASH;
end

DOT: begin
if (halfsecflag && ~ending) STATE <= DELAY;
else if (ending) STATE<= IDLE;
else STATE<=DOT;
end

DASH: begin
if ((dashflag)&& (~ending))
STATE <= DELAY;
else if (ending)
STATE <= IDLE;
else STATE <= DASH;
end

DELAY: begin
led <= 0;
if ((halfsecflag)&&(ending))
STATE<=IDLE;
else if ((halfsecflag)&&(~ending))
STATE<=START;
else STATE <= DELAY;
end

IDLE: begin
c3<=2'b00;
if (button) STATE<=START;
STATE<=IDLE;
end

default: STATE <= IDLE;

endcase
end


always @(posedge button)
begin
case (SELECT)
A: length<=2'b01;
B: length<=2'b11;
C: length<=2'b11;
D: length<=2'b10;
E: length<=2'b00;
F: length<=2'b11;
G: length<=2'b10;
H: length<=2'b11;
default: length<=2'bxx;
endcase
end

always @(posedge button)
begin
case (SELECT)
A: code<= 4'b0001;
B: code<= 4'b1110;
C: code<= 4'b1010;
D: code<= 4'b0110;
E: code<= 4'b0001;
F: code<= 4'b1011;
G: code<= 4'b0100;
H: code<= 4'b1111;
default: code<=4'bxxxx;
endcase
end

always @(*)
begin 
if (c3==length) 
begin
c3=2'b00; ending<=1;
end
else if (done)
c3= c3+2'b01;
end 

endmodule 

Код ошибки, который я продолжаю получать: Ошибка (10028): Не удается разрешить кратную константудрайверы для сети "c3 [1]" в part4.v (68)

Также зеленым над этим кодом ошибки, это говорит о выводе защелки несколько раз.Это не кажется хорошим!Можете ли вы взглянуть на мой код и посмотреть, сможете ли вы выяснить, почему я получаю это сообщение об ошибке?

Обновление: это не дубликат моего предыдущего вопроса.Раньше я просил советы о том, как создать задержку с помощью verilog.В этом вопросе я просил помочь отладить мой код.Сообщение об ошибке, которое я получил, не имело смысла для меня.Я посмотрел другие ответы на обмен стека относительно этого кода ошибки, но ни один из них не имел смысла для меня.

1 Ответ

0 голосов
/ 04 февраля 2019

Вам не хватает пары (очень) базовых принципов - вы не можете кодировать оборудование без них.Обратите внимание, что я использую здесь терминологию VHDL ('signal' / 'process' / etc), но идея в Verilog точно такая же, если немного сложнее найти правильные слова.

  1. Вы можете управлять сигналом только от одного процесса (если вы все равно синтезируете), или вы получаете несколько драйверов.Посмотрите на С3 - куда он ведет?Вы ведете его из 2-х комбинаторных блоков.То же самое относится и к ГОСУДАРСТВУ.
  2. В комбинаторном процессе, если вы читаете один из ваших выходных (управляемых) сигналов перед тем, как назначить ему (управлять им), вы выводите память .Вот откуда приходят ваши предполагаемые защелки.Подумайте об этом - процесс «просыпается», когда что-то чувствительно к изменениям / пожарам.Если он затем читает значение сигнала, который он сам запускает, это должно означать, что сигнал должен быть записан где-то, чтобы он имел текущее значение;он должен знать, какое значение он имел, когда процесс в последний раз завершался.Это то, что означает память.Вы делаете это и для STATE, и для c3 (if(c3==length) must read c3, case STATE must read state).

Вы исправляете (1)путем перекодирования, чтобы все сигналы управлялись только одним «владельцем» процесса.

Исправить (2) сложнее.В комбинаторном процессе (alway @*) убедитесь, что вы сначала задаете все значения по умолчанию для всех выходов, либо убедитесь, что вы ничего не читали до того, как написали это, чтобы не было путаницы относительно того, выводится ли память.Ваш комбинаторный процесс для получения данных STATE неверен.Ты читаешь ГОСУДАРСТВО, а потом пишешь это.У вас должно быть 2 сигнала: текущее состояние и следующее состояние.Вы должны прочитать текущее состояние и создать следующее.

У вас есть другие проблемы, но вам нужно сначала исправить эти 2.

...