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

соответственно записываются след признаки - 100, 010, 001.

Для трех признаков достаточно двух бит, для комбинации всех признаков достаточно трех:

{«твердость последнего слога», «твердый/мягкий», «гласный/согласный»}

Комбинация из этих трех бит будет однозначно кодировать шесть окончаний: лар, лер, дар, дер, тар, тер.

 

Берем буфер, в который заносим слово, вдвигая его справа, либо записывая так, чтобы младший регистр соответствовал последней букве.

 

Далее, на мой взгляд, достаточно одной FSM (автомат конечных состояний), которая определит одно из шести состояний регистра окончаний.

 

До записи в буфер (или включая саму запись) и после чтения из него несинтезирумым подмножеством описываете запись слов в регистр и чтение их на экран или в файл.

Таким образом модули памяти в вашем проекте не обязательны, если того специально не требуют.

Можно, конечно, инициализировать словами блок памяти. Из памяти производить чтение последнего слога-буквы. И так далее.

 

Перед выводом результата окончание, разумеется, необходимо раскодировать (трехразрядное двоичное число заменить на соотв. слог).

 

Задача в вашем случае решается ориентировочно за день-два. Три.

 

 

UPD: Про конкатенацию убрал, глупость сморозил.

Изменено пользователем x736C

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


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

Можно, конечно, инициализировать словами блок памяти. Из памяти производить чтение последнего слога-буквы.

 

Это было б вообще шикарррррно!

 

Большое-пребольшое спасибо, за совет. Надо выяснить про автомат конечных состояний...

 

Для трех признаков достаточно двух бит, для комбинации всех признаков достаточно трех:

{«твердость последнего слога», «твердый/мягкий», «гласный/согласный»}

согласные еще делятся на "глухой/сонорный/звонкий"

если согласный/глухой/твердый слог - тар

если согласный/глухой/мягкий слог - тер

если согласный/звонкий/твердый слог или согласный/сонорный/твердый слог - дар

если согласный/звонкий/мягкий слог или согласный/сонорный/мягкий слог - дер

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


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

Думаю, прокатит автомат вроде этого:

 

module moore (data_in, data_out, reset, clock);

 

output data_out;

 

input [1:0] data_in;

 

input reset, clock;

 

reg data_out;

 

reg [2:0] pres_state, next_state;

 

parameter st0=3'd0, st1=3'd1, st2=3'd2, st3=3'd3, st4=3'd4;

 

//FSM register

 

always @(posedge clock or negedge reset)

 

begin: statereg

 

if(!reset)

 

pres_state = st0;

 

else

 

pres_state = next_state;

 

end // statereg

 

// FSM combinational block

 

always @(pres_state or data_in)

 

begin: fsm

 

case (pres_state)

 

st0: case(data_in)

 

2'b00: next_state=st0;

 

2'b01: next_state=st4;

 

2'b10: next_state=st1;

 

2'b11: next_state=st2;

 

endcase

 

st1: case(data_in)

 

2'b00: next_state=st0;

 

2'b10: next_state=st2;

 

default: next_state=st1;

 

endcase

 

st2: case(data_in)

 

2'b0x: next_state=st1;

 

2'b1x: next_state=st3;

 

endcase

 

st3: case(data_in)

 

2'bx1: next_state=st4;

 

default: next_state=st3;

 

endcase

 

st4: case(data_in)

 

2'b11: next_state=st4;

 

default: next_state=st0;

 

endcase

 

default: next_state=st0;

 

endcase

 

end // fsm

 

// Moore output definition using pres_state only

 

always @(pres_state)

 

begin: outputs

 

case(pres_state)

 

st0: data_out=1'b1;

 

st1: data_out=1'b0;

 

st2: data_out=1'b1;

 

st3: data_out=1'b0;

 

st4: data_out=1'b1;

 

default: data_out=1'b0;

 

endcase

 

end // outputs

 

endmodule // Moore

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


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

Синтез не обязателен. Главное чтоб алгоритм был описан в верилоге и работал адекватно.
В таком случае напишите это все в обычном процедурном стиле (через if ... else ...). Verilog это позволяет.

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


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

Синтез не обязателен. Главное чтоб алгоритм был описан в верилоге и работал адекватно.

Как человек с опытом преподавания хочу сказать что мне вас жаль, гнать в шею надо таких преподавателей HDL. Но и люди с вашим подходом к HDL у меня сдавали бы зачет раза с 8 го %)

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


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

Chainichek попробуйте последовать замечаниям/советам от людей, которые не побоюсь сказать ГУРУ в ПЛИС (и не только) и не одну "собаку на этом съели". Вам была предложена базовая литература - почитайте ее. Попробуйте вначале понять разницу между микропроцессором и ПЛИС. Дополнительно разберитесь для каких целей и применений служит язык Си и xHDL.

PS Потратьте время разберитесь и сделайте диплом(если я правильно помню) без ошибок и красиво.

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


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

