跳至主要内容

跟我一起學西語: 名詞、形容詞、代詞

· 閱讀時間約 11 分鐘
w0x7ce
MySelf

发布于 2024-11-02 21:31:18(微信公众号导出记录)。

本文来自公众号后台的“导出文章内容”功能。博客正文由导出长图进行本地 OCR 转写,并保留原始排版图用于逐段核对。

原文链接:查看原文

OCR 转写有效文字约 4352 字;代码、流程图和版式以文末原始排版图为准。

正文(本地 OCR 转写)

跟我一起學西語:名、形容词、代 西班牙語中的名、形容韵和代韵

一、名词

1.性别

  • 西語名分為阳性和院性雨種性别。

  • 通常,以-0结尾的名词是隔性的,以-a结尾的名是性的。如Libro(書

  • 但也有一些特殊情况:

  • 以-ista、-ma、-ta等结尾的名词,性别由所指的人或物决定,如el/la

一些来源於希語的名韵,以·a结尾但是阳性的,如eldia(这一天)、e]

  • 少数名的性别需要記憶,如elagua(水)是喀性的,lamano(手)是院性[

  • 遗有一些名词,管有院陽性之分,但意思相同,如elmar/lamar(海洋)。

2.数十

  • 西語名韵有單敷和之分。

  • 一般情况下,名尾加-s横成数形式,如libro-libros,casa-C

  • 如景名韵尾是重音-1、-u,或以-5、-X、-ch、-Z尾,数形式需要加

  • mani(花生)→ manfes

  • autobus(公共汽車)→autobuses

  • fax(得真)-faxes

  • sandwich(三明治)- sandwiches

  • lapiz(铅策)-lapices

  • 少数名前的單復数形式不规则,需要特别記惯,如:

  • elespecimen(样本)-los especimenes

  • 一些数名词表示一個整體概念,如gafas(眼)、pantalones(神子)、ti)

二、形容词

1.性数配合

  • 形容韧需要则它所修飾的名在性和數上保持一致。

  • 韬大多款形容铜可以通退改韵尾-o/-a和加-5来表示性敷的化,如:

  • alto/alta(高的,單数隔性/性)

少數形容韵只有一個形式,不隨性敷墨化,如grande[大的)、joven(年轻的)、

  • 形容韵在名铜前後位置的區别:

  • 通常放在名铜後,表示客觀描述,如uncocherojo(一红色的車)。

西班牙語中的名纲、形容韵和代 在西班牙語中,名词、形容和代是三個其重要的词额,它們在語言表速中扮演 著鍵角色。今天,我們就来群细探一下这三個類的特點和用法。

一、名韵

1.性别

。以-ista、-ma、-ta等结尾的名词,性别由所指的人或物决定,如 el/la pianista(男/女额琴家)。 。一些来源於希腺疆的名,以-a结尾但是阳性的,如eldia(这一天)、 elmapa(地图)。 。少數名词的性别需要記憧,如elagua(水)是险性的,lamano(手)是隆 性的。 。邀有一些名,管有院阳性之分,但意思相同,如elmar/La mar(海 洋)。 。西語名词分為阳性和性雨種性别。 。通常,以-0结尾的名是阳性的,以-a结尾的名词是性的。如 libro(吾)是陽性名词,casa(房子)是降性名词。 。但也有一些特殊情况:

2.数十

el regimen(政耀)-los regimenes el espécimen(核本)→ los especimenes mani(花生)→ manies autobus(公共汽車)→ autobuses fax{傅真)-faxes o sandwich(三明治) sandwiches 。lapiz(始筆)→lapices 。西語名铜有單数和覆数之分。 。一服情况下,名尾加-s成數形式,如libro→libros,casa → casas, 。如果名词尾是重音-1、-u,或以-5、-X、-ch、-z结尾,覆数形式需 要加-es,如: 。少数名词的單福数形式不规则,需要特别記憶,如: 。一些數名胡表示一個整體概念,如gafas(眼)、pantalones( 子)、tijeras(剪刀)等,勐铜用單数形式。

二、形容词

1.性数配合

。通常放在名词後,表示客截描述,如uncocherojo(一红色的車)。 。放在名词前,表示主戳感受或强,如unbuenamigo(一個好朋友)、un gran éxito(一個巨大的成功)。 。有些形容前後位置意教不同,如un pobre hombre(一個可模的男人) 和un hombre pobre(一個舅男人)。 alto/alta(高的,单数阳性/性) altos/altas(高的,数性/性) 。形容词需要與它所修静的名词在性和数上保持一致, 。韬大多数形容可以通退改尾-0/-a和加-5来表示性数的化, 如: 。少数形容只有一個形式,不籍性数化,如grande(大的)、joven(年轻 的)、feliz(幸福的)等。 。形容词在名词前後位置的區别:

2.比较级和最亮级

oMaria es la mas inteligente de la clase.(瑪亞是班上最 明的。) 。 Estos son Los menos caros del mercado.(些是市场上最便宜 的。) 。Juan es mas alto que Pedro.(胡安比氟德高。) 。Este libro es menos interesante que aquel.(本害有那本 書有趣。) 。比较级用mas/menos+形容+que橘成,如: 。最高级用el/la/los/las+mas/menos+形容词成,如: 。一些常見的形容词有特殊的比较级和最高级形式: 最高级 原级 比较级 mejor(更好的) el/la mejor(最好的) bueno(好的) mal.o(堰的) peor(更嘎的) el/la peor(最壤的) grande(大的) mayor(更大的) el/la mayor(最大的) pequeno(小的) menor(更小的) el/La menor(最小的)

三、代韵

1.人稠代

  • 人柄代铜按主格和置格分類:

资格 人 主格 實格 yo(我)

第一人單數

第一人稿单数

me(我)

第二人柄單(非正

te(你) tu(你) 式) usted(您) lo/la(您)

第二人柄单数(正式)

éL(他) lo(他)/la(她)

第三人稿单数

ella(她)

第一人

nosotros/as(我) nos(我仍)

第二人稠数(非正

D5(你們) vosotros/as(你們) 式) los/Las(忽們) ustedes(您們)

第二人科復數(正式)

los(他們)/las(她 el.los/as(他个/她

第三人福数

們) 們)

  • 人稠代词必须勤词人稠相一致。

  • 主格人代词通常可以省略,因為融签位已经表明了主語。但為强調或避

免歧義時,需使用主格人稀代词。

2.物主代韵

  • 物主代铜分為形容性和名词性雨種:

人稠 形容铜性 名性

第一人單数

mi(我的) mio/a(我的)

第二人單数(非

tu(你的) tuyo/a(你的) 正式)

第二人稀單数(正

Su(您的) suyo/a(您的) 式) ≥//)/ons su(他的/她的/它的)

第三人单数

的》

第一人稠被数

nuestro/a(我們的) nuestro/a(我竹的)

第二人稀梅数(非

vuestro/a(你們的) vuestro/a(你的) 正式)

第二人復数(正

su(您們的) suyo/a(您何的) /// su(他們的/她們的/

第三人科数

它們的) 它們的)

  • 形容铜性物主代韵需要舆名韵性数配合,放在名前。

  • 名性物主代词的性数與所指代的名词一致,亚可以單测使用。

3.反身代O

  • 反身代词表示勤作的主語和寶語是同一個人或物:

人和 反身代韵

第一人柄單

me(我自己)

第二人稿单数(非正式)

te(你自己)

第二人柄單数(正式)

se(您自己/他自己/她自己/它自己)

第三人單数

第一人稠復数

nos(我們自己)

第二人福數(非正式)

05(你們自己)

第二人稠数(正式)

se(您們自己/他們自己/她们自己/它们自己)

第三人积復数

  • 反身代铜放在動前,但用肯定命令式時放在勤词後,亚與勤词速富。

4.指示代词

  • 指示代词用於指示人或事物,按距雕分為三種:

