Se connecter avec
S'enregistrer | Connectez-vous

[VHDL] Problème de liaison série en VHDL

Bonjour,
j'ai un petit problème concernant l'utilisation de la liaison série en VHDL sous Quartus. 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 a 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ée 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.
Lassé par la pub ? Créez un compte
Tom's guide dans le monde