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

Не Работает Сдвиговый Регистр В Верилог


Leo

Рекомендуемые сообщения

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов 144
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

Верно. В этом примере надо либо i начинать с 1, либо переделать так:

sr[(i+1)*8-1:i*8];

Но так извращаться можно долго. Пока не поставлена конкретная задача - ни чему не научишься.

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

  • 2 недели спустя...

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Я попробовал посмотреть как работает цикл For и что то получилось но не более чем было написано в примере из Альтеры в самом начале. Но передать параметр sr[1] дальше типа //a <= v+ sr[1] и подругому не получается. Пишет не явное присвоение почему не понятно.Хотя на assign sr_out1 = sr[1]; заначения выводит значит массив значениями заполняется или я ошибаюсь.Значения в заполнении регистра sr <= { sr[23:0],sr_in }; так же идут но там видно что регистр заполняется а здесь не ясно заполняется ли массив.

module counter (

shift,

clk,

sr_in,

sr_out,

sr_out1,

sr_out2,

sr_out3,

sr_out4

);

input shift,clk;

input wire [7:0]sr_in;

output [7:0]sr_out,sr_out1,sr_out2,sr_out3,sr_out4;

reg [3:0]counte=4'b0;

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

integer n;

reg [7:0]v =8'h57;

reg [7:0]a;

wire c;