гнать в шею надо таких преподавателей HDL

Скажем так, нет у нас преподавателей по HDL. Все изучаем сами и самостоятельно. Тыкаем, копаемся, пробуем. Так что, их удовлетворит любой подход.

 

Chainichek попробуйте последовать замечаниям/советам от людей, которые не побоюсь сказать ГУРУ в ПЛИС (и не только) и не одну "собаку на этом съели". Вам была предложена базовая литература - почитайте ее. Попробуйте вначале понять разницу между микропроцессором и ПЛИС. Дополнительно разберитесь для каких целей и применений служит язык Си и xHDL.

PS Потратьте время разберитесь и сделайте диплом(если я правильно помню) без ошибок и красиво.

 

Ок, буду иметь ввиду. В принципе, уже начала. Просто время поджимает. Задача про которую я рассказала - только фрагмент всего проекта. Кроме множественных окончаний, есть еще куча других правил естественного языка. Все надо будет автоматизировать на аппаратном уровне, как бы это не абсурдно звучало.

Защита диплома - 5 июля. Думаю, до защиты еще не раз приду за помощью.

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


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

Думаю, прокатит автомат вроде этого:
Вам лучше изменить подход, иначе не поспеете к июлю. :)

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


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

Вообщем, вот первичная версия реализации моей задачи. Она работает. Проверяла на симуляторе ModelSim-Altera 6.5b (Quartus II 9.1) Starter Edition. Незнаю, можно ли принять это за конечный автомат, обычный алгоритм.

 

Вопрос: можно ли преобразовать этот код так, чтоб он был синтезабельным? Возможно ли это?

 

 

module rom;

 

parameter DATA_WIDTH=32, ADDR_WIDTH=8,

kat1 = 4'd0, kat2 = 4'd1, kat3 = 4'd2, kat4 = 4'd3,

und1 = 4'd4, und2 = 4'd5, und3 = 4'd6, uan1 = 4'd7,

uan2 = 4'd8, gl = 1'b0, sogl = 1'b1, zhuan = 1'b0, zhin = 1'b1;

 

reg [0:31] rom[0:3];

reg [0:31] soz;

reg [0:55] soz1, soz2;

reg [0:23] kzhalgau, izhalgau;

reg [0:7] sozpar [0:3];

reg [0:7] zvuk, zvuk1;

reg [0:2]state;

reg [0:3]zz;

reg z, d;

integer i, j, dat1;

 

 

initial

begin

$readmemb("dual_port_rom_init.txt", rom);

begin: zapis

for (i=0; i<=3; i=i+1)

begin

soz = rom;

kzhalgau = koptik(soz);

soz1 = {soz,kzhalgau};

$fdisplay (dat1,"%b", soz1);

end

end

end

 

function [0:23] koptik;

input reg [0:31] soz;

begin

zvuk = soz[24:31];

z = dybys(zvuk);

if (z == gl)

begin

d = glas (zvuk);

case (d)

zhuan:

koptik = 24'b00111011_00110000_01000000;

zhin:

koptik = 24'b00111011_00110101_01000000;

endcase

end

else

begin

zz = soglas(zvuk);

if (dybys (soz[16:23])==gl)

zvuk1 = soz[16:23];

else zvuk1 = soz[8:15];

d = glas (zvuk1);

case (zz)

kat1, kat2, kat3, kat4, uan1:

if (d == zhuan) koptik = 24'b01000010_00110000_01000000;

else koptik = 24'b01000010_00110101_01000000;

und1, und3, uan2:

if (d == zhuan) koptik = 24'b00110100_00110000_01000000;

else koptik = 24'b00110100_00110101_01000000;

und2:

if (d == zhuan) koptik = 24'b00111011_00110000_01000000;

else koptik = 24'b00111011_00110101_01000000;

endcase

end

end

endfunction

 

 

 

 

function dybys;

input reg [0:7] in;

case (in)

8'b00110000, 8'b00111110, 8'b10110001, 8'b01001011,

8'b11011001, 8'b11101001, 8'b10101111, 8'b01010110, 8'b00110101:

dybys = gl;

8'b00111111, 8'b00111010, 8'b10011011,

8'b01000001, 8'b01000010, 8'b01001000,

8'b00111100, 8'b00111101, 8'b10100011,

8'b01000000, 8'b01000011, 8'b00111001,

8'b00111011,

8'b00110001, 8'b00110011, 8'b10010011, 8'b00110100,

8'b00110110, 8'b00110111:

dybys = sogl;

endcase

endfunction

 

function glas;

input reg [0:7] in;

case (in)

8'b00110000, 8'b00111110, 8'b10110001, 8'b01001011:

glas = zhuan;

8'b11011001, 8'b11101001, 8'b10101111, 8'b01010110, 8'b00110101:

glas = zhin;

endcase

endfunction

 

function [0:3] soglas;

input reg [0:7] in;

case (in)

8'b00111111:

soglas = kat1;

