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

ТЕМА: Вопросы по "коду"

Вопросы по "коду" 5 года 10 мес. назад #7643

Почему debugRxD_bit совпадает по форме с сигналом sampleNow. debugRxD_bit должен иметь частоту в 2 раза ниже?
Попытался убрать все лишнее ниже для понимания.
module USART (clk,RxD,RxD_data_ready,RxD_endofpacket,OversamplingTick,dataout,debugRx,debugSampleNow,debugRxD_bit);
input clk;
input RxD;
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
output reg [7:0] dataout;                     //leds
output reg RxD_data_ready = 0;
output reg RxD_endofpacket = 0;           // asserted for one clock cycle when a packet has been detected (i.e. RxD_idle is going high)  
output wire OversamplingTick;             //115200*8=921600//oversampling     
output wire debugRx; 
output wire debugSampleNow;
output reg debugRxD_bit;                           
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
parameter BaudGeneratorInc_rx = 11'd1213;  //11'd1214;//50000000/(115200*8)~54->65535/54=1213
reg [15:0] BaudGeneratorAcc_rx;           //2^16-1 = 65535 максимальное число,которое можно поместить в 16 бит
parameter Oversampling = 8;    
reg [2:0] OversamplingCnt = 0;             //2^3 = 8 должен сам себя сбрасывать в 0!!!!!
assign debugSampleNow = sampleNow; 
//======================================================================================//
//+++++++++++++++++++++++|USART rx oversampling baudrate 921600|++++++++++++++++++++++++//
//======================================================================================//
always @(posedge clk)// 50MHz
  begin
  BaudGeneratorAcc_rx <= BaudGeneratorAcc_rx + BaudGeneratorInc_rx;//если чатота передачика 115200 бод то принимать нужно 115200*8=921600
  end                                                              //получилось примерно 926000
 assign  OversamplingTick = BaudGeneratorAcc_rx[15]; // 16 бит будет равен 1 либо 0 это и есть наш тактирующий сигнал
//=======================================================================================//
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
//======================================================================================//
always @(posedge OversamplingTick) OversamplingCnt <=  OversamplingCnt + 1'd1;
wire sampleNow = OversamplingTick && (OversamplingCnt==2'd3); 

always @(posedge sampleNow)debugRxD_bit<=~debugRxD_bit; 

endmodule

Хотя следующий код работает как надо!!!Частота у debugRxD_bit в 2 раза ниже OversamplingTick
module USART (clk,RxD,RxD_data_ready,RxD_endofpacket,OversamplingTick,dataout,debugRx,debugSampleNow,debugRxD_bit);
input clk;
input RxD;
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
output reg [7:0] dataout;                     //leds
output reg RxD_data_ready = 0;
output reg RxD_endofpacket = 0;         
output wire OversamplingTick;            
output wire debugRx; 
output wire debugSampleNow;
output reg debugRxD_bit;                           
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
parameter BaudGeneratorInc_rx = 8'd151;  //11'd1214;//50000000/115200~434->65535/151~434
reg [15:0] BaudGeneratorAcc_rx;           //2^16-1 = 65535 максимальное число,которое можно поместить в 16 бит
assign debugRx=RxD; 
//======================================================================================//
//+++++++++++++++++++++++|USART rx oversampling baudrate 921600|++++++++++++++++++++++++//
//======================================================================================//
always @(posedge clk)// 50MHz
  begin
  BaudGeneratorAcc_rx <= BaudGeneratorAcc_rx + BaudGeneratorInc_rx;
  end               
 assign  OversamplingTick = BaudGeneratorAcc_rx[15]; // 16 бит будет равен 1 либо 0 это и есть наш тактирующий сигнал
//=======================================================================================//
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
//======================================================================================//

always @(posedge OversamplingTick)debugRxD_bit<=~debugRxD_bit;

endmodule
Вложения:

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

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

Вопросы по "коду" 5 года 8 мес. назад #7654

  • nckm
  • nckm аватар
  • Не в сети
  • Администрация форума
  • Администрация форума
  • Сообщений: 112
  • Спасибо получено: 34
Трудно сказать..
Вы делаете временную симуляцию или функциональную?
У вас в первом примере сигнал sampleNow является логической функцией и значит может иметь "глитчи", короткие импульсы пока сигнал не установится.
Их можно увидеть при временной симуляции или в реальном железе.

wire sampleNow = OversamplingTick && (OversamplingCnt==2'd3);
always @(posedge sampleNow)debugRxD_bit<=~debugRxD_bit;

Не используйте выход логической функции как тактовую частоту для always @(posedge ???)
используйте только выход регистра-триггера.

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

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