La position actuelle:Accueil du site>RAM / FIFO Learning Review
RAM / FIFO Learning Review
2022-05-14 15:02:26【Nall Oui.】
RAM/FIFO Examen de l'apprentissage
L'atome du point de référenceFPGAGuide de conception logique
&&githubLe Code de l'un des grands(async_fifo)
sp_ram(Port unique)
StockageramUn modèle de tableau suffit,Sélectionnez en fonction de la profondeur et de la largeur.
reg [7:0] ram [31:0] ; //ram Données
Assigner une valeur basée sur le signal activé
always @(posedge clock ) begin
if(wen && en)
ram[address] <= data;
end
always @(posedge clock ) begin
if(( wen == 1'b0) && en)
q <= ram[address];
else
q <= 8'hx ;
end
Un module de lecture - écriture est nécessaire pour actionner l'adresse de lecture - écriture et le signal d'activation de lecture - écriture,Et c'est là queSp_ramModule.
Les résultats de la simulation sont présentés dans la figure
tp_ram(Pseudo - Double Port)
L'idée de base est similaire,La différence avec un seul port est qu'il est possible de lire et d'écrire simultanément,Il y a aussi une situation extrême,Lire trop vite,Une technique est nécessaire:Lire, porter, écrire,Assignez la valeur à écrire directement à la lecture.
sync_fifo(Synchroniserfifo)
Synchroniserfifo La clé de la conception est le pointeur de lecture / écriture
fifoCalcul de la quantité de données
always @ (posedge clk or negedge rst) begin
if (rst == 1'b0)
count <= 0;
else begin
case({wr_en,rd_en})
2'b00:count<= count;
2'b01:
if(count!==5'b00000)
count<=count-1;
2'b10:
if(count!== max1_count)
count<=count+1;
2'b11:count<=count;
endcase
end
end
Jugement du drapeau vide et complet
always @(count) begin
if(count==5'b00000)
empty = 1;
else
empty = 0;
end
always @(count) begin
if (count== max_count)
full = 1;
else
full = 0;
end
Synchroniserfifo Généralement utilisé pour la mise en cache des données
La figure suivante est un diagramme de simulation
async_fifo(Asynchronefifo)
Points saillants: Conversion binaire en Code gris , Nombre de champs de code gris , Comment utiliser le Code gris pour juger de la marque pleine et vide
Synchronisation de l'adresse de lecture au champ write Clock , L'adresse d'écriture doit être synchronisée avec le champ d'horloge de lecture
[email protected](posedge fifo_wr_clk or negedge rst_n)
if(!rst_n)begin
sync_r2w_r1 <= 11'd0;
sync_r2w_r2 <= 11'd0;
end else begin
sync_r2w_r1 <= gray_rdaddress;
sync_r2w_r2 <= sync_r2w_r1;
end
[email protected](posedge fifo_rd_clk or negedge rst_n)
if(!rst_n)begin
sync_w2r_r1 <= 11'd0;
sync_w2r_r2 <= 11'd0;
end else begin
sync_w2r_r1 <= gray_wraddress ;
sync_w2r_r2 <= sync_w2r_r1;
end
Le Code gris doit être utilisé pendant la synchronisation , Éviter les changements simultanés de bits binaires , Créer un phénomène concurrentiel
assign gray_rdaddress = (rdaddress >>1) ^ rdaddress;//(({1'b0,rdaddress[9:1]}) ^ rdaddress);
assign gray_wraddress = (({1'b0,wraddress[10:1]}) ^ wraddress);
Comment le Code Grey juge - t - il le vide? .
Vide: Lire plus vite que écrire , Le pointeur de lecture a rattrapé le pointeur d'écriture
Plein.: Écrire plus vite que lire , Écrire au - delà du pointeur d'écriture
assign fifo_empty = (gray_rdaddress == sync_w2r_r2);
assign fifo_full = (gray_wraddress == {~sync_r2w_r2[10:9],sync_r2w_r2[8:0]});
Méthodes d'essai de performance: Tester deux cas de lecture rapide et d'écriture lente et de lecture lente et d'écriture rapide respectivement fifoRéaction
fifo Il y a des limites de performance , Lorsque l'écart réel entre les horloges de lecture et d'écriture est trop grand, la performance doit être améliorée en changeant la profondeur . Le calcul de la profondeur est une autre Science .
En même temps,Asynchronefifo Également disponible pour la conversion bitwidth , Ceci est fait en lisant et en écrivant le rapport d'horloge .
Mentions de copyright
Auteur de cet article [Nall Oui.],Réimpression s’il vous plaît apporter le lien vers l’original, merci
https://fra.chowdera.com/2022/134/202205141500424006.html
Recommandé par sidebar
- Installer MySQL Community Server Error Missing libaio Dependence
- Le cadre Gin se demande pourquoi vous n'utilisez pas * routergroup
- Redis Paging
- [ingénieur du système de base de données] 6.4 connaissances de base sur l'entrepôt de données et l'exploration des données
- Exemple de classification pytorch
- Npx hardhat verify your Contrat Address - - Network rinkeby
- 19. Supprimer l'avant - dernier noeud n de la Liste
- Méthode d'extension pour obtenir la description de l'énumération
- Comment déterminer l'effet de l'avis de résiliation?
- Cas de combat réel dans l'industrie du jeu 5: distribution en ligne des joueurs
Devinez que vous aimez
[leetcode] day59 laid number & different Binary Search Trees
Ctfshow MISC Starting
【 Free domestic】 Different Methods of taskctl Verification for Distributed work Batch Processing Platform
Mathematical Modeling Learning (66): Support Vector Machine (SVM) case Practice
Thanos Sidecar Assembly
Meta ai annonce une étude à long terme sur le cerveau humain et le traitement de la langue
Examiner la source de l'outil de génération d'applets Wechat - prise en charge des propriétaires de trafic
Type de Tuple (référence c)
PTC: le métacosme a entraîné des changements importants dans la recherche et le développement d'équipements médicaux
Question d'entrevue 01.05. Édition unique / offre de doigts II 041. Moyenne des fenêtres coulissantes
Recommandé au hasard
- Huawei machine Test Question 11: hj11 Digital inversion
- Pascal voc2012 Data Set
- Commande unzip
- Flink (Scala Edition) Learning one Common source
- [circuit] 7 - modèle de puissance réel et transformation équivalente
- Go Language type Custom type oh
- Opérations pytorch et GPU (cuda)
- Rééchantillonnage d'un ensemble d'échantillons déséquilibré
- Uni app Technology Sharing | uni app to applet - Real Time message
- Comment écrire un champ dans SQL qui est supérieur ou égal à une valeur
- [leetcode] 442. Dupliquer les données dans le tableau
- Pourquoi changer d'emploi en 2022? L'opportunité est plus importante que l'augmentation de salaire?
- Flux de travail flux de travail avec formulaires dynamiques
- Pourquoi utiliser. Net5? Net5 est l'avenir!
- (pycharm) installation du paquet nltk
- Utilisation d'un tableau d'entrées - sorties cycliques (facile à apprendre) Utilisation d'une fonction de réglage cyclique
- Gestion de la puissance de calcul du Service de recherche à l'ère du cloud natif
- Problèmes courants et solutions de suppression circulaire des éléments de la liste Arraylist
- Les 10 questions les plus populaires de kotlin sur Stack overflow
- Calcul du temps pour 555 minuteurs
- L'ancêtre public le plus proche d'un arbre binaire
- Volume analogique leetcode [normal] 931. Chemin de descente minimum et
- Huawei aipass Certification of NFC: An Introduction to test case
- 622. Conception des files d'attente circulaires
- Détails du mode Nat pour les machines virtuelles VMware
- [devops] kubernets Network
- Nouvelle boisson de thé "pincer" les jeunes, "huit chevaux de l'industrie du thé" où sont les sorties?
- Contrôle des risques financiers dans l'apprentissage automatique
- Version 1.67 vscode Bracket colorizer cancelled
- Fonction de méthode utilisée par la requête de date MySQL
- Hugegraph client app Development (1)
- [.NET] Utiliser SOA Library + ABP pour construire un cadre de projet de microservice (v): découverte de services et surveillance de la santé
- Ajouter de la mémoire virtuelle sans ajouter de disque dur
- Redis source Learning (25), double end Link List Learning, adlist. H
- Amélioration de l'entrée de la nouvelle fonctionnalité illusoire 5
- Qu'est - ce qu'un cache hit signifie?
- Sencha touch Online Practical Training phase 1 section 4
- "Nous avons quitté Google"
- Yolov 5 test de formation et interprétation du code source
- Réalisation de l'effet du diagramme de rotation par JS natif