8'b00111010:

soglas = kat2;

8'b10011011:

soglas = kat3;

8'b01000001, 8'b01000010, 8'b01001000:

soglas = kat4;

8'b00111100, 8'b00111101, 8'b10100011:

soglas = und1;

8'b01000000, 8'b01000011, 8'b00111001:

soglas = und2;

8'b00111011:

soglas = und3;

8'b00110001, 8'b00110011, 8'b10010011, 8'b00110100:

soglas = uan1;

8'b00110110, 8'b00110111:

soglas = uan2;

endcase

endfunction

 

endmodule

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


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

module rom;

parameter DATA_WIDTH=32, ADDR_WIDTH=8,
kat1 = 4'd0, kat2 = 4'd1, kat3 = 4'd2, kat4 = 4'd3, 
und1 = 4'd4, und2 = 4'd5, und3 = 4'd6, uan1 = 4'd7,
uan2 = 4'd8, gl = 1'b0, sogl = 1'b1, zhuan = 1'b0, zhin = 1'b1;

reg [0:31] rom[0:3];
reg [0:31] soz;
reg [0:55] soz1, soz2;
reg [0:23] kzhalgau, izhalgau;
reg [0:7] sozpar [0:3];
reg [0:7] zvuk, zvuk1;
reg [0:2]state; 
reg [0:3]zz; 
reg z, d;
integer i, j, dat1;


initial
begin
$readmemb("dual_port_rom_init.txt", rom);
begin: zapis
for (i=0; i<=3; i=i+1)
begin
soz = rom[i];
kzhalgau = koptik(soz); 
soz1 = {soz,kzhalgau}; 
$fdisplay (dat1,"%b", soz1); 
end
end
end

function [0:23] koptik;
input reg [0:31] soz;
begin
zvuk = soz[24:31];
z = dybys(zvuk);
if (z == gl)
begin
d = glas (zvuk);
case (d) 
zhuan:
koptik = 24'b00111011_00110000_01000000;
zhin:
koptik = 24'b00111011_00110101_01000000;
endcase
end
else
begin
zz = soglas(zvuk);
if (dybys (soz[16:23])==gl)
zvuk1 = soz[16:23];
else zvuk1 = soz[8:15];
d = glas (zvuk1);
case (zz)
kat1, kat2, kat3, kat4, uan1:
if (d == zhuan) koptik = 24'b01000010_00110000_01000000;
else koptik = 24'b01000010_00110101_01000000;
und1, und3, uan2:
if (d == zhuan) koptik = 24'b00110100_00110000_01000000;
else koptik = 24'b00110100_00110101_01000000;
und2:
if (d == zhuan) koptik = 24'b00111011_00110000_01000000;
else koptik = 24'b00111011_00110101_01000000;
endcase 
end 
end 
endfunction




function dybys;
input reg [0:7] in; 
case (in)
8'b00110000, 8'b00111110, 8'b10110001, 8'b01001011,
8'b11011001, 8'b11101001, 8'b10101111, 8'b01010110, 8'b00110101:
dybys = gl;
8'b00111111, 8'b00111010, 8'b10011011,
8'b01000001, 8'b01000010, 8'b01001000,
8'b00111100, 8'b00111101, 8'b10100011,
8'b01000000, 8'b01000011, 8'b00111001,
8'b00111011,
8'b00110001, 8'b00110011, 8'b10010011, 8'b00110100,
8'b00110110, 8'b00110111:
dybys = sogl;
endcase
endfunction

function glas;
input reg [0:7] in; 
case (in)
8'b00110000, 8'b00111110, 8'b10110001, 8'b01001011:
glas = zhuan;
8'b11011001, 8'b11101001, 8'b10101111, 8'b01010110, 8'b00110101:
glas = zhin;
endcase
endfunction

function [0:3] soglas;
input reg [0:7] in; 
case (in)
8'b00111111:
soglas = kat1;
8'b00111010:
soglas = kat2;
8'b10011011:
soglas = kat3;
8'b01000001, 8'b01000010, 8'b01001000:
soglas = kat4;
8'b00111100, 8'b00111101, 8'b10100011:
soglas = und1;
8'b01000000, 8'b01000011, 8'b00111001:
soglas = und2;
8'b00111011:
soglas = und3;
8'b00110001, 8'b00110011, 8'b10010011, 8'b00110100:
soglas = uan1;
8'b00110110, 8'b00110111:
soglas = uan2;
endcase
endfunction 

endmodule

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


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

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

И проще редактировать сообщения, а не дублировать.

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


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

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

И проще редактировать сообщения, а не дублировать.

 

Я хотела отредактировать, но мне выдали сообщение, что у меня нет прав редактировать мое же сообщение.

 

 

Совет: используйте параметры заместо констант.

 

Да, я там поменяла уже.

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


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

Люди, где найти драйвер для USB Бластера Альтера? Хотела запрограммировать Циклон 3, что то не распознает.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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