-
BORIS_BRITWA
-
Автор темы
-
Не в сети
-
Новый участник
-
-
Сообщений: 1
-
Спасибо получено: 0
-
-
|
Почему 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
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
nckm
-
-
Не в сети
-
Администрация форума
-
-
Сообщений: 112
-
Спасибо получено: 34
-
-
-
-
-
|
Трудно сказать..
Вы делаете временную симуляцию или функциональную?
У вас в первом примере сигнал sampleNow является логической функцией и значит может иметь "глитчи", короткие импульсы пока сигнал не установится.
Их можно увидеть при временной симуляции или в реальном железе.
wire sampleNow = OversamplingTick && (OversamplingCnt==2'd3);
always @(posedge sampleNow)debugRxD_bit<=~debugRxD_bit;
Не используйте выход логической функции как тактовую частоту для always @(posedge ???)
используйте только выход регистра-триггера.
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
Время создания страницы: 0.100 секунд