Problème de gestion de la liaison série RS232 en VHDL

Problème de gestion de la liaison série RS232 en VHDL - Divers - Programmation

Marsh Posté le 28-11-2009 à 12:05:43    

Bonjour, j'ai un petit problème concernant l'utilisation de la liaison série en VHDL. Je vous explique : J'ai une matrice à LEDs qui est commandée par une carte (la DE2 de chez Altera). J'ai programmé le FPGA de la carte pour pouvoir par exemple allumer les LEDs une par une de droite à gauche ou de gauche à droite. Je souhaite pouvoir envoyer des trames (des mots) de mon PC au FPGA via la liaison série RS232 pour exécuter la partie du programme qui correspond. Par exemple si j'envoie le mot "GaD" je veux que le programme allume les LEDs de gauche à droite ou si j'envoie "DaG" je veux qu'il allume les LEDs de droite à gauche.
En m’aidant d’internet j’ai fait le petit programme suivant pour que le FPGA reçoivent le mot tel que je l’ai envoyé du PC. Le problème c’est que le programme ne fonctionne pas et je n’arrive pas à trouver mon erreur. Voici mon programme :
module Serie(CLOCK_27, RxD_data, UART_RXD);
input CLOCK_27;
input UART_RXD;
output RxD_data;
 
parameter ClkFrequency = 27000000;
parameter Baud = 14400;
parameter BaudGeneratorAccWidth = 1875;
parameter BaudGeneratorInc = ((Baud<<(BaudGeneratorAccWidth-4))+(ClkFrequency>>5))/(ClkFrequency>>4);
 
reg [1:0] RxD_cnt;
reg RxD_bit;
reg [BaudGeneratorAccWidth:0] BaudGeneratorAcc;
reg [1:0] RxD_sync;
reg [2:0] bit_spacing;
reg [3:0] state;
reg [7:0] RxD_data;
 
always @(posedge CLOCK_27)
  BaudGeneratorAcc <= BaudGeneratorAcc[BaudGeneratorAccWidth-1:0] + BaudGeneratorInc;
 
wire BaudTick = BaudGeneratorAcc[BaudGeneratorAccWidth];
 
 
always @(posedge CLOCK_27)  
 if(BaudTick)  
  RxD_sync <= {RxD_sync[0], UART_RXD};
   
 
 
always @(posedge CLOCK_27)
if(BaudTick)
begin
  if(RxD_sync[1] && RxD_cnt!=2'b11) RxD_cnt <= RxD_cnt + 1;
  else
  if(~RxD_sync[1] && RxD_cnt!=2'b00) RxD_cnt <= RxD_cnt - 1;
 
  if(RxD_cnt==2'b00) RxD_bit <= 0;
  else
  if(RxD_cnt==2'b11) RxD_bit <= 1;
end
 
 
 
always @(posedge CLOCK_27)
if(state==0)
  bit_spacing <= 0;
else
if(BaudTick)
  bit_spacing <= bit_spacing + 1;
 
wire next_bit = (bit_spacing==7);
 
always @(posedge CLOCK_27)
if(BaudTick)
case(state)
  4'b0000: if(~RxD_bit) state <= 4'b1000; // start bit found?
  4'b1000: if(next_bit) state <= 4'b1001; // bit 0
  4'b1001: if(next_bit) state <= 4'b1010; // bit 1
  4'b1010: if(next_bit) state <= 4'b1011; // bit 2
  4'b1011: if(next_bit) state <= 4'b1100; // bit 3
  4'b1100: if(next_bit) state <= 4'b1101; // bit 4
  4'b1101: if(next_bit) state <= 4'b1110; // bit 5
  4'b1110: if(next_bit) state <= 4'b1111; // bit 6
  4'b1111: if(next_bit) state <= 4'b0001; // bit 7
  4'b0001: if(next_bit) state <= 4'b0000; // stop bit
  default: state <= 4'b0000;
endcase
 
always @(posedge CLOCK_27)  
 if(BaudTick && next_bit && state[3])  
  RxD_data <= {RxD_bit, RxD_data[7:1]};
   
   
endmodule
 
 
 
 
CLOCK_27 est l’horloge de ma carte que je souhaite utilisé, UART_RXD est l’entrée de ma carte où arrive la trame envoyé par ma liaison série, et RxD_data doit contenir le mot que j’ai envoyé a partir de mon PC.
Voilà j’espère que j’ai été assez clair. Si quelqu’un peut m’aider, j’en serais ravi.
Merci.
A bientôt j’espère.  

Reply

Marsh Posté le 28-11-2009 à 12:05:43   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed