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

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


Leo

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

Нумерация выводов получается ручная надо назвать а1 а2 а3 правельно. Можно ли их нумеровать в цикле а[n] если сигнал а1 описан как регистр wire [7:0] a1; что б можно было обратится g<= a[n]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Я пробовал так a[(n+1)*8-1:n*8] но отладчик ругался когда переделал так a[8*(n+1)-1:n*8] он перестал ругаться. Так тоже можно? Я пока не проверил. Я хотел уточнить что бы обрабатывать сигналы из разных блоков надо создать общий регистр длинной равной входящим сигналам и передать присвоить сигналы общему регистру! Других способов нет а нумерацию провести через a[(n+1)*8-1:n*8].

Хотел ещё узнать в Верелог 4 байта идёт на знак а когда 8 байт лишнее можно отбросить или как поступают в этом случаи.

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

От перестановки чисел при умножении результат не меняется. Если отладчик ругается - всегда показывай что именно он пишет.

Что значит "4 байта идёт на знак"? Можешь хоть один бит использовать для знака, хоть ни одного.

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

Один бит не может быть как будет выглядеть цифра 9 В VHDL идёт 8 бит для 9 а верилоге сделано вроде 4 бита он их в двоичном исчислении обрабатывает.

Я хотел уточнить что бы обрабатывать сигналы из разных блоков надо создать общий регистр длинной равной входящим сигналам и передать присвоить сигналы общему регистру! Других способов нет а нумерацию провести через a[(n+1)*8-1:n*8].

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

Я не путаю.

Например 8-битное знаковое число: из них 7 бит - значение и один бит - знак. Получаем числа от -128 до 127.

Второй пример 3-битное знаковое число: из них 2 бит - значение и один бит - знак. Получаем числа от -4 до 3.

Так что на знак отводится один бит, а уж точно не байт.

А можно вообще без знака, и можно легко преобразовывать беззнаковые в знаковые и обратно.

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

Я не правельно написал я имел в виду заначение и в верелог на одно значение вроде отводится 4 бита а в VHDL 8 бит и если можно 4 то как сжать данные у которых на значение 8 бит так я правельно пояснил.

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

Тойсть число например 5 что в верелог что VHDL будет занимать 4 бита а в байте можно разместить два числа 57 и тут больше подводных камней нет. Значение 5 содержит минимум 4 бита и меньше не отведёшь. Так.

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

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

	 .a(a[15:8])
);
wire [15: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];

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

Код ты уже видел. Я привел его не весь а только главное. Я хотел понять твоё высказывание. Можешь в общий регистр объединять, можешь не объединять. После я закомментировал общий регистр но сразу ругань тогда здесь от него отказаться нельзя.

warning: Part select a[7:0] is out of range.
warning: Part select a[15:8] is out of range.
error: Output port expression must support continuous assignment.
: Port a of coud is connected to a['sd15:'sd8]
1 error(s) during elaboration.

coud qw0(
	 .rty(c),
	 .clk(clk),
	 .asd(sr[2]),
	 .s(s),
	 .d(d),
	 .a(a[7:0])
);
coud qw1(
	 .rty(c),
	 .clk(clk),
	 .asd(sr[1]),
	 .s(s),
	 .d(d),
	 .a(a[15:8])
);
//wire [15: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,
   a
);   
input rty,clk;
input wire [7:0]asd;
output reg s,d;
reg [7:0] v= 8'h45;
output 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
//initial
//$monitor($stime,, a );
endmodule

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

Сравнение if(a[23:16]> B) не работает как правельно написать.

timescale 1ns/1ns
module counter_uut (
shift,
clk,
sr_in,
sr_out1,
sr_out2,
sr_out3
);
input wire [7:0]sr_in;
input shift,clk;
output [7:0]sr_out1,sr_out2,sr_out3;
reg[23:0]a;
reg[7:0]b=7'd100;
reg[7:0]s;
reg [1:0]counte=4'b0;
wire c;
always @(posedge clk)
begin
if(counte==4'd3) counte <= 4'b0;
else			 counte <= counte + 1'd1;
a[23:8]<=a[15:0];
a[7:0]<=sr_in;
end
assign c= counte==4'd3;
always @(posedge clk)
if(c==1)
begin
if(a[23:16]>
s<=a;
end
endmodule

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

Решения я не нашёл пришлось создавать переменную и передовать туда значение. У меня получается много переменных типа рег правельно ли это не знаю. Хотел спросить другое я написал код и тест бэнч. Но чтобы он нармально работал приходится ставить задержки иначе в регистре образуется каша почему не пойму запаздывание увеличевается при не большом запаздование помогает замена <= на = Но при создании кода из блоков в цикле запаздывание стало на порядок больше 220ns как влияет это запаздывание на работу реального процера?

`timescale 1ns/1ns
module test();

reg clk;
reg [7:0] sr_in;
initial
begin
   clk = 0;
   sr_in = 0;
end

always
 #10 clk= ~clk;

wire[7:0]sr_out1,sr_out2,sr_out3;

counter_uut counter(
   .clk(clk),
   .sr_in(sr_in),
   .sr_out1(sr_out1)
);


initial
begin
$dumpfile("out.vcd");
$dumpvars(-1, test);
$monitor($stime,, clk,,, sr_in,, sr_out1);

@(posedge clk);
sr_in = 120;
#10
@(posedge clk);
sr_in = 230;
#10
@(posedge clk);
sr_in = 255;
#220
@(posedge clk);
sr_in = 130;
#20
@(posedge clk);
sr_in = 20;
#20
@(posedge clk);
sr_in = 245;
#220
@(posedge clk);
sr_in = 110;
#10
@(posedge clk);
sr_in = 220;
#10
@(posedge clk);
sr_in = 250;
#10
@(posedge clk);
sr_in = 100;
#10
@(posedge clk);
sr_in = 50;
#10
@(posedge clk);
sr_in = 235;

$finish();
end
endmodule

module counter_uut(
   clk,
   sr_in,
   sr_out1
);
output  [7:0]sr_out1;
input wire [7:0]sr_in;
input clk;
reg [95:0]in;
always @ (posedge clk)
in <= { in[87:0],sr_in };
genvar y;
generate
for(y = 1; y < 5; y = y + 1 )
begin : dff_g
coun qw0(
	 .clk(clk),
	 .r(in[(24*y)-1:(y-1)*24])
);
end
endgenerate
endmodule
module coun (
   clk,
   r
);
input clk;
input wire[23:0]r;
reg[7:0]s1,s2,s3;
reg [1:0]counte=2'd0;
wire c;
always @(posedge clk)
begin
if(counte==2'd3)    counte <= 2'd0;
   else			    counte <= counte + 1'd1;
end
assign c= counte==2'd3;
always @(posedge clk)
if(c==1)
begin
  s1<=r[23:16];
  s2<=r[15:8];
  s3<=r[7:0];


 end
endmodule

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

При заполнении регистра in <= { in[87:0],sr_in }; в тест бэнче пришлось поставить задержку #10 потому что в программе GTKWave регистр заполнялся повторяющимися значениями а не той последавательностью которую я передовал. После этого я поставил задержки и последовательность стала правельной.

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

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

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

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

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

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

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

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

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

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

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

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