VitalyM4 0 1 апреля, 2008 Опубликовано 1 апреля, 2008 · Жалоба Здравствуйте. Я думаю что следующее утверждение верно. Среднее арифметическое 8-битных чисел - 8 битное число :) Второе при делении накопленной суммы 8битных чисел на количество этих самых чисел результат всегда будет получен максимум за 8 тактов. Т.е для нахождения среднего будет необходимо 8 итераций последовательного деления. Вопрос. Можно ли сделать итерационный делитель который будет осуществлять деление 16 битного аккумулятора на 8 битное количество чисел всегда за 8 тактов? Посмотрел вот тут: http://www.pwalsh.net/cs/ASPCode/NonRestoringDivision/test.asp Если я всегда буду сдвигать делитель на 8 тактов при начале деления. Получу ли я желаемый результат? Заранее спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VitalyM4 0 1 апреля, 2008 Опубликовано 1 апреля, 2008 · Жалоба Сделал так wire [16:0] tmp_div=PIX_NUM<<7; always@(..) if(div_we) begin accumulator<=accumulator-tmp_div; cur_divisor<=tmp_div>>1; /* Pixel_num */ bit_count<=8; end else if (bit_count>4'b000) begin if (accumulator[16]==1'b0) begin accumulator <=accumulator-cur_divisor; result[bit_count-1'b1]<=1'b1; miso_avg<=1'b1; end else begin result[bit_count-1'b1]<=1'b0; miso_avg<=1'b0; accumulator <= accumulator+cur_divisor; end bit_count<=bit_count-1; cur_divisor<= cur_divisor>>1; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 2 апреля, 2008 Опубликовано 2 апреля, 2008 · Жалоба Конечный результат я так понимаю вам нужно что - то подобное что и мне на http://electronix.ru/forum/index.php?showtopic=43110 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
eternal_nan 0 26 июля, 2008 Опубликовано 26 июля, 2008 · Жалоба Vitaliy, Otvet na vas vopros po moemu: DA. Delenie mozes sdelat tak: a/b = a * (1/b). b 8 bitnoye chislo. Znacit, jevo inverse (izvini, ne znayu slovo po russki), mozno nayti v 8 taktov posledovatelnogo delenia. Mozna i na mnogo bistreye yesli ne posledovatelno. Vot tebe kusok koda katoriy delayet "inverse" v verilog: input iClk; input iReset_N; input iClear; input iEnable; input [15:0] iRefPwr; output [15:0] oQuotient; reg [31:0] Acc; reg [15:0] RefPwr; reg [15:0] PreviousInverse; wire signed [31:0] SubResult; wire FlagSubresultLTE0; always @(posedge iClk `ASYNC_RESET_DEF) begin if(!iReset_N) begin Acc <= 17'h1_0000; RefPwr <= 16'h00ff; PreviousInverse <= 16'h00ff; end else begin if(iClear) begin RefPwr <= iRefPwr; Acc <= 17'h1_0000; PreviousInverse <= oQuotient; end else begin PreviousInverse <= PreviousInverse; RefPwr <= RefPwr; if(iEnable) Acc <= FlagSubresultLTE0 ? (Acc << 1) : ((SubResult << 1) + 1'b1); end end end assign SubResult = Acc - (RefPwr << 15); assign FlagSubresultLTE0 = SubResult[31]; assign oQuotient = Acc[15:0]; nasol to ze samoye v matlab, mozet budet legce ponyat: function result = divider (dividend, divisor) acc = dividend; for i=1:16 display i; sub_result = acc - (32768 * divisor); if(sub_result >= 0) acc = (2*sub_result) + 1; else acc = acc * 2; end end result = acc; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться