Добро пожаловать, Гость
Логин: Пароль: Запомнить меня

ТЕМА:

Re: Вопросы по языку Verilog 11 года 8 мес. назад #2901

.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Dmitrii Radov. Причина: Вопрос снят.

Re: Вопросы по языку Verilog 11 года 8 мес. назад #2906

Dmitrii Radov пишет: Подскажите пожалуйста кто-нибудь.Прошу не судить строго, в <a href="/index.php/verilog">Verilog</a> не особо разбираюсь.
У меня есть два входных сигнала input wire [7:0] x,y как сделать так, чтобы эти сигналы записывались в выходной регистр output reg [15:0] z, причем биты из x идут на четные места z, а из y на нечетные.

z <= {y[7],x[7],y[6],x[6],y[5],x[5],y[4],x[4],y[3],x[3],y[2],x[2],y[1],x[1],y[0],x[0]};
Спасибо сказали: Dmitrii Radov

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Вопросы по языку Verilog 11 года 7 мес. назад #2993

Господа, еще раз прошу прощенья, не могли бы подсказать? Есть программа(Verilog) запускаю и моделирую ее с помощью Icarus-Verilog и GTKwave, но почему то, выходной сигнал не изменяется никак, подскажите, что я делаю неправильно?
`define DATA_WIDTH_in 8
`define DATA_WIDTH_out 16
module zip_synhro_for(i, j, reset, En, clk, out_mod);

input reset;
input En;
input clk;
input [`DATA_WIDTH_in-1:0] i, j; wire [`DATA_WIDTH_in-1:0] i, j;
output [`DATA_WIDTH_out-1:0] out_mod; reg [`DATA_WIDTH_out-1:0] out_mod;

// module zip(input wire reset, input wire clk, input wire [`DATA_WIDTH_in-1:0] i, j etc. и т.д. otput reg....




integer x;
reg [`DATA_WIDTH_in-1:0] i_reg;
reg [`DATA_WIDTH_in-1:0] j_reg;




always @(posedge En or negedge reset) // если по уровню, то получим регистры-защелки, если по фронту то норм

begin
if (!reset)
out_mod <= `DATA_WIDTH_out'b0;
else if (En)
begin

i_reg <= i;
j_reg <= j;

for (x = 0; x <= `DATA_WIDTH_in-1; x = x + 1)
begin
if (x == 0)
begin
out_mod[x] <= i_reg[x];
out_mod[x+1] <= j_reg[x];
end
else
begin
out_mod[2*x] <= i_reg[x];
out_mod[2*x+1] <= j_reg[x];
end


end
end
end


endmodule
И ТЕСТБЕНЧ

`define DATA_WIDTH_in 8
`define DATA_WIDTH_out 16

`timescale 10 ns / 1 ns
module test_zip();


reg [`DATA_WIDTH_in-1:0] i;
reg [`DATA_WIDTH_in-1:0] j;
reg reset;
reg En;
reg clk;
wire [`DATA_WIDTH_out-1:0] out_mod_inst;

zip_synhro_for zip_inst(i, j, reset, En, clk, out_mod_inst); //!!! потом можно добавить clk сюда в список


// always
// !!! #10 clk = ~clk; после того как зададим сигнал clk

initial
begin
reset = 0;
//clk = 0;
En = 0;
i = 8'b00000000;
j = 8'b00000000;
end

initial
begin
En = 1; #1;
i = 8'b01010101; j = 8'b11100000; #1;
j = 8'b01001111; #1; En = 0; #1;
i = 8'b10100011; j = 8'b01110111; #1;
En = 1; #1; reset = 1; #2;
i = 8'b11111100; j = 8'b10010111; #1;
reset = 0;
i = 8'b00100011; j = 8'b01010111; #1;
i = 8'b10101010; #2;
reset = 1; #4;

end

initial
begin
#20 $finish;
end


initial
begin
$dumpfile("out.vcd");
$dumpvars(0,test_zip);
$dumpvars(0,zip_inst);
end

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Dmitrii Radov.

Re: Вопросы по языку Verilog 11 года 7 мес. назад #2994

Выход не изменяется, потому что у Вас постоянный сброс. По положительному фронту сигнала En в always все равно происходит проверка if(!reset), и получается, что именно в этот момент у Вас reset=0.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Вопросы по языку Verilog 11 года 7 мес. назад #2995

Я полагаю, что тут дело в задержках(конвейеризации), почему(если смотреть на временную диаграмму) когда i=0A, j=07 и приходит фронт сигнала En, то на выход записывается только значение i, вместо записи по битам двух значений i и j?









Вот слегка изменил тестбенч(пока дико демо-версия, просто разобраться хочу, что к чему)
always
#1 En = ~En; //после того как зададим сигнал clk


initial
begin
reset = 0;
clk = 0;
En = 0;
i = 8'b00000000;
j = 8'b00000000;
end

initial
begin
#1;
reset = 1; #1; //En = 0; #1; En = 1;
i = 8'b00001000; j = 8'b00000001; #2;// En = 0; #1;
//reset = 0; #1;
//En = 1; #3;
j = 8'b00001111; #1; //En = 0; #1;
i = 8'b00000011; j = 8'b00000111; #1;
//En = 0; #1; //reset = 1; #2;
i = 8'b11111100; j = 8'b10010111; #1; //En = 1; #1;
//reset = 0; //En = 1;
i = 8'b00001000; j = 8'b00000001; #1;
i = 8'b00000011; j = 8'b00000111; #1; //En = 0; #1;
i = 8'b00001010; #2; j = 8'b00001111; //En = 1; #1;
reset = 1; #4;
i = 8'b00000011; j = 8'b00000110; //En = 1; #1;
i = 8'b00000101; j = 8'b00000010; //En = 1; #1;
end
Вложения:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Dmitrii Radov.

Re: Вопросы по языку Verilog 11 года 7 мес. назад #2996

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

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Вопросы по языку Verilog 11 года 7 мес. назад #3011

Господа, не подскажите, что здесь не верно? Я присваиваю значение переменной
s <= (((i^N)*(2**L) + i)*2+1);

Quartus выдает мне про экспоненту:
exponentation is not supported for specified operands, exponent must be unsigned or constatnt positive

Далее было найдено следующее:
- оператор возведения в степень ** (поддерживается ограниченно: только когда один из
операндов равен 2)

НО так тут в степень возводим как раз число 2

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Вопросы по языку Verilog 11 года 7 мес. назад #3012

Дело в экспоненте L. В моем случае L = clogb2(N); (логарифм по основанию 2, реализованный в качестве функции внутри модуля, от входного сигнала N).

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Вопросы по языку Verilog 11 года 7 мес. назад #3013

Дело в том, что сигнал N принимает только положительные целые значения, следовательно L = clogb2(N) должен тоже принимать только положительные или беззнаковые значения.
Как мне можно избавиться от этой ошибки в Квартусе?
Определить L как unsigned?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Вопросы по языку Verilog 11 года 7 мес. назад #3014

Verilog HDL error at <location>: exponentiation is not supported for specified operands, <additional details>

(ID: 13497)
CAUSE: Exponentiation support is limited. The limitations are as follows:
Either the exponent or the base must be a constant.
The exponent must be an unsigned number or positive constant.
For non-constant exponents the base must be a power of 2.
ACTION: Change the expression to fit the restrictions.
Here is some example syntax:
2**n, where n is an unsigned non-constant
8**n, where n is an unsigned non-constant
var**c, where var is any value and c is constant

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Время создания страницы: 0.664 секунд
Работает на Kunena форум