6
votes

Attribuez le caractère ASCII au fil de Verilog

Je comprends que vous pouvez déclarer une chaîne dans un banc de test Verilog comme suit:

reg [8:1] char_value;  

always @(reset) 
begin
    char_value = "A";
    if (char_value == 8'h41)
        // Do stuff!


3 commentaires

Essayez-vous de synthétiser cela?


@ Adam12 - Oui, j'essaie d'imprimer du texte sur un écran LCD connecté à mon tableau de développement FPGA. Depuis que cela n'était pas clair pour vous et tous les deux, je modifierai la question à être plus spécifique: je souhaite attribuer ces valeurs de caractères 8 bits à une sortie de mon module via un registre à décalage.


Qu'est-ce qui ne fonctionne pas exactement? Avez-vous une erreur de synthèse ou le texte n'est-il simplement pas indiqué sur l'écran LCD?


6 Réponses :


0
votes

Les chaînes semblent fonctionner dans un module pour moi: xxx

Qu'est-ce qui ne fonctionne pas pour vous?

La chaîne type Type de données a été introduit dans la norme SystemVerilog en 2005 (voir IEEE 1800-2005 ou 1800-2009).


2 commentaires

J'essaie d'attribuer la valeur ASCII à un bus 8 bits; Je n'ai pas $ Afficher .


Pour la simulation, vous pouvez utiliser une chaîne ou $ d'affichage. Mais si vous concevez du code pour FPGA. Je pense que l'outil de synthèse ne prend actuellement pas en charge le type de chaîne. De Xilinx, ils ne soutiennent même pas SystemVerilog maintenant.



-3
votes

SystemVerilog doit prendre en charge la cession de chaîne comme mentionné dans SPEC:

For example, to store the 12-character string "Hello world\n" requires a variable 8x12, or 96 bits wide. 
     bit [8*12:1] stringvar = "Hello world\n";


1 commentaires

Cette réponse est complètement et totalement incorrecte. Verilog supporte les constantes de caractères, et rien n'empêche aucun utilisateur d'attribuer des valeurs hexadécimales aux registres!



9
votes

Vous pouvez affecter une chaîne à un type de registre. Toute personne qui dit autrement a tort. Vous voudrez peut-être rendre vos registres 0 'basés sur le fonctionnement correctement. Je l'ai fait dans de vrais FPGA et cela fonctionne.


2 commentaires

Pour être clair. Le compilateur Verilog traduira "A" à 8'H41, "AB" à 16'H4142, "ABC" à 24'H434241. Ne vous rendez pas plus compliqué en essayant de penser que le FPGA doit «soutenir» cela quelque part comment. Tout ce qui se passe, c'est que le compilateur la convertit d'un beau format lisible humain en un nombre.


Oui Les valeurs de chaîne ne sont que des constantes. Bien que l'outil de synthèse puisse autoriser ou non permettre aux registres de disposer de valeurs d'initialisation / de réinitialisation non zéro, en fonction de la technologie utilisée. Les outils X / A récemment n'ont pas de problème Initialisation des registres de changement de constantes directement hors de réinitialisation / programmation.



3
votes

Cela fonctionne pour moi: xxx

à la fois dans la simulation et sur un FPGA SPARTAN-3E


1 commentaires

Juste testé sur Ise (virtex-6), fonctionne comme un charme.



0
votes
output [8*14:1]string_value1;  
reg [8*14:1]string_value1;

always @ (posedge BIWEn)

if (BIWEn==1'b1 ||BIREn==1'b1)
    begin:START_STATE_WRITE
        psW=idleW;  //psW is Present State Write
        string_value1= "IDLE";
    end

![test bench] (c:\pictures)

0 commentaires

7
votes

Définissez un tableau d'octets, puis assignez ASCII à chaque élément de tableau:

reg [7:0] data_out;
reg       data_out_valid;
reg [3:0] some_index;
:
// pushing data onto a bus
data_out       <= foo[some_index];
data_out_valid <= 1'd1;
some_index     <= some_index + 4'd1;


0 commentaires