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
MarshPosté 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;
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
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.
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.