隔性單 陪性单 隔性復数 距雕 数 esta 近(这) estas sesa 中(那,零近舱話者) esa e505 遗(那,遠離说话人和聘話 aquella [anbe 者) a

  • 指示代词的性数要奥所指代的名词一致。

  • 指示代铜可以用在名词前作定語,也可以單强使用作主語或寶語。

5.疑同代司?

  • 常見的疑问代词包括:

疑同代润 用法 Que quieres?(你想要什?) qué(什磨) Quien es él?(他是锥?) quién/quienes () Cual prefieres?(你喜哪個?) cual/cuales(哪個/ Cuales son tus favoritos?(你最喜数 卿些) 邮些?) cuanto/a/os/as(多 Cuantos anos tienes?(你多大了?) 少) Cuanta azucar quieres?(你要多少糖?) De donde eres?(你是哪狸人?) donde(哪祖) Como estas?(你好?) como(怎楼) Cuando es tu cumpleanios?(你的生日是 cuando(什磨時候) 什磨時候?) Por que estudias espaniol?(你為什磨 por que(為什度) 學西班牙語?)

  • 疑问代词放在句首,引導疑間句或感噪句。在疑間句中,勤词直接跟在疑代

铜後面。

6.關係代°

  • 常見的係代韵有:

關係代前 El libro que estoy leyendo es interesant que e.(我正在的道本需很有趣。) La chica con quien hablé es simpatica.(我 quien/qui 與之交谈的那個女孩很友好。) Los alumnos quienes aprobaron el examen e enes stan contentos.(通通考試的生都很高興。) El que 1lego tarde es mi hermano.(逐到的那 el/la/lo 個人是我哥哥。) s/las que Los que studies mas aprobaran el examen. (學留更多的人通逼考试,) El problema sobre el cual discutimos es i el/la/lo mportante.(我們时输的個同题很重要。) [en3 Lo cual me sorprendio fue su reaccion.(镶 我感到的是他的反属。)

  • 舅係代词的性数要奥先行词保持一致。

  • 在句中,期代承一定的語法功能,如主語、直接實、周接资語或介

柯實語等。 以上就是西班牙語中名、形容和代铜这三因重要词類的群细介绍。通退深入了 解它們的性數嬰化、代词分類和用法,以及一些特殊情况和注意事项,相信你已經對 這些語法點有了更全面、更透徹的識。在實際運用中,記住要注意名和形容词 的性數配合,代的正確選和位置,以及一些特殊用法。 如果你在學習過程中遇到任何問题,或者想分享你的學習心得,歡迎在區留言讨 。镶我們共同進步,一起享受西語學習的樂趣!山

西班牙語·目录三 <上一篇 下一篇> 跟我一起學西語:簡單現在完成時&簡單 跟我一起學西語:連接、介、冠解

  • 例句

過去時大揭秘&月份的由来

原始排版图

跟我一起學西語: 名詞、形容詞、代詞:微信公众号导出原始排版图

跟我一起學西語: 連接詞、介詞、冠詞詳解+例句

· 閱讀時間約 4 分鐘
w0x7ce
MySelf

发布于 2024-11-02 21:00:34(微信公众号导出记录)。

本文来自公众号后台的“导出文章内容”功能。博客正文由导出长图进行本地 OCR 转写,并保留原始排版图用于逐段核对。

原文链接:查看原文

OCR 转写有效文字约 2402 字;代码、流程图和版式以文末原始排版图为准。

正文(本地 OCR 转写)

跟我一起學西語:連接词、介词、冠解+例句 original w6x7ce EI V1ajero 2824年11月2日 21:81 广东

一、速接:

1."y”(和):

  • Estudioespanoly chino.(我学留西班牙語和中文。)

  • I study Spanish and Chinese.

2.“o”(或者):

Prefieres caféote?(你喜歡嗽啡還是茶?)

  • Do you prefer coffee or tea?

3."pero*(但是):

  • Me gusta el futbol,pero no sé jugar bien.(我喜数足球,但是

不會踢得很好。)

  • I like football, but I don't know how to play well.

4.“sino*(而是):

  • No es un pajaro,sino un avion.(不是息,而是飛機。)+

  • It's not a bird, but rather a plane.

5.“porque”(因為):

Estudio mucho porque quiero aprobar el examen.(我用功學是 因為想通遇考試。)

  • I study hard because I want to pass the exam.

6."asi que”(所以):

  • Perdi mi billete,asi que no pude viajar.(我丢失了車票,所以

没能成行。)

  • I lost my ticket, so I couldn't travel.

7."cuando”(當...時):

  • Leo un libro cuando tengo tiempo libre.(我有空的時候會看

(旱

  • I read a book when I have free time.

8."aunque”(催管):

Aunque Llueve,voy a salir.(管下雨,我逻是要出門。)

  • Although it's raining, I'm going out.

9.“mientras”(当...的時候):

  • Escucho musica mientras cocino.(我做贩的時候音。)Q

I listen to music while I cook.

二、介铜:

1.“a”(到/在):

  • Voy ala escuela.(我去學校。)

'1oous 01 o 1 -

2.“de”(徙/的):

  • Soy de China.(我来自中国。)

  • I am from China.

3.“en”(在):

Vivoen Espania.(我住在西班牙。)

  • I live in Spain.

4.“por”(由於/通退):

Viajo por trabajo.(我因工作出差。) I travel for work.

5."para*(為了):

Estudioparamifuturo.(我為了自己的未来而學窖。)

  • I study for my future.

6.“con°(和):

  • Voy al cine con mis amigos.(我和朋友一起去看霉影。)显

I go to the cinema with my friends.

7.“sin"(浚有):

Nopuedo vivir sin musica.(没有音嫌我無法生活。)

  • I can't live without music.

8.“sobre”(在...之上):

  • El libro esta sobre la mesa.(晋在桌子上。)桌

  • The book is on the table.

9.“bajo”(在...下面):

  • Elgato duerme bajola cama.(睡在床底下。)

  • The cat sleeps under the bed.

10.“desde"():

Trabajo desdelasnueve.(我徙9點開始工作。) I work from nine o'clock.

11.“hasta"(直到):

  • Me quedo hasta mahiana.(我待到明天。)

  • I stay until tomorrow.

12.“entre"(在...之間):

  • La reunion es entre las dos y las tres.(曹在2點到3點之

周.1

  • The meeting is between two and three o′clock.

三、冠铜:

1.定冠詢:

"el”(阳性单数):

  • Elperro es grande.(狗很大。)景景

  • The dog is big.

"la”(陰性單数): La casa esbonita.(这房子很漂亮。)

  • The house is beautiful.

“Los”{隔性覆数): Los ninios juegan en el parque,(孩子們在公玩耍。)

  • The children play in the park.

"las"(降性覆数): Lasflores son coloridas,(些花很色彩鲜。)

  • The flowers are colorful.

2.不定冠词:

“un”(阳性单数): Tengouncoche,(我有一辆車。) I have a car.

“una”(性单數):

  • Quierouna manzana.(我想要一個颈果。)

  • I want an apple.

“unos”(赐性複數): He comprado unos libros.(我買了一些書,) I have bought some books.

“unas”(院性覆数): Necesito unas tijeras.(我需要把剪刀。)

  • I need some scissors.

西班牙語·目景 下一需·跟我一起學西籍:名钢、形容,代>

原始排版图

跟我一起學西語: 連接詞、介詞、冠詞詳解+例句:微信公众号导出原始排版图

HDLBits系列入门题目 详解之 Modules: Hierarchy(模块的层次结构)

· 閱讀時間約 7 分鐘
w0x7ce
MySelf

发布于 2024-09-24 21:15:37(微信公众号导出记录)。

本文来自公众号后台的“导出文章内容”功能。博客正文由导出长图进行本地 OCR 转写,并保留原始排版图用于逐段核对。

原文链接:查看原文

OCR 转写有效文字约 4199 字;代码、流程图和版式以文末原始排版图为准。

正文(本地 OCR 转写)

的层次结构) eEI V1ajero2024年9月24日21:15美国 Module NOTE 设计一个顶层模块,在其中实例化一个名为mod_的子模块。将顶层模块的三个端口、 b和out分别连接到子模块mod_a的三个端口1n1、1n2和out。可以尝试两种 方式连接信号到模块端口:

1.按端口位置连接:

nod_a instancel (a, b, out);

2.按端口名称连接:

nod a instance2 (.in1(a),.in2(b),.out(out)); 这两种方式都可以正确地实现模块的实例化和连接。 module top_module Instantiate one instance of mod_a Make three connections output wire out out input wire top_module Solution nodule top module ( input a, input b, output out ): nod_a instance1 ( in1(a), -in2(b), ,out(out) ); endnodule

Module_pos NOTE 在顶层模映top_moduLe中实例化模块mod_a,并按蓬口位置的顺序将其连接到顶层模块的 端口上。 module top_nodule Instantiate a module mod_a zno 'lino ndano input a, b, out2 top_module Solution nodule top_modulc ( input b, 1nput d, output out2 ) ; nod a instancel ( outl, out2, a, b, c, d ); endnodule

Module name NOTE 在顶层模块top_moduLe中实例化模块mod_a,并按照端口名称的对应关系连接到顶层模块 T口 module top_module

zino'iino ndano input a, b, out2 top_module Solution nodule top_module ( input b, input d, output out1, output out2 nod_a instance1 ( ,out1(outl),out2(out2), in1(a) ,。 -in2(b),.in3(c), -in4(d) 1: endnodule

L

Mismatch Module shift NOTE 实例化三个my_dff 模块,并将它们患联超来形成一个长度为3的移位寄存器。每个实例的 clk口都需要连接到同一个时钟信号。 nodule top_nodule Instantiate 3 moduiles and wires my_dff input clk, output q top_module Solution nodule top_module ( Lnput clk, input d, output q ); vire q1, q2; my_dff d1 ( .ctk(clk), d(d), -q(q1) ); ny_dff d3 ( -clk(c1k),.d(q2), -q(q) ); endnodule

Module shift8 NOTE 实例化三个my_dff8模块,将它们半联形成一个8位宽、3级深的移位寄存器。同时,我们 需要设计一个4选1的多路复用器,根据sel[1:0]的值选择输出从输入d经过9到3 个时特网期的延退值。 otnpcudo1 otnpou

input clk, top_module Solution )onpou do1 anpou 1nput clk, ‘p[o:] 1ndu] input [1:e] scl, b[e:1 1nd1no : ( wire [7:e] q1, q2, q3; my_dff8 d1 ( .clk(cik), .d(d), -q(q1) ); my_dff8 d3 ( .clk(clk), d(q2), q(q3) ); always @() bcgin case(sel) :p = b :00q.z 2b01: q = q1; 2’b11: q = q3:; endcase end endnodule

XXbXXeXXX3

Module_add NOTE 需要实例化两个add16模块来实现一个32位加法器。第一个add16模块计算低16位的 加法结果,第二个add16模块计算高16位的加法结果,并接收第一个加法器的进位输出。 add16 cin [osL]e 32 sum[15:0] b[15:0] 3no3 add16 cin a[15:0] sum[15:0] b[15:0] cout top_module Solution nodule add1( input a, b, cin, c1n, putput sun, cout 7 F assign sun = a ^ b ^ cin; endnodule )anpoa do1 anpou input [31:0] b, uns[g:tE]ndno ) ; wire cout_low; add16 low(a[15:0], b[15:a] , 1*be, sum[15:0]。 cout_low); add16 high(a[31:16] , b[31:16], cout_lov, sun[31:16] . ); endnodule

1X X2c1 2 X1X2X3XmFX10000X3c0 0 X1X2X3XffX100003cc0 SUm

Module_fadd NOTE 创建一个具有两级层次结构的电路。顶层模块top_module将实例化两个add16模块,而每 个add16模块又将实例化16个add1模块。因此,我们塞要实现两个模块:top_nodule 和 addl。 两个add16模块,一个计算低 16位的加法结果,另一个计算高16位的加法结果。两个 add16模块之间通过Lower_cout进位输出连接,以实现32位加法。最后,我们将两个 add16硬块的辅出拼接起来,赋值给顶层模块的sun 输出端口。通过这种方式,实现了一个 32位加法器,由两个级联的add16模块组成,每个add16 模块又由16个addl全加器 模块构成。 top_module mnodule top_module x1 add16 cin nodule add16 x2 add1 cin module add1 x32 no add1 cin sum add1 cin Sum cout

SUm 9ppe a[15:0] [o:s L]wns b[15:0] cout

Solution nodule add1( input a, b, cin, output sun, cout 7 ; = uns uftsse cin; assign cout = (o & b) 1 (cin 5 (a ^ b)); endnodule nodule top_rodulc( 1nput [31:0] a, ‘q[0:te] 1ndu] output [31:0] sum 7 wire cout_low; add16 low(a[15:0], b[15:9] , 1'be, sum[15:0] , cout_low); add16 high(a[31:16] , b[31:16] , cout_lov, sun[31:161, ); endnodule 0 1 U 3 4X6XfFX10000 X2X ] 1X4X6XffX10000 sum 0 Mismatch: Module_cseladd NOTE 实现一个 32位的 carry-select 加法器,它由三个 add16 模块和一个 16位 2 选1 多路复用器组成。 add16 cin a[15:0] sum[15:0] b[15:0] cout add16 cin a[15:0] sum[15:0] b[15:0] cout [31:16] add16 cin a[15:0] sum[15:0] [0sL]uns b[15:0] top_module cout Solution module top_module( input [31:0] b, output [31:0] sum wire cout_low, cout_higho, cout_highl; wire [15:0] sum_high0, sum_high1; add16 low(a[15:0], b[15:0], 1'b0, sum[15:0], cout_low); add16 high0(a[31:16], b[31:16], 1'b0, sum_highe, cout_high0) ; add16 high1(a[31:16], b[31:16], 1'b1, sum_high1, cout_high1) ; assign sum[31:16] = cout_low ? sum_high1 : sum_high0; 13 endmodule 0 1 X2ccc1 1 2 0 1 3ccc0 10000 2 册 sum 3 1 ] 10000 sum fff 0 1 2 3 3ccc0 Mismatch: 15 20 25 10 Module addsub NOTE 实现一个32位的加减法器,它由两个add16模块和一个32位的异或门组成。 sub add16 cin a[15:0] 32 sum[15:0] b[15:0] cout sub sum add16 cin a[15:0] [31-16] sum[15:0] b[15:0] cout top_module Solution module top_module( input [31:0] a, input sub, output [31:0] sum wire [31:0] b_xor; wire cout_low; assign b_xor =b ^{32{sub}}; 1 add16 low(a[15:0], b_xor[15:0], sub, sum[15:0], cout_low); add16 high(a[31:16], b_xor[31:16], cout_low, sum[31:16], ) ; endmodule fff 10000 ff 1 sub 10000 le ff sum D 0 sum 10000 fff fe 0 0 1 2 Mismatch:

FPGA·目录三 <上一篇·HDLBits系列入门题目详解之Vector

原始排版图

HDLBits系列入门题目 详解之  Modules: Hierarchy(模块的层次结构):微信公众号导出原始排版图

HDLBits 系列入门题目详解之 Vector

· 閱讀時間約 11 分鐘
w0x7ce
MySelf

发布于 2024-09-23 21:37:00(微信公众号导出记录)。

本文来自公众号后台的“导出文章内容”功能。博客正文由导出长图进行本地 OCR 转写,并保留原始排版图用于逐段核对。

原文链接:查看原文

OCR 转写有效文字约 5480 字;代码、流程图和版式以文末原始排版图为准。

正文(本地 OCR 转写)

Vectoro Question 向量是用来将相关的信号组合成一个名移,以便更方便地对它们进行操作。例如,wire[7:3] w:这行代码声明了一个名为W的8位向量,它的功能等同于有8条独立的线路。 需要注意的是,在声明向量时,尺寸(dimensions)是放在向量名称的前面的,这与C语言的 语法有所不同。但是,在部分选择(part-select)时,尺寸会放在向量名称的后面,这是符合 预期的语法。 例如,wire[99:B]ny_vector:声明了一个 108 元素的向量。然后可以用my_vector[1

0)选择向量中的第11个元素(下标从0开始)。

解决这个具体的题目: 位输出。要求将输出oH连接到输入向量的第0位,01连接到第1位,依此类推。 在电路图中,每一个向量(或“总线”)旁边的短竖线和数字表示该向量的宽度,而不是为每一位 都面一根线。这样的表示方式更加简洁明了。 outv output [2:0] outv input[2:e]vec 02 01 output 02, o1,00 00 top_module Solution nodule top_nodule ( output wire [2:0] outv, ‘o a 1nd1na output wire 00 //将输入向量直接激值给输出向量 assign outv = vec; //将向量的各个位分别值始单独的输出 assign ol = vec[1]; endnodule Vectorl NOTE

1.向量的声明向量用于将相关的信号组含成一个名称,以使更方便地操作它们声明一个向量

的语法如下: type [upper:lower] vector_name; type指定向量的数据类型,通常是vire或reg。如果是声明输人或输出端口,type还 可以包含端口炎型(如input或uutput)。例如: vire [7:8] w; //8位wire 向量 reg [4:1] ×; output reg [9:0] y; // 1 但 reg 输出向量 input wire[3:-2]z;//6位wire 输入向量(负数范围也是允许的) 向量的大小端序[endanness)指的是最低有效位是否有更低的索引l(小端,如[3:e])或更 高的索引(大端,如[0:3])。在Verilog中,一旦一个向量被声明为某种大小端序,就必须

一直保持一致。

2.隐式网络隐式网络是一个常见的bug来源。在Verilog中,信号类型的网络可能会

被assign语句或末声明的模决端口式创建。式网络永远是1位宽的wire,如果你本 来打算使用一个向量,这可能会导致bug。可以使用defauLt_nettype none指令禁用隐式 网络的创建。

3.非紧凑数组VS,紧凑数组在向量声明中,尺寸索引是放在向量名称的前面的。这声明了致

组的”紧凑“维度,即位被”紧凑”在一起成为一个整体(这在模拟器中很重要,但在硬件中不太相 关)。“非紧凑“维度则是在名移之后声明的,通常用于声明存储卷数组。由于ECE253课程没有 涉及存储器数组,我们也没有在这里使用过餐淡数组。

4.向量元素访间:部分选择可以使用向量名移访问整个向量:

assign w = a; 这会将4位向量a完整地值给8位向量《假设之前有相应的声明)。如果左右两边的 长度不匹配,会进行适当的零扩展或藏断。 还可以使用“部分选择“运算符访问向量的某些位: //只访问w的低4位 [3:8] /...也是x的最低位 ×[1:1] 4 z[ -1: -2] //访间z的两个最低位 //非法,向量部分选择必须与惠明方向一致 b[3:0] b[0:3] //访问b的高4 位(大避序) assign w[3:8]=b[0:3]:// 将b的高 4 位赋值给 w的低 4 位 Solution nodule top_nodule( input wire [15:θ] in, output vire [7:] out_hi, outp 4 assign out_hi = in[15:8]: //将输人的低8位聚值给oul_10 assign out_lo = in[7:0]; endnodule

ct_24X(9 X[的5 X12 XXs3X aX±c5 aX

Vector2 NOTE

一个32位的向量可以被视为包含4个字节(比特位[31:24]、[23:16]等)。请构建一个

电路,可以反转这个4字节词的字节顺序。 AaaaaaaaBbbbbbbbCcccccccDddddddd => DdddddddCcccccccBbbbbbbbAaaaaaaa 这种字节顺序反转的操作在需要交换数据的大小端模式时经常用到,比如在小端模式的x86系 统和许多互联网协议使用的大端格式之间进行转换。 梗块byte_reverse_32bit( 输入 wire [31:0] 1n, 输出 wire [31:e] out 聚值 out = {in[7:a]。 in[15:B], in[23:16], in[31:24]}; endnodule 这个Ver1log 模块名为byte_reverse_32bit,它有一个32位的输人向量in,通过一 个签单的Verilog连接操作将其字节颠序反转,并输出到32位的out向量中。 具体来说,[1n[7:0],1n[15:8].1n[23:16],1n[31:24]}这行代码将 1n向量中的 4 个字节按照从低到高的期序重新组合起来,形成了新的32位向量oul。 这种字节顺序反转的电路在需要进行大小端转换的场景中非常有用,比如在小端x86系统和大 端互联网协议之间进行数据交换时。 Solution nodule top_module( input [31:e] in, output [31:0] out );// ass1gn out[31:24] - 1n[7:0]; a5sign out[15:8] = in[23:16]; endnodule n12153524c065e81B484d509b10583760 46dd28465 893752123301 24351512815e09c09d6404636051d7b600319d466584c22125237891e3300

Vectorgates NOTE 这个电路需要有两个3位的输入,然后计算以下三个结果: L.两个向量的按位”或“(bitwise-OR)

2.两个向量的逻辑”或“(logical-OR)

3.两个向量的取反(NOT)

其中,将b向量的取反放在outnat的高3位(即[5:3]).将a向量的取反放在低 3 位(即 [2:0])。 对于两个N位的向量进行“按位“运算,会把运算应用到每一位上,产生一个N位的输出。 而“逻错“运算则是把整个向量作为一个布尔值(非零为真,零为假),产生一个1位的输出。 我们可以通过仿真波形图来观察一下“按位或“和“逻辑或”之间的差异。 >output [2:8] out_or_bitwise out_or_bitw1se input [2:θ] a, b out_or_logjcal tetbotJo"4no 4ndano out_not top_module Solution nodule top_nodute( ‘g[g:z] ndu1 input [2:e] b, output [2:e] out_or_bitwise, putput aut_or_logical, 1ouμno [e=s] 4ndno ) : //按位或 q 1e = osatqJono usse //逻辑或 assign out_or_logical = |a 1l Ib; //反转 assign out_not[5:3] = ~b; endnodule

Gates4 NOTE

四输入的组合电路。

这个电路有以下三个输出: L.out_and:4个输人的“与"(AND)门输出

2.out_or:4个输入的“或“(0R)门输出

3.out_xor:4个输人的"异或”(XOR)门输出

Solution nodule top_module( 1nput [3:0] 1n, output out_and, output out_xor ); assign out_and = E // 等价于 in[3] & in[2] & in[1]& in[] []u[π]u[z]u [ε]u ±θ鲁 // u1= oxμno ufss endnodule

pueno out_or out_xor out_or out_xor

Vector3 NOTE 关于向量拼接和分割的题目。 向量拼接运算使用{a,b,c)这种语法,将多个较小的向量拼接起来创建一个更大的向量。比 如: {3b111, 3'bege) => 6'b111999 L0101q.5 <= {t0tq.e *eq.1 '1q.T) {4°ha, 4′d18} => 8′b101e1919 // 4'ha 和 4'd1e 在二进刚下郁是 4b1e18 在进行拼接运算时,需要明确指定每个分量的宽度,因为这样才能确定最终结果的长度。所 以[1,2,3]这种用法是非法的,会报错。 拼接运算符可以出现在慰值语句的左右两边: uT [e:st] nduT no [e:ez] 1ndno //交换两个字节。左右两边部是16 assign {out[7:8], out[15:8]} = in; //这是等价的。 assign out = {in[7:0], 1n[15:8]}; //这种情况不同。右边的16位向量会很 //匹配左边24位向量的长度,所以out //前两个例子中,out[23:16]没有被 解决这个练习题: 有6个5位的输入向量a、b、C、d、e和f,总共39位输入。需要将它们拼接起来,然 后分割成4个8位的输出向量V、X、y和z,总共32位输出。最终输出应该是输人向量 的拼接,后面跟两个1位。 al blcldlelfhi →→ y Solution nodule top_module ( input [4:e] a, b, c, d, e, f, output [7:0] v, x, y, z //连接所有输入向量和两个1位,然后分配给输出 assign {w, x, y. z} = {a, b, c, d, e, f, 2b11}; endnodule

0 0 X1X0 0 0X1X2X4X8X10X 0 0 0 X124:0X 37b1323383X 0 X1X24810 37132333 Mismatch: Vectorr NOTE 设计这个电路,用于反转8位输人向量的位顺序。 Solution nodule top_nmodule( input [7:e] in, output [7:8]out ) ; assign out = {1n[0], in[1]。 in[2], in[3]。 in[4], 1n[5]. in[6], in[7 endnodule nd

Vector4 NOTE 重复运算符(ReplicationOperator)的使用: num次,并将它们拼接在一 重复运算符 {num{vector}}可以用来重复一个向量 vector num必须是一个常量。大括号是必须的,不能省略。 起。这里

一些例子:

//5′b11111(或5'd31、5'h1f) {5{1'b1}} {2{a,b,c}} //等同于{a,b,c,a,b,c} //9'b101_110_110。前面是101,后面是两个3'b110拼接 {3'd5,{2{3'd6}}} 这种重复运算在一些场景中很有用,比如符号扩展: 当需要将一个小的有符号数扩展到一个更大的位宽时,我们可以通过重复符号位(最高位)来保留 原有的有符号值。 例如,将4'b0101(5)扩展到8位,结果是8'b00000101(5)。将4'b1101(-3)扩展 到8位,结果是8'b11111101(-3)。 需要设计一个电路,将一个8位的数字符号扩展到32位。这需要先重复24次符号位(也就 是重复bit[7]24次),然后再拼接上原来的8位数字。 Solution module top_module ( input [7:0] in, output[31:0] out ); assign out ={{24{in[7]}}, in}; endmodule Vector5 NOTE 给定5个1位的输入信号a、b、c、d和e,请在25位的输出向量out中计 算所有25种可能的成对比较结果。如果被比较的两个位相等,则输出1,否则输出0。 具体而言: out[24] =aa; //a与自己比较,out[24]永远是1 //a与b比较 qe~=[εz]no out[22]=ac; //a与c比较 //e与d比较 out[1]=~e^d;

aaaaabbbbbcccccdddddeeeee XNORabcdeabcdeabcdeabcdeabcde 本 25 comparisons Solution module top_module ( input a, b,c, d,e, output[24:0] out ); wire[4:0] input_vector ={a,b,C,d,e}; assign out = ~({5{input_vector}} ^ {a,a,a,a,a,b,b,b,b,b,c,c,c,c,c endmodule

#FPGA #Verlog FPGA·目录三 <上一篇 下一篇> HDLBits系列入门题目详解之Modules: 高云FPGALinux下调制PWM Hierarchy(模块的层次结构)

原始排版图

HDLBits 系列入门题目详解之 Vector:微信公众号导出原始排版图

海思 星闪SLE hi3863芯片 SDK接口指南

· 閱讀時間約 12 分鐘
w0x7ce
MySelf

发布于 2024-09-09 21:28:10(微信公众号导出记录)。

本文来自公众号后台的“导出文章内容”功能。博客正文由导出长图进行本地 OCR 转写,并保留原始排版图用于逐段核对。

原文链接:查看原文

OCR 转写有效文字约 5939 字;代码、流程图和版式以文末原始排版图为准。

正文(本地 OCR 转写)

originalw6x7ce EI V1ajero 2824年9月9日 21:28 波兰

1.引言

本指南详细介绍了SLE(StarLinkExpress)SDK开放的技术组节,包括基本概念、关键接 口、参敬设置以及与其他无线技术的比较。参考一下链接 W1kiped1a https ://zh. wikipedia org/wik1/%E6%98%9FsE9$97%AA BearPi https://gitee.com/bearpi/bearpi-pico_h3863 海思 https://www.his111con.com/cn/products/connectivity/short-range- IoT/wif1-nearl1nk-ble/H13863V100

2.SLE技术概述

SLE(Star Link Express)是一种专为物联网(IoT)设备设计的低功耗无线通信技术。它 在某些方面类似于蓝牙低功耗(BLE),但具有独特的特性,使其更适合某些IoT应用场景。

2.1 SLE vs 蓝牙 vs Wi-Fi

特性 SLE Wi-Fi 蓝牙低功耗(BLE) 覆盖范 中等到长(可达几百 中等(比BLE稍远) 短(约10-100米) 米) 国 功耗 极低 相对较高 低 数据速 低到中等 高 低 率 网络拓 点对点、星型网络 点对点、广播 星型网络 扑 IoT设备、传感器网可穿戴设备、健康监高速数据传输、视频 主要应 络、智能家居 测、近距离控制 流、网页浏览 用场景 SLE的优势在于它结合了BLE的低功耗特性和Wi-Fi的较强网络能力,使其特别适合幂要长电池 寿命和稳定连接的IoT应用。

3.UART服务器在SLE生态系统中的角色

UART(Universal Asynchronous Receiver/Transmitter)服务器在SLE网络中扮演着 关键角色,它作为SLE网络和传统申行设备之间的桥梁, UART服务器的主要功能包括: L.数据转换:将UART数据格式转换为SLE数据包,反之亦然。

2.协议适配:处理UART和SLE协议之间的差异。

3.缓冲管理:管理效据缓冲,确保数据传输的可性。

1.流控制:在UART和SLE之间实现适当的流控制机制

4.广播数据设置接口

4.1 sle_set_adv_local_name

static uint16_t sle_set_adv_local_nane(uint8_t ×adv_data, uint16_t max 功能描述 此函数用于设置SLE设备的本地名称,该名称将被包含在广插数据中。 参数说明

  • acv_data:指向存情广播数据的缓冲区的指针。

  • max_Len:广播数据缓冲区的显大长度。

返回值 函数返回设置的广措数据长度。 实现细节 L,函数首先打印本地设备名称的长度和内容,用于调试目的。

2.然后,它将设备名称的长度和类型信息写入广播数据缓冲区。

3.使用memcpPy_s函数将实际的设条名称复制到广插数据中。

1.最后,返回设置后的广播数据总长度。

技术考虑

  • 设备名称在SLE网络中用于标识设备,葵似于BLE中的DeviceNane特性。

  • 名称长应受限于广播数据包的最大长度,通常不超过31字节。

  • 在资源受限的设备上,应考虑使用较短的名移以节省空间和能源。

4.2 sle_set_adv_data

static uint16_t sle_set_adv_data(uint8_t *adv_data) 功能描述 此函数用于设置SLE设备的广插微据内容。 参数说明

  • adv_data:指向存储广摄数据的缓冲区的指针。

返回值 函数返回设置的广播数据长度。 实现细节 L.设置发现级别(Discovery Level)数据。

2.设置访间模式(Access Mode)效据。

3.使用meTcPy_s函致将这些数据复制到广泄数据缓冲区中。

技术考虑

  • 广播数据的结构和内容直接影响设备的可发现性和连接性。

  • 数据应该经过精心设计,以在有限的空间内提供最有用的信息。

  • 考虑到功耗问题,广插数据应尽可能简洁。

4.3 sle_set_scan_response_data

static uint16_t sle_set_scan_response_data(uint8_t scan_rsp_data) 功能描述 此函数用于设置扫指响应数据的内容,提供额外的设备信息。 参数说明

  • scan_rsp_data:指向存储扫指响应数据的缓冲区的指针。

返回值 函数返回设置的扫措响应数据长度。 实现细节 L.设置发送功率级别(Tx Power Level)数据。

2.调用sle_set_adv_local_nane函数设置本地设备名称。

技术考虑

  • 扫推响应数据提供了一个额外的31字节空间案放置更多设备信息。

  • 这种两阶段的广播机制(广播数据+扫推响应)允许在保持低功耗的同时提供更多设备信

息。

  • 在设计扫描响应数据时,应考虑哪些信息对于潜在的连接设备显有用。

5.广播参数设置接口

5.1 sle_set_default_announce_param

static int sle_set_default_announce_param(void) 功能描述 此函数用于设置SLE设备的默认广播参数。 返回值 函数返回设置结果,成功返回0,失败返回错误码。 实现细节 函数设置以下参效:

1.广播模式(announce_mode)

?.广播句柄(announce_handle)

3.主副角色(announce_gt_role)

1.广播级别(announce_level)

5.广播通道映射(announce_channel_map)

. 广播间隔(announce_interval_min/max)

7. 连接间隔 ( conn_interval_min/max)

3.最大连接延迟(conn_max_Latency)

3.连接监替超时(conn_supervision_timeout )

3.发送功率(announce_tx_power)

L.本地设备地址(own_addr) 技术考虑

  • 这些参数直接影响设备的功耗、可发现性和连接性能。

  • 参数应根据具体应用场景和设备能力进行优化。

5.2 sle_set_default_announce_data

static int sle_set_default_announcc_data(void) 功能描述 此函数用于设置默认的广播数据和扫描响应数据。 返回值 函数返回设置结果,成功返回ERRCCDE_SLE_SUCCES5,失败返回其他错误码。 实现细节 L.调用sle set acv data设置广播数据。

2.调用sle set scan respnse data 设置扫描响应数据。

3.使用sle_set_announce_data应用设置的数据。

技术考虑

  • 广播数据和扫推响应数据的内容应该互补,共同提供完整的设备信息。

  • 数据内容应根据应用需求进行定制,以优化设备发现和连接过程。

6.回调函数

6.1 sle_announce_enable_cbk

static void sle_announce_enable_cbk(uint3z_t announce_id, errcode_t sta 功能描述 此回调函数在广启用操作完成时被调用。 参数说明

  • announce_id:广播的唯一标识符。

  • status:操作的结果状态。

技术考虑

  • 此回调可用于确认广播是否成功启动,并在必要时采取相应的错误处理措施。

  • 在实际应用中,可以利用此回调来更新用户界面或融发其他系统事件。

6.2 sle_announce_disable_cbk

static void sle_announce_disable_cbk(uint32_t announce_id, errcode_t st. 功能描述 此回调函数在广播禁用操作完成时被调用。 参数说明

  • announce_1d:广播的唯一标识符。

  • status:操作的结果状态,

技术考虑

  • 可用于确认广握是否成功停止,并在必要时进行清理操作或状态更新。

6.3 sle_announce_terminal_cbk

static void sle_announce_terminal_cbk(uint32_t announce_id) 功能描述 此回调函数在广播终止时被调用 参数说明 announcc_id:广播的唯一标识符。 技术考虑

  • 可用于处理意外的广插终止情况,如资源耗尽或系统错误。

  • 在此回调中,应考虑是否需要重新启动广插或通知上层应用。

7.注册回调函数接口

7.1 sle_uart_announce_register_cbks

errcode_t sle_uart_announce_register_cbks(void) 功能描述 此函数用于注册广播相关的回调函数。 返回值 函数返回注册结果,成功返回ERCCDE_SLE_SUCCES5,失败返回其他错误码。 实现细节

1.初始化 sle annaunee seek callbackst结构体。

2.设置启用、禁用和终止回调函数。

3. 调用 sle_anouncc_scek_register_callbacks 注册回调函数。

技术考虑

  • 正确注册回调函数对于管理广播生命周期和处理异常情况至关重要。

  • 在多线程环境中,应确保回调函数的线程安全性。

8.初始化接口

8.1 sle_uart_server_adv_init

crrcode_t sle_uart_scrver_adv_init(void) 功能描述 此函数用于初始化SLE UART服务器的广插功能。 返回值 函数透回初始化结果,成功返回ERRCODE_SLE_5UCCES5,失败透回其他错误码。 实现细节 L.调用 sle set default anaunce paran 设置默认广握参数。

2.调用sle set default_annaunce data设置默认广播数据。

3.调用sle_start_annaunce开始广播。

技术考虑

  • 此函数应在系统启动时调用,以确保广播功能正确初始化。

  • 应检查每个步骤的返回值,以确保初始化过程中没有错误发生。

9.SLE参数详解

9.1广播模式(announce_mode)

广插模式定义了设备在SLE网络中的可见性和连接性。 可选模式包括:

  • 只可被发现

  • 只可被连接

  • 可被发现且可被连接

这些模式影响设备的功耗和安全性。例如,只可被连接模式可能用于已知设备间的安全通信。

9.2广播间隔(announce_interval_min/max)

广播间理定义了连续两次广播包发送之间的时间。

  • 单位:通常为8.625ms的倍数

  • announce_interval_min:最小广播间隔

  • announce_interval_max:最大广播间隔

较短的间隔增加设备被快速发现的概率,但会增加功耗。较长的间隔可以节省电量,但可能延长 设备被发现的时间。

9.3连接间隔(conn_interval_min/max)

连接间障定义了主设备与从设备之间逼信事件的频本。

  • 单位:通需为1.25ms的倍数

  • conn_1nterval_min:最小连接间隔

  • conn_interval_max:最大连接间隔

9.4最大连接延迟(conn_max_latency)

显大连接延退允许从设备在不通知主设备的情况下跳过一定数量的连接事件。

  • 单位:连接事件的次数

较高的延退值可以让从设备在没有数据传输时进入深度睡眠状态,从而节省电量。然而,这也会 增加通信延迟。 技术考虑:

  • 延迟值应根据应用的实时性需求来设置。

  • 对于需要快速响应的应用,应使用较低的延退值。

  • 电池供电的设备可能会受益于较高的延退值,以延长电池寿命。

9.5连接监督超时(conn_supervision_timeout)

连接监督超时定义了在宣告连接丢失之前,允许没有成功通信的最长时间,

  • 单位:通常为18ms的倍数

计算公式:conn supervision timeout>(1+conn_maxlatency)* conn_interval_max 技术考虑:

  • 较长的超时值可以增加连接的稳定性,特别是在信号不稳定的环境中。

  • 过长的超时也可能导致实际断开的连接被维持过久,浪费资源。

  • 在设置这个值时,需要考虑网络的稳定性和应用的容错能力。

9.6发射功率(announce_tx_power)

发射功率决定了设备发送无线信号的强度。

  • 单位:dBm(分贝毫瓦)

技术考虑:

  • 较高的发射功率可以增加通信范围和可靠性,但会显著增加功耗。

  • 较低的发射功率可以节省电量和减少对其他无线设备的干扰,但可能减少通信范围。

  • 发射功率的选择应考虑预期的使用环境(室内/室外,预期的通信距离)和设备的电源能力。

10.SLEUART服务器的实现细节

10.1数据流程

SLEUART服务器的数据流程如下: I.UART接收数据

2.数据缓冲和处理

3.封装为SLE数据包

1.通过SLE协议栈发送

5.接收SLE数据包

5.解析SLE数据包

7.通过UART发送数据

10.2缓冲管理

有效的缓冲管理对于SLEUART服务器的性能至关重要:

  • 使用循环缓冲区来处理UART和SLE之间的数据流。

  • 实现适当的溢出处理机制。

  • 考虑使用双缓冲技术以提高吞吐量。

10.3错误处理

健壮的错误处理机制包括:

  • UART通信错误检测和恢复

  • SLE连接断开处理

  • 缓冲区溢出处理

  • 异常数据包的处理

10.4功耗优化

为了优化SLEUART服务器的功耗:

  • 在空闲时使用低功耗模式

  • 实现动态功率调节

  • 优化数据传输策略,减少不必要的传输

11.与其他无线技术的详细比较

11.1 SLE VS BLE

特性 SLE BLE

2.4 GHz

频段

2.4 GHz

通道数 40 40 GFSK GFSK 调制方式 2 Mbps 最大数据率 2 Mbps (BLE 5.0+) 点对点、星型 网络拓扑 点对点、广播、网状(Mesh) 安全性 128-bit AES 128-bit AES 功耗 极低 低 技术比较:

  • SLE在某些IoT应用中可能比BLE更节能,但具体取决于实现和使用场景。

  • BLE有更广泛的生态系统和设备支持。

  • SLE可能在某些特定应用中提供更优化的性能。

11.2 SLE vs Wi-Fi

特性 SLE Wi-Fi 频段

2.4 GHz

2.4 GHz, 5 GHz, 6 GHz

覆盖范围 中等(-100m) 长(可达300m+) 可达几Gbps 2 Mbps 最大数据率 功耗 极低 中等到高 低 高 网络复杂性 适用场景 低功耗IoT设备 高带宽应用,如视频流 技术比较:

  • SLE更适合电池供电的IoT设备,而Wi-Fi更适合需要高带宽的应用。

  • Wi-Fi提供更长的范围和更高的数据率,但功耗较高。

  • SLE的网络设置和管理通常比Wi-Fi更简单。

#mcu#国产系列#射频

原始排版图

海思  星闪SLE  hi3863芯片 SDK接口指南:微信公众号导出原始排版图

高云FPGA Linux下调制PWM

· 閱讀時間約 9 分鐘
w0x7ce
MySelf

发布于 2024-09-06 20:47:44(微信公众号导出记录)。

本文来自公众号后台的“导出文章内容”功能。博客正文由导出长图进行本地 OCR 转写,并保留原始排版图用于逐段核对。

原文链接:查看原文

OCR 转写有效文字约 6344 字;代码、流程图和版式以文末原始排版图为准。

正文(本地 OCR 转写)

original wex7ce EI V1ajero 2824年9月6日 28:47 波兰

1.引言

本指南提供了FPGAPWM实现的全面分析,特别聚焦于TangNano9K开发板。我们将深人探讨 PWM的理论基础、代码实现、资源利用、频率限制、占空比调节以及在L1nux环境下的开发流 程。

2.PWM基础理论

脉冲宽度调制(PiM)是一种通过调整信号的占空比来控制平均功率的技术。在FPGA中,PWM通 常通过计数器和比较器来实现。

3.FPGA PWM实现

3.1PWM生成器代码

nodule pwm_generator ( 1nput clk, input [6:e] duty_cycle_in [0:3]. // 新增:外部占空比输人 output reg [3:0] pwm_out 7 ; localparan TARGET_FREQ = 100_000; // PkM须率: 100 kHz 1ocalparan CL0CK_FREQ = 27_808_e66; // B时神源率: 27 HHz localparan CoUNT_MAX = CLOCK_FREQ / TARGET_FREQ - 1; reg[7:θ]count=8;//8位计数器,最大值269 reg [6:e] duty_cycle[0:3];// 4个7份占登比额存器,兹国e-100 wlre [7:e] thresh_3 - (couNT_MAx • duty_cycle[2]) / 100; always @(posedge clk) begin count <= (count < CouNT_MAX) ? count + 1 : ; pw_out[0]<= (count < thresh_1]; pw_out[3]<= (count < thresh_4]; //更折占空比 [8]uao<np => [a]a>As<np duty_cycle[1] <= duty_cycle_in[1]: []utaoAs<np => [e]aAs<np pua endnodule

3.2顶层模块实现

nodule uart_loop_back ( input clk,

  • xen ndu

output uart_tx, output [5:e] led, putput [3:e] pun_out, output tine_tx 7 : wire [7:8] rxData; reg txDatavalid; wire txBusy; wire current_bit; reg [6:8] pun_duty_cycles [9:3]; // PMM占空比存储 //UART接收模块实例化 uart_rx #( .DELAY_FRAMES(69)) uart_rx_inst ( .clk(ctk) , .uart_rx(uart_rx), .rxData(rxData), .rxDataVal1d(rx) 1: //UART发送模块实例化 uart_Lx #( -DELAY_FRAMES(69)) uart_Lx_inst ( ,clk(clk), .txData{txData), .txbatavalid(txDatavalid), .txBusy(txBusy),.uart_tx(uart_tx) 1: //PWM生成器实例化 ,clk(clk), .duty_cycle_in( pwm_duty_cycles) , pwtt_out (pwn out) //时间发运器实例化 time_sender #(.CLocK_FREQ(8_eee_eee)) tine_sender_inst ( clk(clk), .uart_tx(tine_tx), ,current_bit(current_bit) reg [7:8] loopback_buffer; always @(posedge clk) begin 1f (rxDataValid) begin loopback_buffer <= rxData; loopback_ready <= 1; //使用接收到的数揭更新PWM占空比 case (rxData[7:6]) 2′b01: pwm_duty_cycles[1] <= rxData[6:8]; 2′b11: pwm_duty_cycles[3] <= rxData[6:] ; endcase end if (loopback_ready && 1txBusy) begin txData <= lopback_buffer; txDatavalid <= 1; Loopback_ready <= 0; end else if (11oopback_ready)1 begin txDataValid <= 0; end led[3:0] <= pMm_out; led[5] <= current_bit; end endnodule

3.3参数计算与配置

L.PWM频率计算: 5 - 1 - 0006 / 0002 - 1 - 0131 / 030 - X10 COUNT_MAX = CL0CK_FREQ / TARGET_FREQ - 1 = 27,080,808 / 168,699 - 1 = 265 .占空比计算: thresh_x = (CouNT_MAX + duty_cycle[x]) / 100

3.4FPGA PWM的频率限制

为什么频率不能过低: L.资源占用增加:低频PWM需要更大的计数器,这直接影响FPGA资源的使用、例如,对于1Hz 的PWM领率和27MHz的时钟: COUNT_MAX - 27,068,600 / 1 - 1 - 26,999,999 这需要一个25位的计数器,相比于180kHzPWM的8位计数器,使用了更多的触发器和逻辑 资源。 具体影响:

  • 更多的触发器(FLip-FLops)用于实现大计数器

  • 更复杂的比较逻辑,需要更多的LUT资源

  • 可能需要使用块RAM来存储大型查找表(用于复杂的占空比计算)

2.定时精度:低频PwM在高速时钟下可能导致jitter增加,影响输出信号的稳定性。

3.响应时间:低频PWM会增加系统响应时间,不适合需要快速反应的应用。

为什么频率不能过高: L.时序限制:FPGA有最大时钟频率限制,过高的PWM频率可能违反时序要求

2.信号完整性:高频PM信号更容易受到噪声和干扰的影响

3.功耗增加:高频切换会增加动态功耗、

3.5占空比调节

在本设计中,占空比通过以下方式调节: L.顶层模块(uart_Loop_back)中定义了pun_duty_cycLes 数组来存储各个PwM通道的占 空比值。

2.通过UART接收的数据来更新占空比:

case (rxData[7:6]] 2'b1e: pwm_duty_cycles[2] c- rxata[6:0] ; endcase 这允许通过串口动态调整每个PMM通道的占空比

3.更新后的占空比值传递给PWM生成器模块:

pMm_generator pMm_gen [ .clk(clk), .duty_cycle_in( pmn_duty_cycles).

  • Pem_out(pon aut)

1.在PWM生成器内部,占空比值用于计算比较阅值:

wire [7:e] thresh_1 = (couNT_HAx * duty_cycle[e]) / 100; 这种设计允许灵活且动态地调整PnM的占空比,同时保持了模块化的结构。

4.Linux环境下的TangNano9K开发流程

4.1环境准备

L,安装依赖: sudo apt-get install build-essential clang bison flex libreadline-dev gawk tcl-dev lihffi-dev git graphviz xdot pkg-confic python3 libboost-systen-dev libboost-python-dev
Aop-6ta1nz ap-wasAsa1t-1so0qg1 ?.克隆并编译Yosys: git clone https=//github.con/YesysHQ/yosys.git cd yo5ys make -1$(nproc)

3.克隆并编译nextpnr-gowin:

git clane https://github-con/YosysHQ/nextpnr.git cd nextpnr cnake -DARCH=goMin -DGOWIN_BBA_EXECUTABLE=/usr/local/bin/gowin_bba (ooudu)s[- ayeu 1letsut axeu opns cd ..

1.安装OpenFPGALoader:

git clone https=//github.con/trabucayre/openFPGALcader.git cd openFPGALoader mkdir build &6 cd build cnake (odu)s[- aou llersut ayeu opns cd ....

4.2项目结构

uart_loophack/ —1inpl/ I= src/ —— pw_generator. v T time_sender.v |——uart_loopback.cst uart_tx v I—— 9k_uart_loopback,gprj I Linux_conplie.nd . 2 L- README_cn.nd

4.3约束文件(uart_Loopback.cst)

I0_L0c "clk" 52; I0 PORT "clk* PULL_MODE=UP; t .[9]p. 0noI I0_L0c "led[1]* 11; I0_L0C "led[2]* 13;

  • [ [≤]p

"led[4]* 15; I0_L0C gt .[s1pa1 10_L0C tx4uen. I0_PORT "uart_tx* IO_TYPE=LVCNOS33; "uart rx* 18; I0 L0C IO_PORT "uart_rx* IO_TYPE=LVCMO533; sz[0]anound I0_LOC

1.3

ccsoA7=3dl 0I [al1no md., Iaod 0I I0_L0C 92 -[t]4no umd. 16 "pw_out[2] 27; I0_L0C I0_PORT "pwm_out[2]* I0_TYPE=LVCH0533; I0_LOC "pwm_out[3]* 28; 67 ccso7=3dl oI [c11no md. Iaod 0I :0E ,x>= I0_L0C I0_PORT "tine_tx* I0_TYPE=LVCM0S33;

4.4编译流程

1.综合:

yosys -p read_verilog src/.v; synth_gowin -top uart_loop_back -json inf .布局布线: nextpnr-govin --1son impl/uart_loopback. 1son --freq 27 --write Impl/uart,

3.生成比特流:

2s[ Jud yoeqdoo1 1uen/1duT s,*yoeqdoon 1Jen/ldut 0- 26-NTNo p- yoed utMob

1.烧录FPGA:

openFPGALoader -b tangnano9k -f 1mol/uart_loopback.fs

5.性能分析与优化

5.1资源利用分析

基于编译日志,我们可以分析资源利用信况: Sunnary Nunber of LUT4s: 566 LE6 194 Nunber of DFFs: 79 14 Nunber of HUX2_LUT6: 5 Nunber of HUX2_LUTB: 这些微据表明: L.LUT利用适中,表明逻辑复杂度合理。

2.DFF数量较少,主要用于状态存储和同步。

3.存在一些复杂的多路选择逐辑(MUX2_LUT5到MUX2_LUT8),这可能是由于PkM通道的多路

复用和占空比调节逻输造成的。

1.ALU的使用量较大(937个),这可能是由于PWM阅值计算和UART通信逻辑引起的。可以考

虑使用查找表(LUT)来优化一些常用的计算结果,以减少ALU使用。

5.2时序分析

基于编译日志: Max frequency for clock pwm_gen.clk: 34.62 MHz (PAS5 at 27.ee MHz)

  • > posedge pwm_gen.c1k: 2,72 ns

Max delay <async> Hax delay posedge pvn_gen.clk -> <async> : 9.56 ns 这表明: L.设计在27MHz时钟下有足够的时序裕度,最高可支持到34.62MHz。

2.存在一些异步路径,特别是从时钟到异步输出的9.56ns延迟,可能需要进一步优化。

5.3优化策略

1.时钟管理:

  • 考虑使用FPGA的PLL资源生成更精确的时钟。

  • 对于不同功能模块(如PWM和UART),可以使用不同的时钟域以优化性能。

.流水线化:

  • 对于PwM阔值计算等复杂逐辑,考虑增加流水线stages以提高最大可能频率。

  • 示例:

reg [7:0] thresh teip: reg [3:e] pmn_out_tenp: always o(posedge clk) begin thresh_tenp <= (couNT_MAx * duty_cycle[e] / 1ee; pwm_out_templo] <= (count < thresh_temp); pwn out[e] c= pwn_out_tenp[0]; end

3.资源共享:

  • 对于多通道PMM,考虑时分复用技术。例如,使用一个高频计数器和比较器,通过多路复

用器输出到不同通道。

  • 示例:

rcg [1:e] channol_select = θ; always @(posedge clk) begin channel_select s= channel _select + 1; 2'boe: pum_out[e] <= (count < thresh_1); 2'bll: pum_out[3] <= (count < thresh_4); endcase end 10

1.预计算:

  • 对于固定或较少变化的参数,使用查找表代替实时计算。

  • 示例:

reg [7:0] duty_to_thresh [0:100]; initial begin for (int i = 0; i <= 100; i++) begin duty_to_thresh[i] =(coUNT_MAX * i) / 100; end wire [7:0] thresh_1 = duty_to_thresh[duty_cycle[o]];

5.异步路径优化:

  • 检查并优化长延迟的异步路径,可能需要增加寄存器stages来分割长路径。

  • 确保关键信号使用专用的全局时钟网络。

5.占空比调节优化:

  • 考虑使用增量式调节而不是直接赋值,可以减少大幅度变化带来的瞬态影响。

  • 示例:

always @(posedge clk) begin if (duty_cycle[0] < target_duty[0])

  • [o]ao<n => [o]aon

else if (duty_cycle[o] > target_duty[o])

  • [o]an => [o]an

end

FPGA·目录三 <上一篇 下一篇> HDLBits系列入门题目详解之Vector FPGA design a UART Loopback System

原始排版图

高云FPGA Linux下调制PWM:微信公众号导出原始排版图

FPGA design a UART Loopback System

· 閱讀時間約 12 分鐘
w0x7ce
MySelf

发布于 2024-09-05 21:40:27(微信公众号导出记录)。

本文来自公众号后台的“导出文章内容”功能。博客正文由导出长图进行本地 OCR 转写,并保留原始排版图用于逐段核对。

原文链接:查看原文

OCR 转写有效文字约 5655 字;代码、流程图和版式以文末原始排版图为准。

正文(本地 OCR 转写)

original we×7ce EI V1ajero 2824年9月5日 21:41 波兰

1.背景信息

本项目使用的是GWINR-9FPGA开发板,其主要特性如下:

  • Logic units (LUT4): 8649

  • Registers (FF): 6480

  • Shadow SRAM (SSRAM) : 17280 bits

  • Block SRAM (BSRAM): 468K bits (26个块)

  • User flash: 608K bits

  • SDR SDRAM: 64M bits

  • 18 × 18 Multiplier: 20

  • SPI FLASH: 32M-b1t

  • PLL: 2

  • Display interface: HDMI, SPI screen, RGB screen

  • Debugger:板载 BL702 芯片提供 USB-JTAG 和 USB-UART 功能

  • I0能力:

  • 支持 4mA、8mA、16mA、24mA 驱动能力

■每个I/0提供独立的总线保持器、上拉/下拉电阻和开漏输出选项

  • 连接器:TF卡播,2x24P2.54mm排针

  • 按钮:2个可编程按钮

  • LED:板载6个可编程LED

这些特性使得该开发板非常适合实现UART回环系统,特别是其丰富的I/0资源和板载LED 可以方便地进行调试和状态显示。

2.I0约束

1.001

I0_PDRT "c1k* PULL_MoDE=UP; ot [e]po. 0n0I I0_Loc “led[1]′ 11; t [z]pa 3001 [≤]po0n0I I0_LOC "led[4]* 15; ,x4ien. oon0I I0_PORT "uart_tx* I0_TYPE=LVCMOS33; gt ,x.1e, 301 01 I0_PORT "uart_rx* IO_TYPE=LVCMoS33; 详细解释: l.时钟(clk): 分配到52号引脚

  • 设置为上拉模式(PULL_MODE-UP)

  • 上拉模式有助于减少硬声干扰,提高信号完整性

2. LED 输出:

  • led[0] 到led[5] 分别分配到 10, 11, 13, 14, 15, 16 号引脚

  • 这些LED将用于显示接收到的数据,提供直观的调试信息

3. UART 接口:

  • 发送(uart_tx)分配到17号引脚

  • 接收(uart_rx)分配到18号引脚

  • 都设置为LVCM0S33标准(3.3V逻辑电平)

  • LVCMOS33是一种常见的低压CMOS逻辑标准,兼容性好,功耗低

知识点:

  • I0约束对于FPGA设计至关重要,它们定义了逻辑设计如何与物理硬件接口。

  • 正确的I0标准(如LVCMOS33)确保了信号的电气特性与外部设备匹配。

  • 上拉/下拉设置可以提高信号稳定性,特别是对于时钟等关键信号。

3.UART 回环模块(uart_loop_back)

3.1模块接口

nodule uart_loop_back ( input clk, output uart_tx, output reg [5:0] led ): 这个模块是整个系统的顶层模块,它连接了UART接收器、发送器和LED显示逻辑。

3.2内部信号

vire rxDatavalid; 1reg txDatavalid; wire txBusy: 这些信号用于模块间的通信和数据传输控制

3.3UART接收器和发送器实例化

uart_rx .DELAY_FRAMES (234) ) uart_rx_inst ( .clk(clk), .uart_rx(uart_rx), , rxData( rxData), ): uart_tx DELAY_FRAMES (234) ) uart_tx_inst ( .clk(clk), . txData(txData), . txBusy(txBusy) uart_tx(uart_tx)

DELAY_FRAHE5参数的计算: DELAY_FRAMES-(系统时钟频率)/《波特率)-27,060,000/ 115,200234

  • 系统时钟频率:27 MHz(27,000,000 Hz)

  • 目标波特率:115,200bps

这个计算确保了UART通信的正确时序。每个比特持续的时钟周期致为234,这样可以精确地 采样和发送数据。

3.4缓冲区和控制变量

reg [7:0] buffer [0:255]: reg [7:0] readPtr = 0; reg sending = ; 这里实现了一个256字节的循环缓冲区,用于暂存接收到的数据。

  • buffcr:存储接收到的数据

writePtr:指向下一个要写入的位置

  • readPtr:指向下一个要读取的位置

  • sending:指示当前是否正在发送数据

循环缓冲区的工作原理: 写人数据 wrtePtr 通冲区活 通年区空 等特新款据

graph TD B->|说取数据|C[发送数据] C -->|增加 readPtr| B D[writePtr ==readPtr]-->|线冲区空|E[等待新数据]

这种设计允许连续接收数据,即使发送这度暂时眼不上接收速度。

3.5主要逻辑

主要逻辑在一个always@(posedgeclk)块中实现:

中区有款

开用发理

新有数报已发坊

graph T0 A[开始]->B{[接收到有效数据?} B-->|是|C[存人螺冲区] B -->|否|D{正在发送?}

  • -> D

C D-->|否|E{线冲区有数据?} E-->|是|F[开始发送】 E -->|否| A }0<- 6->|是|H[发送下一个数据] 5 ->|否| A H-->I{所有数据已发送?} I-->是|J[端束发送过程]

  • >|否|A

这个逻辑确保了数据的连续接收和发送,同时处理了发送器忙绿时的情况。

3.6LED控制

alvays @(posedge clk) beg1n if [rxDatavalid) led <= -rxData[5:]; end 这个块在每次接收到有效数据时更新LED显示,显示接收数据的低6位的反码。这提供了直 观的数据接收指示。

4.UART接收器模块(uart_rx)

4.1模块接口

nodule uart_rx #( parameter DELAY_FRAMESs = 234 )( input clk, input uart_rx, output reg rxDatavalid ) ;

4.2状态定义

localparam RX_STATE_IDLE = 3;

Localparam RX_STATE_STOP_BIT = 5;

4.3接收逻辑流程

IDLE

START_BIT 第特半个比特时间 READ_WAIT 检测到停止位 到达比特中心 末读完 8 位 RFAD 读完8位 STOP_BIT stateD1agral-v2 310I <-- [] IDLE>START_BIT:检测到开始位 START_BIT --> READ_WAIT:等特半个比特时间 READ WAIT -* READ:到达比特中心 READ->READ_WAIT:未说完8位 READ --> STOP_BIT : 读完 8 位 STOP BIT->IDLE:检到停止位 详细说明: L.IDLE状态:等待起始位(低电平)

2.START_BIT状态:确认起始位,准备读取数据

3.READ_WAIT状态:等待到达比特中心

1.READ状态:采样数据位

5.STOP BIT状态:确认停止位,完成接取

知识点:

  • UART协议的基本原理:起始位、数据位、停止位

  • 在比特中心采样以提高可靠性

  • 使用状态机实现率行协议解析

5.UART发送器模块(uart_tx)

5.1模块接口

nodule uart_tx #( parameter DELAY_FRAMES = 234 )( input clk, input txDataValid, output reg uart_tx

5.2状态定义

Local.param TX_STATE_START_BIT - 1; 4localparam TX_STATE_STOP_BIT = 3;

5.3发送逻辑流程

详细说明: L.IDLE状态:等待有效数据

2.START_BIT状态:发送起始位(低电平)

3.WRITE状态:逐位发送8位数据

1.STOP_BIT状态:发送停止位(高电平)

知识点:

  • UART发送过程中的精确时序控制

  • 使用计数器(txCounter)来控制每个位的持续时间

  • txBusy信号的使用,用于招示发送器状态

6.系统整体流程

外部UART设备 发运救据 UART_RX rxData, rxDatavalid 控收数据 回环经辑 LED显不 txData, txDatavalid 存 读取 福环规冲区 UART_TX 发送数据 外部UART设备

graph TD A[外部UART设备]-->|发送效据]B(UART_RX) B -->|rxData, rxDataValid| C{回环逐辑}

  • >|存储|D[循环强冲区]

D -->|读取|C C -->|txData, txDataValid| E(UART_TX]

  • >|发送数据|F[外部UART设务]

B -->|接收数据|G[LED显示]

这个流程图展示了整个系统的数据流: L.外部设备发送数据到UART_RX

2.接收到的数据通过回环逻辑存入缓冲区

3.数据从缓冲区读出并发送到UART_TX

1.UART_TX将数据发送回外部设备

5.同时,接收到的效据会显示在LED上

7.关键设计考虑

5.模块化设计:将功能分解为独立模块(接收器、发送器、回环逻辑),提高代码可读性和可

维护性,这种方法也允许各个模块的独立溯试和重用。

5.错误处理:虽然当前设计没有明确的错误处理机制,但可以考虑添加奇偶校验或赖错误检测

来提高可靠性。

7.LED反馈:使用板我LED显示接收到的数据,为调试和状态监控提供了直现的方法。

3.I0配置:精心选择的I0配置(如LVCMOS33标准和上拉设置)确保了与外部设备的良

好兼容性和信号完整性。

8.性能分析

8.1时序性能

  • 系统时钟:27MHz

  • UART 浪特率:115286 bps

  • 每比特时钟周期:234个系统时钟周期

这意味着系统有足够的时间分辨率来准确采样和发送UART数据。事实上,它可以支持更高的 波特率,理论上最高可达: 最大波特率=27 MHz/ 16×1.6875 Mbps (假设每比特至少需要16个时钟周期来准确采样)

8.2资源利用

基于提供的GWINR-9FPGA规格,我们可以估计资源利用率:

  • 还辑单元(LUT4):该设计可能使用不到100个LUT,占总数8648的约1%.

  • 寄存器(FF):可能使用约50-100个FF,占总数6488的约1-2%

  • 块RAM(BSRAM):此设计不使用块 RAM

  • I/0:使用了9个I/0引脚(1个时钟,6个LED,2个UART),远低于设备的总

1/0 能力。 这表明该设计在资源利用上非常高效,留有大量空间forfutureenhancements。

9.可能的改进和扩展

L.错误检测和处理:

  • 实现奇偶校验

  • 添加帧错误检测(无效的停止位)

  • 实现接收器超时机制

2.缓冲区增强:

  • 实现可配置的缓冲区大小

  • 漆加缓冲区满/空标志

  • 实现中断机制for缓冲区状态变化

3.波特率配置:

  • 实现运行时可配置的波特率

  • 支持自动波特率检测

1.数据处理:

  • 添加简单的命令解析功能

  • 实现数据滤波或格式转换

,诊断功能:

  • 添加更多的状态LED指示

  • 实现环回测试模式

3.接口扩展:

  • 添加 SPI或I2C接口for配置

  • 实现USB-UART桥接功能

01 qde.6 A[UART系统]->B[错误处理] A-->C[缓冲区增强] A·->D[波特率配置】 A--> E[数据处理] A --> F[诊断功能] A--> G[接口扩展] B-->B1[奇校验] B -->B2[帧错误检测] B --> B3[接收超时] C->C1[可配置爆冲区大小] C-->C2[线冲区状态标志] C-->C3[中断机利] D-->D1[可配置波特率] D-->D2[自动退特率检测] E --> E1[命令解析] E--> E2[数据转换] F --> F1[状态LED] F-->F2[环同测试模式] F-->F3[性计数器] 6 --> G1[SPI/I2C配置] G --> G2[USB-UART桥接]

10.测试策略

为确保系统的可靠性和正确性,可以采用以下测试策略:

1.单元测试:

  • 对UART_RX和UART_TX模块进行独立测试

  • 验证不同波特率下的正确操作

  • 测试边界条件(如最大速度数据传输)

1.集成测试:

  • 测试完整的回环功据

  • 验证缓冲区在各种数据流情况下的行为

3.压力测试:

  • 连续发送大量数据

  • 模拟数据突发和间数性传输

1.精误注入剩试:

  • 模拟帧错误、噪声干扰

  • 测试系统在异常情况下的行为

5.实际硬件测试:

  • 使用实际UART设备(如PC串口或微控制器)进行端到端测试

  • 在不同环境条件下进行长时间稳定性测试

graph TD A[测试策略]-->B[单元测试] A-->C[集成测试] A-->D[压力测试] A-->E[错误注入测试] A-->F[实际硬件测试] 6 B-->B2[UART_TX测试] B-->B3[波特率验证] 10 C-->C1[回环功能测试] 11 C-->C2[缓冲区行为测试] D-->D1[大量数据测试] 12 13 14 E-->E1[帧错误模拟] 15 E-->E2[噪声干扰模拟] 16 F-->F1[端到端测试] 17 F-->F2[长期稳定性测试] 18 完整代码 https://github.com/tianrking/TANGNANo9K_FPGA_TEMPLATE/tree/master/uart _loopback 这个UART回环系统展示了如何在FPGA上实现一个基本但功能完整的串行通信接口。通过模 块化设计、状态机实现和缓冲策略,系统能够可靠地接收和发送数据。该设计不仅演示了UART 协议的基本原理,还展示了FPGA设计中的一些重要概念,如时序控制、资源管理和IO配 置。

FPGA·目录三 下一篇·高云FPGALinux下调制PWM>

原始排版图

FPGA design a UART Loopback System:微信公众号导出原始排版图

猫之歌 (AI 创作)

· 閱讀時間約 1 分鐘
w0x7ce
MySelf

发布于 2024-04-07 20:57:32(微信公众号导出记录)。

本文来自公众号后台的“导出文章内容”功能。博客正文由导出长图进行本地 OCR 转写,并保留原始排版图用于逐段核对。

原文链接:查看原文

注意:本次导出图没有包含可可靠识别的正文(图中显示“请在微信客户端打开”或文字量过少)。这里仅保存原始导出图,没有根据标题推测或补写正文;需要在公众号后台重新导出后再补齐。

正文(本地 OCR 转写)

请在微信客户端打开

#AI创作#GPT4 已声明原创> 广东2024年4月7日20:58

原始排版图

猫之歌 (AI 创作):微信公众号导出原始排版图