always @ (posedge clk

if (shift ==1 )

begin

if(counte==4'd4)

counte <= 4'b0;

else

counte <= counte + 1'd1;

for (n = 0; n<4; n = n+1)

begin

sr[0] <= sr_in;

sr[n] <=sr[n-1];

$display("%d",n,sr[n]);

end

end

assign c =counte==4'd4;

assign sr_out = sr[0];

assign sr_out1 = sr[1];

assign sr_out2 = sr[2];

assign sr_out3 = sr[3];

//assign a =v+ sr[3];

//always @ (posedge clk)

//if(c==1)

// begin

//a <= v+ sr[2]

//$display("%d",n,a);

//end

initial

$monitor($stime,, shift,, clk,,,sr_out,sr_out1,a, sr_in );

endmodule

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Код закоментирован просто он не может быть выполнен отладчик ругается и что можно предпринять что бы продолжить выполнение а то параметр sr[1] дальше не передается.

Изменено пользователем Leo
Ссылка на комментарий
Поделиться на другие сайты

Например вот так:

Модуль http://paste.fedorap...86657/52311751/

Тестбенч http://paste.fedorap.../86659/13952312

И получаем отличную диаграмму, всё работает как и задумано:

post-164632-0-27601400-1395231352_thumb.png

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

Не знаю почему но код который я писал и правил я не удаляю а коментирую так этот вариант кода выдаёт ошибку туже даже с твоим тестбэнчем а оформленный заново в новый файл без коментариев нормально заработал и с моим тестбэнчем.

Может где ошибки сохраняются.

Мы этот пример в самом начале расматривали и всё было не понятно а щас ты всё великолепно оформил ты вспомнил забытое.

Изменено пользователем Leo
Ссылка на комментарий
Поделиться на другие сайты

Очень хотел узнать если я получил набор членов y[n] от одного до двенадцати как их можно объеденить или сразу надо разбить заново в группу по три члена. Надеюсь не очень мудрено?

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

На выходе в модуле coud у меня есть значения s d этих значений 4x2 но может и больше будет. Значения s[n] на примере они однобитные предположим их 12 рассортировать типа массив по 3 бита 4 раза.

module counter (

shift,

clk,

sr_in,

sr_out,

sr_out1,

sr_out2,

sr_out3,

sr_out4

);

input shift,clk;

input wire [7:0]sr_in;

output [7:0]sr_out,sr_out1,sr_out2,sr_out3,sr_out4;

reg [3:0]counte=4'b0;

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

integer n;

wire c;

always @(posedge clk)

if (shift ==1)

begin

if(counte==4'd4) counte <= 4'b0;

else counte <= counte + 1'd1;

for (n = 0; n<4; n = n+1)

begin

sr[0] <= sr_in;

sr[n] <=sr[n-1];

$display("%d",n,sr[n]);

end

end

assign c= counte==4'd4;

assign sr_out = sr[0];

assign sr_out1 = sr[1];

assign sr_out2 = sr[2];

assign sr_out3 = sr[3];

wire out[3:0];

genvar y;

generate

for(y = 0; y < 4; y = y + 1 )

begin : dff_g

coud qw0(

.rty©,

.clk(clk),

.asd(sr[y]),

.s(out[y]),

.d(out[y])

);

end

endgenerate

initial

$monitor($stime,, shift,, clk,,,sr_out,sr_out1, sr_in );

endmodule

module coud (

rty,

clk,

asd,

s,

d

);

input rty,clk;

input wire [7:0]asd;

output s,d;

reg s,d;

reg [7:0] v= 8'h45;

reg [7:0] a;

always @ (posedge clk)

if(rty==1)

begin

if(v>asd)

a <= v-asd;

else

a <=asd-v;

s <=(a>150);

d <=(a<50);

v<= asd;

end

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

Ну как хочешь так и объединяй свои биты.

Вообще, использовать массивы при небольших объёмах (как у тебя [7:0] sr [3:0]) неудобно и неэффективно.

Вот если бы было как минимум [31:0] sr [255:0], то ещё можно подумать. А так возьми просто линейный регистр sr [256*4-1:0] и работай с ним и его частями - будет проще и понятнее.

Изменено пользователем Vascom
Ссылка на комментарий
Поделиться на другие сайты

Так вот я и не могу понять s[n] по одному биту это же не регистр [12:0]s мне однобитные значения надо переслать в регистр а потом его нарезать как мне удобно.

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

Это есть обращение к регистру [256*4-1:0] 8 бит четыре раза разделенные по 2 бита правельно.Значит с s [256*4-2:0] я однобитные s объединяю и разделяю на 3 битные но как кним обратится чего то не пойму.

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

Ты на каком-то странном языке объясняешься :)

Тут же всё просто. Регистр [1023:0], обращаешься к его битам по их номеру. Что непонятного?

Хочешь к отдельным битам, хочешь к диапазонам.

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

как сделать вывод из сдвигового регистра?

input clock;
input   ena;
input   IN;
output  [147:0] OUT;

integer n;
reg   TRIG [0:147] ; 

always @(posedge clock)
begin

if (ena) begin
   TRIG[0] <= IN;
   for (n=0; n!=147; n=n+1) begin //
   TRIG[(n+1)] <= TRIG[n];   
   end


 end


end
endmodule

то есть TRIG это 148 одиночных D тригеров соединеных последовательно

а OUT это 148 паралельная битная шина вопрос как их соединить

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

не совсем понимаю суть этого

ведь структура обявления переменной такая тип reg или wire [размер шины] имя [количество елементов]

если сделать reg [147:0]TRIG;

то у нас получиться один 148 битный регистр

как же тогда в нем будет происходить последовательный сдвиг

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

Я попробовал вариат но что то не работает g j параметр не передаётся. Что не так ?

`timescale 1ns/1ns
module counter (
shift,
clk,
sr_in,
sr_out,
sr_out1,
sr_out2,
sr_out3,
sr_out4
);
input shift,clk;
input wire [7:0]sr_in;
output [7:0]sr_out,sr_out1,sr_out2,sr_out3,sr_out4;
reg [3:0]counte=4'b0;
reg [7:0] sr [3:0];
integer n;
wire c;
always @(posedge clk)
if (shift ==1)
begin
if(counte==4'd4) counte <= 4'b0;
else			 counte <= counte + 1'd1;

for (n = 0; n<4; n = n+1)
begin
 sr[0] <= sr_in;
 sr[n] <=sr[n-1];
 $display("%d",n,sr[n]);
end
end
assign c= counte==4'd4;
assign sr_out = sr[0];
assign sr_out1 = sr[1];
assign sr_out2 = sr[2];
assign sr_out3 = sr[3];

coud qw0(
	 .rty(c),
	 .clk(clk),
	 .asd(sr[2]),
	 .s(s),
	 .d(d)
);
coud qw1(
	 .rty(c),
	 .clk(clk),
	 .asd(sr[1]),
	 .s(s),
	 .d(d)
);
reg [7:0] a;
reg [7:0] g;
reg [7:0] j;
always @(a[7:0],a[15:8])
begin
g<=a[7:0];								   //Вот
j<=a[15:8];								  // Вот здесь
end
initial
$monitor($stime,, shift,, clk,,,sr_out,sr_out1, sr_in );
endmodule
module coud (
rty,
clk,
asd,
s,
d
);
input rty,clk;
input wire [7:0]asd;
output reg s,d;
reg [7:0] v= 8'h45;
reg [7:0] a;
always @ (posedge clk)
if(rty==1)
begin
if(v>asd)
a <= v-asd;

else
a <=asd-v;
s <=(a>150);
d <=(a<50);
v<= asd;
$display("%h",a);
end
endmodule

Изменено пользователем Leo
Ссылка на комментарий
Поделиться на другие сайты

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

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