alexx188 0 8 сентября, 2011 Опубликовано 8 сентября, 2011 · Жалоба Во многих(если не во всех) документация по Verilog написано: что <<< и >>> - операторы циклического сдвига, однако на практике сдвиг получается обычный логический. Чтобы реализовать циклический сдвиг мне пришлось использовать такой код: reg [7: 0] shift_r; always@(clk) begin shift_r[7] <= shift_r[0]; shift_r[6:0] <= shift_r[7:1]; end Кто-нибудь может мне объяснить для чего служат операторы <<< и >>>. И чем они отличаются от << и >>?. Или может кто-нить приведет пример использования операторов циклического сдвига. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 8 сентября, 2011 Опубликовано 8 сентября, 2011 · Жалоба Все очень просто - это арифметический сдвиг. Википедия Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 8 сентября, 2011 Опубликовано 8 сентября, 2011 · Жалоба shift_r[7:0] <= {shift_r[0], shift_r[7:1]}; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexx188 0 8 сентября, 2011 Опубликовано 8 сентября, 2011 · Жалоба shift_r[7:0] <= {shift_r[0], shift_r[7:1]}; спасибо за ответ. Этот код стройнее :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 8 сентября, 2011 Опубликовано 8 сентября, 2011 · Жалоба Вот так тоже должно работать shift_r <= shift_r << 7 | shift_r >> 1; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexx188 0 8 сентября, 2011 Опубликовано 8 сентября, 2011 · Жалоба Вот так тоже должно работать shift_r <= shift_r << 7 | shift_r >> 1; В продолжение: пытаюсь сделать ШИМ input signed [7:0] Duty; assign pwm_dir = ($signed(Duty) > 0) ? 1'b0 : 1'b1; assign pwm_out = ($signed(Duty) > 0) ? Duty_r[0] : ~Duty_r[0]; reg [6:0] Duty_r always@(posedge clk or negedge rst) if (!rst) Duty_r <= 0; else Duty_r <= {Duty_r[0], Duty_r[6: 1]}; Однако возникла заминка. В какой момент времени мне, чтобы ШИМ работал корректно, можно(или нужно) изменять Duty? Есть подсказки? :rolleyes: На ум пришла такая идея: input signed [iDutyWidth - 1: 0] Duty; output pwm_out, pwm_dir; assign pwm_dir = ($signed(Duty) > 0) ? 1'b0 : 1'b1; assign pwm_out = ($signed(Duty) > 0) ? Duty_r[0] : ~Duty_r[0]; reg [3:0] pwm_state; reg [iDutyWidth - 2: 0] Duty_r; always@(posedge clk or negedge rst) if (!rst) begin Duty_r <= 0; pwm_state <= 0; end else begin pwm_state <= pwm_state + 1'b1; if (pwm_state == 0) Duty_r <= Duty[iDutyWidth - 2: 0]; else Duty_r <= {Duty_r[0], Duty_r[iDutyWidth - 2: 1]}; end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 9 сентября, 2011 Опубликовано 9 сентября, 2011 · Жалоба Странный (мягко выражаясь) у вас ШИМ. ШИМы обычно делают на счетчике и компараторе, а у вас непонятный какой то сдвиговый регистр Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stu 0 20 октября, 2011 Опубликовано 20 октября, 2011 · Жалоба написал module a_v ( inclk0, inclk1, shift_r ); output [7:0] inclk0; input inclk1; output [7:0] shift_r; initial begin inclk0 = 8'b1000_0100; shift_r = 8'b1000_0100; end always @(posedge inclk1) begin inclk0[7:0] <= {inclk0[0], inclk0[7:1]}; shift_r <= shift_r << 7 | shift_r >> 1; end endmodule что не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Poluektovich 0 20 октября, 2011 Опубликовано 20 октября, 2011 · Жалоба inclk0, shift_r должны быть как reg объявлены Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x736C 0 20 октября, 2011 Опубликовано 20 октября, 2011 · Жалоба Это синтезируется? Объявлять регистры уже не нужно? Я отстал от жизни. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stu 0 20 октября, 2011 Опубликовано 20 октября, 2011 · Жалоба Это синтезируется? Объявлять регистры уже не нужно? Я отстал от жизни. просто сдвиг норм, а циклический нет а щас че не так? module a_v ( inclk0, inclk1, shift_r ); output logic [7:0] inclk0; input logic inclk1; output logic [7:0] shift_r; logic [7:0] inclk0_r; logic [7:0] shift_r_r; initial begin inclk0_r = 8'b1000_0100; shift_r_r = 8'b1000_0100; end always @(inclk1) begin inclk0_r[7:0] <= {inclk0_r[0], inclk0_r[7:1]}; shift_r_r <= shift_r_r << 7 | shift_r_r >> 1; end assign inclk0 = inclk0_r; assign shift_r = shift_r_r; endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x736C 0 20 октября, 2011 Опубликовано 20 октября, 2011 (изменено) · Жалоба просто сдвиг норм, а циклический нет А сдвиг по фронту как у вас (posedge inclk1) ?! Предполагает регистр. Попробуйте скомпилить -- что вам поругается синтезатор. Изменено 20 октября, 2011 пользователем x736C Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stu 0 20 октября, 2011 Опубликовано 20 октября, 2011 (изменено) · Жалоба ничего, кроме Warning (10235): Verilog HDL Always Construct warning at a_v.v(22): variable "inclk0_r" is read inside the Always Construct but isn't in the Always Construct's Event Control если posedge убрать и тип данных хоть reg, хоть logic Изменено 20 октября, 2011 пользователем stu Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Poluektovich 0 20 октября, 2011 Опубликовано 20 октября, 2011 · Жалоба module a_v ( inclk0, inclk1, shift_r ); output reg [7:0] inclk0; input inclk1; output reg [7:0] shift_r; initial begin inclk0 = 8'b1000_0100; shift_r = 8'b1000_0100; end always @(posedge inclk1) begin inclk0[7:0] <= {inclk0[0], inclk0[7:1]}; shift_r <= shift_r << 7 | shift_r >> 1; end endmodule в таком варианте циклический сдвиг получается Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stu 0 21 октября, 2011 Опубликовано 21 октября, 2011 (изменено) · Жалоба вот код. не работает. кто пишет "работает", пробовали? module a_v ( inclk0, inclk1, shift_r ); output reg [7:0] inclk0; input logic inclk1; output reg [7:0] shift_r; reg [7:0] inclk0_r; reg [7:0] shift_r_r; initial begin inclk0_r = 8'b1000_0100; shift_r_r = 8'b1000_0100; end always @(posedge(inclk1)) begin inclk0_r[7:0] <= {inclk0_r[0], inclk0_r[7:1]}; shift_r_r <= shift_r_r << 7 | shift_r_r >> 1; end assign inclk0 = inclk0_r; assign shift_r = shift_r_r; endmodule Изменено 21 октября, 2011 пользователем stu Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться