数码之家

 找回密码
 立即注册
搜索
查看: 2227|回复: 38

[电脑] FPGA/PC1500数码音乐和语音识别;SHARP PC-1500数码天花板

[复制链接]
发表于 2023-10-4 11:16:34 来自手机浏览器 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 杨生69366 于 2023-10-7 09:45 编辑

FPGA-万能芯片的应用,使得我的PC1500一步登天达到数码巅峰,不仅实现音乐芯片控制和编程!还实现大规模语音识别芯片的控制和编程以及在电脑和手机的应用。

FPGA极大地提升了我的数码技术高度,极大地缩短了我的数码电路开发时间,极大地缩小了数码电路板尺寸。使得以前需要设计多块电路板组合的数码电路控制大规模音源芯片和大规模语音芯片电路板,缩减到一小块外挂电路板,甚至可以再缩小到藏身于PC1500机内了!

FPGA/PC1500技术升华而尺寸缩小图片:
IMG_20230930_122123.jpg
IMG_20230930_122813.jpg
IMG_20231004_102422.jpg
IMG_20231004_102706.jpg
IMG_20230930_205916.jpg
IMG_20231004_105144.jpg


FPGA音乐和语音识别小视频:
XiaoYing_Video_16962460600461696246062.gif
XiaoYing_Video_16962449385371696244941.gif

FPGA芯片全称是Field Programmable Gate Arrays(现场可编程门阵列),通过现场对芯片进行硬件编程来实现不同的电路功能,被誉为万能芯片。而FPGA和单片机的区别,FPGA更偏向于硬件电路,而单片机更偏于软件。单片机设计属软件范畴,它的硬件(单片机芯片)是固定的,通过软件编程语言描述软件指令在硬件芯片上的执行,FPGA设计属硬件范畴,它的硬件(FPGA)是可编程的,是一个通过硬件描述语言在FPGA芯片上自定义集成电路的过程。因此,FPGA应用在数码音源芯片电路和语音识别电路方面,就是神一般的存在。

需要控制音乐芯片合成器芯片YM71273多达8*8+10=71的矩阵组成的IO控制端,再加上控制一片由合肥讯飞科技的大规模语音阵列芯片XM510,其矩阵组合为8*16多达128个IO控制端。这二块矩阵电路模块,一共有71+128个控需要控制的端口,加上译码电路和时序中断电路以及UART,WIFI/蓝牙网络通讯模块,还需要选取一个MCU模块STM32F4spi,(后来的实际应用大都由FPGA编程完成了),如果采用常规数码电路设计和控制非常复杂麻烦。

这个时候,应对这些比较复杂和庞大数码逻辑电路的设计和控制的最佳利器,就是数码界高人都懂的,但又令初学者畏惧的可编程逻辑门阵列FPGA!
     
当采用FPGA大规模门阵列芯片控制后,对于我的MCU单片机芯片的选择也毫无压力,哪怕仍然选择古董电脑PC1500,低端8位机器,底层汇编语言,都一定行!主要还是因为它PC1500作为一个初级计算机,键盘显示屏和汇编语言高级语言编程都包括了,而PC1500绝不可能完成那么多的需要高速运算处理数据,只是利用了PC1500CPU以及键盘和一些必要的控制编程命令,收发传递必要的控制信息和指令,传递给STM32的SPI彩显,传递给FPGA芯片EP4CE6E22C8和语音识别芯片。而真正需要高速数据处理数据分析的都是这些ESP32,雅马哈音源芯片,语音识别芯片,再通过编译和编程强大的FPGA以及内部的DSP运算器处理器超高速完成的。甚至于PC1500内部还有一点空间,设法把全部三块模块电路板都可能装入其中。

音乐和语音系统软件开发系列:

一,大规模音源芯片电路板,采用YM71273大规模音源芯片。全部贴片元器件和IC-根据最小最适合PC1500机内有极限尺寸制定PCB尺寸和布线-焊接调试好。以前已经发布了几篇有关数码音乐文章包含详细资料电路图和视频等。后有重大升级和全部贴片了,限于篇幅暂不详尽说明。

二,大规模语音芯片电路板,采用最新语音芯片XM510-一款高性能的DSP多核语音处理器:
1. 具备32位ARM Cortex-M4内核
2. 128KB RAM,1MB Flash
3. 音频编解码:支持PCM、AMR-WB、OPUS、G.711等
4. 语音识别:支持离线和在线语音识别。
5. DSP处理器含64个32位乘法器和32位累加器执行高速语音数据和噪声抑制处理。
6. 唛头语音输入灵敏度距离3米。
7. 具备SPI、I2C、UART和蓝牙BLE4.2与外设进行通信和数据交换以及文字和语音传输。
8. 具备矩阵电路8*16=128个GPIO。
9. 时钟频率200 MHz。
10. 能够精确识别24种方言64种外语,中英文混合双发也没有问题!

因为该芯片已经具备了大部分的硬件识别和软件处理功能。使得我的FPGA仅仅需要比较简单的汇编语言和VHDL语言编程对接和处理,实现多种语言语音的识别和处理。

三,FPGA,采用EP4CE6E22C8芯片,使用立创EDA画好了六层PCB板,由于布线太密集总是厂家PCB审核退回。干脆买了网上现成的FPGA最小系统板散件回来自己动手,反而更容易一次性焊接调试成功。只是FPGA板无法装入1500机身内部,只能外挂在PC1500后背。但得到了二个好处,一是省心省钱可靠性高,二是容易替换更新或者用在其它地方。

四,STM32板,主要是PC1500可以通过UART串口控制输出文字彩图动画等不太重要但是装饰和提高古董的时髦彩显装饰,平时就是启用音乐频谱动态彩屏跟随音乐跳动扮高雅而已。

五,以上一二三四电路板的与PC1500内部总线的连接接口板,板与板之间,分别采用FPC软排线,编号为P1-22P,P2-10P和P3-26P通过该接口板与FPGA芯片IO端口互联,非常紧凑也非常可靠!

以上电路板的设计,虽然都通过FPGA引脚分配硬件连接一起,但是每个板子都设计具备WIFI或者蓝牙功能,因此内外都是无线网络互联互通,神通广大。正如视频所展示的,实现了PC1500的音乐和语音与电脑或者手机多文字键盘打字,多国语音控制和聊天的等等所能想到的强大应用!

我是初次学习和应用FPGA的开发软件Quartus II ,翻看了下面几本二手书籍:
IMG_20230718_114012.jpg

快速入门的诀窍就是边学边做,动手实践。

首先是使用了原理图逻辑电路绘制(打开Quartus II的Block Diagram/Schematic),主要是绘制PC1500的地址总线和数据总线产生控制芯片和设备板所需要的片选信号-译码电路,然后是逻辑电路,主要是三态门电路来控制外部近84个需要控制的IO输入和输出端口,驱动音源芯片和语音芯片电路板的IO矩阵电路。音源芯片电路板需要8*8矩阵+2个sp喇叭端口+4个备用端口=22个IO端口(FPC软排线P1-22,实际用16个端口),10个音乐模式状态端口(FPC软排线P2-10),控制语音识别芯片板需要8*16矩阵+2个电源端口=26个IO端口(FPC软排线P3-26P)。用端口达16+10+26=52,再加上总线控制和译码电路所需端口20个,片选输出端口N个,50MHz时钟和复位端口2个,实际用到了87个IO端口!该芯片给用户的IO端口竟然不够用了?芯片有自己的称作全局时钟引脚9个,还有7个空闲引脚,我是通过设置用来分配给我的IO用途,如此IO端口就够用了。需要注意的是只能用于“INPUT”用途,不可以“OUTPUT”。

进行EDA和PCB板绘制:

外置式PCB板设计:
IMG_20231004_151200.jpg
mmexport1696403049480.png
IMG_20231004_151555.jpg

内置式PCB板设计:
mmexport1696404089677.png
IMG_20231004_151937.jpg

最初是自己绘制FPGA的芯片电路的设计和PCB板绘制,6层板失败了:
mmexport1692067299512.png
IMG_20231004_153001.jpg

FPGA与PC1500总线控制电路图(EDA图比较大A3尺寸,选主要部分):
103407f1fjifovj1uj4g1h.jpg

使用了成都精能冠电子的FPGA最小系统开发板(散件自己动手更便宜),以及外置式和改进内置式过程:
IMG_20230909_153902.jpg
mmexport1692497088781.png
mmexport1692869921061.png
mmexport1694308507541.png
IMG_20231004_104812.jpg
IMG_20231004_102924.jpg

FPGA最小系统电路图(成都精能冠电子):
mmexport1693199407049.png

音乐和语音系统软件开发系列:

示例一:

PC1500编程,把键盘数据传递输出给FPGA的示范程序:
1,BASIC语言编程:

//键盘单音发音弹拨音乐,BASIC编程:
100:WAIT 0:ON ERROR GOTO 105 //遇到扫描键盘出错就继续从105语句开始等待按键,继续扫描循环
105:POKE &BFE2,0,0,0,0,0:GOTO INKEY$ +100 //清零并且扫描键盘从“0”~“+”对应发音简谱从低音“.5”~高音“6.”的音域范围
142:POKE &BFE6,&10:PRINT "4.":* //扫描到按键ASC II码=42=“*”键,发音高音4.
143:POKE &BFE7,&01:PRINT "6.":+ //“+”=高音6.
145:POKE &BFE6,&40:PRINT "5.":- //“-”=高音5.
146:POKE &BFE4,&01:PRINT ".6":.  //“.”=低音.6
147:POKE &BFE6,&08:PRINT "3.":/ //“/”高音3.
148:POKE &BFE3,&40:PRINT ".5":0 //“0”=低音.5
149:POKE &BFE4,&08:PRINT "1":1 //“1”=1音
150:POKE &BFE4,&20:PRINT "2":2 //“2”=2音
151:POKE &BFE4,&80:PRINT "3":3 //“3”=3音音
152:POKE &BFE5,&01:PRINT "4":4 //“4”=4音
153:POKE &BFE5,&04:PRINT "5":5 //“5”=5音
154:POKE &BFE5,&10:PRINT "6":6 //“6”=6音
155:POKE &BFE5,&40:PRINT "7":7 //“7”=7音
156:POKE &BFE5,&80:PRINT "8":8 //“8”=1.音
157:POKE &BFE6,&02:PRINT "9":/ //“9”=2.
161:POKE &BFE4,&05:PRINT ".7": =//“=”=.7

以上是按键发音从低音5到高音6,结尾不需要循环语句,因为程序扫描运行其中任何一行,遇到语句结尾“:”就会产生错误,自动转向错误处理语句105,继续INKEY$扫描循环。

2,键盘复音发音弹拨音乐,汇编语言编程:

//键盘复音(3度音)弹拨音乐,开头初始化是BASIC编程,然后调用汇编入口发音
200:POKE &BFE2,0,0,0,0,0,0,0 //清零复位
205:WAIT 0:ON ERROR GOTO 220 //遇到出错就循跳转220继续
210:CALL &07F0 //汇编中断向量暂停
220:POKE &BFE2,0,0,0,0,0,0:GOTO ASC INKEY$ +200
242:CALL &08D0:* //扫描到按键ASC II码=42=“*”键,进入该汇编入口,发音2.和4.
243:CALL &08F0:+ //“+”键发音4.和6.
245:CALL &08E0:- //“-”键发音3.和5.
246:CALL &0810:.  //“.”键发音.4和.6
247:CALL &08C0:/  //“/”键发音1.和3.
248:CALL &0800:0 //“0”键发音.3和.5
249:CALL &0830:1 //“1”键发音.6和1
250:CALL &0840:2 //“2”键发音.7和2
251:CALL &0850: 3//“3”键发音1和3
252:CALL &0860:4 //“4”键发音2和4
253:CALL &0870:5 //“5”键发音3和5
254:CALL &0880:6 //“6”发音4和6
255:CALL &0890:7 //“7”键发音5和7
256:CALL &08A0:8 //“8”键发音6和1.
257:CALL &08B0:9 //“9”键发音7和2.
261:CALL &0820:= //“=”键发音.5和.7

//调用汇编语言子程序
//左边是地址和机器代码,右边是对应汇编语言
0800: B5 40         LDI  A, 40H  //发音.5
          AE BFE3    STA  (BFE3H)
          B5 08         LDI  A, 08   //发音.3
          AE BFE2    STA  (BFE2H)
          9A              RTN  //返回主程序
0810: B5 01         LDI  A, 01H  //发音.6
          AE BFE4    STA  (BFE4H)
          B5 10          LDI  A, 10H  //发音.4
          AE BFE3    STA  (BFE3H)
          9A               RTN  //返回主程序
0820: B5 04          LDI  A, 04H  //发音7
         AE BFE4     STA  (BFE4H)
         B5 40          LDI  A, 40H  //发音.5
         AE BFE3     STA  (BFE3H)
         9A               RTN  //返回主程序
0830: B5 08          LDI  A, 08H  //发音1
         AE BFE4     STA  (BFE4H)
         5A 01           LDI  YL, 01H  //发音.6
         48 BF          LDI  XH, BFH
         4A E4          LDI  XL, E4H  
         BA 0900     JMP  0900H //转延时子程序(同一片选的二个音需要约20ms延时,不影响听觉同步)
//以下大多同上,PC1500实际CPU运行的是机器代码,为了简短仅地址和机器代码展示无需编译成汇编语言:
0840:B520AEBFE4  5A0448BF4AE4BA0900 //发音2和.7
0850:B580AEBFE4  5A0848BF4AE4BA0900    //发音3和1
0860:B501AEBFE5  B520AEBFE49A //发音4和2
0870:B504AEBFE5  B580AEBFE49A //发音5和3
0880:B510AEBFE5  5A0148BF4AE5BA0900 //发音6和4
0890:B540AEBFE5  5A0448BF4AE5BA0900 //发音7和5
08A0:B580AEBFE5  5A1048BF4AE5BA0900 //发音1.和6
08B0:B502AEBFE6  B540AEBFE49A //发音.2和7
08C0:B508AEBFE6  B580AEBFE59A //发音3.和1.
08D0:B510AEBFE6  5A0248BF4AE6BA0900 //发音4.和2.
08E0:B540AEBFE6  5A0848BF4AE6BA0900 //发音5.和3.
08F0:B501AEBFE7  B510AEBFE69A //发音6.和4.

//被调用的子程序
0900:6A 06    LDI  UL, 06H //大循环延时参数
0902:24          LDA  UL     
         28          STA  UH    //大延时参数
         6A FF    LDI  UL, FFH //小延时参数
         88 02    LOP -02H  0906H  //小循环
         A4         LDA  UH
         2A         STA  UL
         88 0A    LOP  -0AH 0902H //大循环
         14           LDA  YL  //发音码
         0E          STA  (X)  //送寄存器发音
         9A          RTN  //返回主程序

3,PC1500键盘转换为国际标准键盘,以及语音键盘创建程序BASIC语言:
PC1500键盘只有55个,需要配置为国际标准键盘,才能够与Windows电脑或者手机,再通过蓝牙功能,实现文字和语音无线连接输入。幸好PC1500具备有3*6=18个扩展键,这样就拥有共73个键,足够标准键盘的基本要素。由于全键盘编程比较长,所以选取一些编程例子。

语音识别,之所以不需要运行超快的汇编语言,是因为及其复杂的语音识别的全部要素都是由讯飞语音芯片来完成了,我只是一个搬运工。键盘的文字输入也不需要多么快,用多种方言或者外语语音,反应非常快捷-你有多快速的,比较清晰的语速发音,它就有多快的识别和显示(约400字/分钟)。

//PC1500生成国际标准语音键盘的矩阵配置BASIC编程:
300:CLEAR:WAIT 20
302:ON ERROR GOTO 310 //遇到扫描键盘出错就继续从310语句开始等待按键,继续扫描循环
304:F0=&BFF0:F1=&BFF1:F2=&BFF2:F3=&BFF3:F4=&BFF4:F5=&BFF5:F6=&BFF6:F7=&BFF7
308:F8=&BFF8:F9=&BFF9:FA=&BFFA:FB=&BFFB:FC=&BFFC:FD=&BFFD:FE=&BFFE:FF=&BFFF  //预置片选端
310:POKE &BFF0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0:GOTO ASC INKEY$ +300 //清零复位,并且扫描键盘,出现错误继续。
313:POKE FD,&08:PRINT "Enter";:POKE FD,0:e //是回车换行键的ASC II=13=标准键盘的“Enter”键
327:POKE F0,&10:PRINT"Esc";:POKE F0,0:Esc //是Escape键的ASC II=27=标准键盘的“Esc”键
348:POKE FC,&01:PRINT"0";:POKE FC,0:0 //ASC II=48="0"键
349:POKE F0,&01:PRINT "1";:POKE F0,0:1 //ASC II=49="1"键
……
365:POKE F0,&20:PRINT"A";:POKE F0,0:A //ASC II=65="A"键
366:POKE F3,&04:PRINT "B";:POKE F3,0:B //ASC II=66="B"键
……
390:POKE F0,&08:PRINT "Z";:POKE F0,0:Z: //ASC II=90="Z"键

本程序是PC1500全键盘转换为国际标准键盘示例编程。结尾不需要循环语句,因为程序扫描运行其中任何一行,遇到语句结尾“:”就会产生错误,自动转向错误处理语句310,继续INKEY$扫描循环。

示例二:
FPGA的UART串口通讯程序:
Verilog硬件描述语言UART发送和接收程序:

```verilog
module UART (
  input clk,
  input reset,
  input enable,
  input [7:0] tx_data,
  output reg tx_busy,
  output wire [7:0] rx_data,
  output reg rx_ready
);
  reg [3:0] bit_count;
  reg [7:0] tx_reg;
  reg [7:0] rx_reg;
  reg start_bit;
  
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      bit_count <= 0;
      tx_busy <= 0;
      tx_reg <= 0;
      rx_reg <= 0;
      start_bit <= 0;
      rx_data <= 0;
      rx_ready <= 0;
    end else begin
      if (enable) begin
// UART transmitter
if (bit_count < 8) begin
  tx_reg <= tx_data;
  start_bit <= 0;
  bit_count <= bit_count + 1;
end else if (bit_count == 8) begin
  tx_reg <= 0;
  start_bit <= 1;
  bit_count <= 9;
end else if (bit_count < 12) begin
  start_bit <= 0;
  bit_count <= bit_count + 1;
end else begin
  tx_busy <= 0;
  bit_count <= 0;
end

// UART receiver
if (!start_bit && bit_count < 9) begin
  rx_reg <= {rx_reg[6:0], rx_data[0]};
  bit_count <= bit_count + 1;
end else if (bit_count == 9) begin
  rx_data <= rx_reg;
  rx_ready <= 1;
  bit_count <= 10;
end else if (bit_count < 12) begin
  rx_ready <= 0;
  bit_count <= bit_count + 1;
end else begin
  bit_count <= 0;
end
      end else begin
tx_busy <= 0;
bit_count <= 0;
      end
    end
  end
endmodule
```
本程序定义了一个名为UART的模块,包括时钟信号`clk`,复位信号`reset`,使能信号`enable`,发送数据信号`tx_data`,发送忙碌信号`tx_busy`,接收数据信号`rx_data`和接收就绪信号`rx_ready`作为输入输出。在always块中,根据时钟信号和复位信号,通过状态机的方式实现UART发送和接收的功能。对于发送部分,根据发送使能信号和位计数,逐位发送数据,并在最后一个停止位之后将发送忙碌信号复位。对于接收部分,根据接收使能信号和位计数,逐位接收数据,并在接收完最后一个停止位之后将接收就绪信号置位。

示例三:FPGA的VHDL编程“钢琴音色包络线程序VHDL-1”:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity PianoSynthesizer is
    Port ( clk : in  STD_LOGIC;
   rst : in  STD_LOGIC;
   key : in  STD_LOGIC_VECTOR (3 downto 0);
   note : out  STD_LOGIC_VECTOR (7 downto 0) := (others => '0');
   envelope : out  STD_LOGIC_VECTOR (7 downto 0) := (others => '0');
   output_enable : out  STD_LOGIC);
end PianoSynthesizer;

architecture Behavioral of PianoSynthesizer is
    constant TONE_FREQUENCY : std_logic_vector (3 downto 0) := "1101"; -- 设置音调频率
    constant ENVELOPE_RATE : std_logic_vector (3 downto 0) := "1010"; -- 设置包络线速率
    constant ENVELOPE_AMPLITUDE : std_logic_vector (7 downto 0) := "10000000"; -- 设置包络线振幅

    signal tone_counter : std_logic_vector (7 downto 0) := (others => '0');
    signal envelope_counter : std_logic_vector (7 downto 0) := (others => '0');
    signal envelope_amplitude : std_logic_vector (7 downto 0) := (others => '0');
    signal envelope_direction : std_logic := '0';
    signal envelope_enable : std_logic := '0';

begin

    process (clk, rst)
    begin
if rst = '1' then
    -- 复位
    tone_counter <= (others => '0');
    envelope_counter <= (others => '0');
    envelope_amplitude <= (others => '0');
    envelope_direction <= '0';
    envelope_enable <= '0';
    output_enable <= '0';
    note <= (others => '0');
    envelope <= (others => '0');
elsif rising_edge(clk) then
    -- 音符改变时更新音调计数器和包络线计数器
    if key /= "0000" then
tone_counter <= TONE_FREQUENCY;
envelope_counter <= (others => '0');
envelope_amplitude <= ENVELOPE_AMPLITUDE;
envelope_direction <= '1'; -- 开始包络上升
envelope_enable <= '1'; -- 启用包络线
output_enable <= '1'; -- 启用音色输出
note <= key; -- 输出当前音符
    elsif envelope_enable = '1' then
-- 包络线控制
tone_counter <= TONE_FREQUENCY;
envelope_counter <= envelope_counter + 1;
if envelope_direction = '1' and envelope_amplitude /= "11111111" then
    -- 上升阶段
    envelope_amplitude <= std_logic_vector(unsigned(envelope_amplitude) + unsigned(ENVELOPE_RATE));
elsif envelope_direction = '0' and envelope_amplitude /= "00000000" then
    -- 下降阶段
    envelope_amplitude <= std_logic_vector(unsigned(envelope_amplitude) - unsigned(ENVELOPE_RATE));
end if;
if envelope_direction = '1' and envelope_amplitude = "11111111" then
    -- 达到最大振幅,开始下降阶段
    envelope_direction <= '0';
elsif envelope_direction = '0' and envelope_amplitude = "00000000" then
    -- 达到最小振幅,停止包络线
    envelope_enable <= '0';
    output_enable <= '0';
end if;
    end if;
end if;
    end process;

end Behavioral;
```
该程序通过使用`tone_counter`和`envelope_counter`信号来控制音调和包络线的生成。通过调整`TONE_FREQUENCY`和`ENVELOPE_RATE`参数,可以改变音调和包络线的速率。`ENVELOPE_AMPLITUDE`参数用于控制包络线的振幅。在主要的处理过程中,根据`rst`信号进行复位操作,当`key`输入信号不为"0000"时,设置新的音符,并重置包络线计数器和振幅。当`envelope_enable`信号为高电平时,更新包络线的状态:在上升阶段,增加振幅;在下降阶段,减小振幅。当振幅达到最大或最小值时,改变包络线的方向,并在振幅达到所设置的最大或最小值时停止包络线的更新。最终,音符和包络线的状态被输出到`note`和`envelope`信号中,并在`output_enable`信号为高电平时启用音色输出。

示例四:Verilog编程《小星星》测试程序:

  module twinkle_star(input clk,output reg speaker);

// 定义时长
localparam QUARTER = 500000;
localparam HALF = 2 * QUARTER;
localparam EIGHTH = QUARTER / 2;

// 定义音符
localparam C5 = 523;
localparam D5 = 587;
localparam E5 = 659;
localparam F5 = 698;
localparam G5 = 784;
localparam A5 = 880;
localparam B5 = 988;

// 定义小星星乐曲
reg [23:0] melody [1:14] = '{C5, C5, G5, G5, A5, A5, G5, E5, E5, D5, D5, C5, G5, G5};

// 定义拍子
reg [23:0] beats [1:14] = '{QUARTER, QUARTER, QUARTER, QUARTER, QUARTER, QUARTER, HALF, QUARTER, QUARTER, QUARTER, QUARTER, QUARTER, HALF, QUARTER};

// 定义计数器和索引
reg [3:0] counter = 0;
reg [3:0] index = 1;

// 音乐播放
always @(posedge clk) begin
  counter <= counter + 1;
  if (counter == beats[index]) begin
    index <= index + 1;
    if (index == 15) begin
      index <= 1;
    end
    counter <= 0;
  end
  if (counter < (beats[index] / 2)) begin
    speaker <= 1;
  end
  else begin
    speaker <= 0;
  end
end

endmodule
```

程序代码中包含了小星星的旋律和拍子定义,通过计数器和索引来控制播放。

关于初入门需要的FPGA知识,如何下载破解,如何打开和应用等知识,已经有许多书籍和很多论坛介绍,有图有真相,可能都比我的简单描述更清晰。我是使用的Quartus II,13.0版本,因为最新13.1版本总是出现一些小问题不太可靠。这里,只是我在开发应用中的几点小结如下:

一,点击“Device”图标进行芯片选择和配置,我采用的芯片是EP4CE6E22C8,选“Cyclone IV E”,然后在“Available divides:”选择我的芯片EP4CE6E22C8,再点击栏目:“Device and Pin Options…”,打开Category进行基本三个选项:

1,Unusual Pins选“As input tri-Stated”
2,Dual-Purpose Pins选所有Name栏目下都是“Use as regular I/O”
3,Voltage在“Default I/O Standard:”选“3.0-V LVTTL”

二,点击“Start Compilation”三角形图标进行原理图或者程序的编译处理,编译过程会有条形光标移动,每一步完成就会100%提示,如果出现错误就会停下来,下方信息窗口显示红色文字指示错误息。如果编译成功就显示绿色编译成功。还有一些警告性提示可能无关紧要。

三,编译制执行后,点Pin Panner图标出现芯片引脚分配图,点分配图下栏目“Node Name”菜单,点“Location”,逐个填写自定义的引脚分配。完成后再File-Export保存,再退出。去主页面再编译一次,再打开Pin Panner就可以了,查看引脚分配号栏目,原本自动分配的引脚Littrr Location配置,与Location栏目手工输入的引脚分配一致。配置完成后,需要点击“Start Compilation”三角形图标再进行一次编译,就完成了编译,并且生成了可以进行初步烧录的和可执行的.sof文件。

见引脚分配图如下:
115541nrzgq2u666z126ul.jpg

四,点击“Programmer”图标进行.sof程序烧录,先断电连接USB Blaster专用下载线从电脑到芯片的JTAG端插座,在Hardware Setup…栏选择“USB-Blaster[USB-0]”,
在Mode:选JTAG,再点击File调出需要烧录的.sof文件,我的是“YM71273-2.sof”,然后点击“”进行烧录,烧录成功进行下一步转换sof文件到jic文件才能固化在芯片中。

五,点击“Convert Programming File”进入文件转换选择框。

六,点击栏目Input files to Convert,中的“Flash Loader”后点击“Add Device…”,我选择“Cyclone IV E”和“EP4CE6”,OK。再点击“SOF Data”后点击右侧“Add File…”,在/output files目录下调出.sof文件,我的是“YM71237-2.sof”,然后点击下方“Generate”创建了.sof到.jic的生成。

七,再进入烧录Programmer,添加刚才转换好的“output_file.jic”,出现FPGA芯片和Flash存储芯片图案,选“Program/Configur”栏目框选打勾,就可以启动“Start”,显示绿色进度条,到100%完成。

八, 注意,完成下载后并不能马上自己启动运行程序。必须断电,取下USB线,再重新开机,才可以自动从FlashRAM下载.jic文件并运行。

九,在烧录好了.sof文件时,就可以进行软件仿真测试了,第一次用可能会出提示仿真错误“找不到仿真软件路径”,看错误提示问题出现在仿真编辑器Simulator-Option栏目,只要选择另一个栏目:Quartus ll Simulator,即可成功进行后面仿真。仿真波形参数设置是双点击波形处出现Arbitary Value,填入1或者0高低电平,如果方波输入就点击X带时钟图标。见下图仿真结果:
115742jdet3pblldzz3ibi.jpg

十,如何通过万用表测量FPGA芯片的IO端口好坏?我的经验是每个正常IO端口在不通电情况下,用万用表正负表笔,档位在测量二极管位置,正表笔接地,负表笔接某个IO端,大约是560欧,反之是无穷大电阻值。就是好的,相当于测量二极管的好坏原理。因为我的芯片104引脚测量正反都是220欧,就是烧坏了,原因是调试时,+5V电压不小心触碰到该引脚了。

其实,电脑和手机的语音输入,是很容易通过下载软件实现。但是,低级古董电脑,即使是高级16,32位MCU,树莓派4B,C++或者Python语言我也都比较熟悉和用过,在没有多少社区环境和开源技术可参考的情况下,开发数码音源芯片控制,语音识别芯片控制就都有点难度。而通过古董与现代万能FPGA技术结合,发挥出PC1500的潜力极致。

把古董电脑PC1500通过现代数码技术改造创新发挥潜力的学习和实践过程。科技就是融会贯通,一通百通……。

115927a1vwut20yrzkuvep.jpg
120012ycpxgcjxjjqzbzx5.jpg

在此,感谢本数码论坛提供的交流平台,感谢论坛隐身数码高人@bh4qix ,于今年四月发的帖子给我的建议学习和应用FPGA。

PC1500重要参考书之一,清华大学出版社:
《PC1500系统分析扩展技术及应用集锦》
IDBN 7-302-00678-4/TP.233

详细视频请看B站:
【FPGA之语音芯片音乐芯片创客新作品@发现新商机-哔哩哔哩】 https://b23.tv/vMGNNf8

【FPGA-Quartus II进行编译和sof到jic烧录,芯片是EP4CE6E22C8,后面展示PC1500语音识别和音乐播放!-哔哩哔哩】 https://b23.tv/ATRPqEt


打赏

参与人数 5家元 +150 收起 理由
jf201006 + 30 謝謝分享
hongo + 30 優秀文章
aping365 + 30 優秀文章
ww5223017240 + 30 優秀文章
落叶风 + 30

查看全部打赏

发表于 2023-10-4 11:38:14 | 显示全部楼层
技术贴。楼主厉害
回复 支持 反对

使用道具 举报

发表于 2023-10-4 11:45:31 | 显示全部楼层
看到PC1500,当年嵌入式编程的便携极品,楼主暴露年龄和水平了
回复 支持 反对

使用道具 举报

发表于 2023-10-4 13:05:23 | 显示全部楼层
看一眼,头晕
再看一眼,晕头
第三眼,送上秋波:楼主厉害
回复 支持 2 反对 0

使用道具 举报

发表于 2023-10-4 13:16:40 | 显示全部楼层
古老和现代的融合。
回复 支持 反对

使用道具 举报

发表于 2023-10-4 13:36:34 | 显示全部楼层
好帅,看着头晕
回复 支持 反对

使用道具 举报

发表于 2023-10-4 15:25:11 | 显示全部楼层
看,他竟然想教会我们。
回复 支持 反对

使用道具 举报

发表于 2023-10-4 16:36:56 | 显示全部楼层
看不懂,好像很厉害的样子
回复 支持 反对

使用道具 举报

发表于 2023-10-4 17:33:29 | 显示全部楼层
现在多的是比这个好的小电脑。只是没有那个反正很无聊的黑白屏和键盘。
便宜的迅雷母鸡,s805四核,8g emmc,1g DDR3,linux移植好 ,  30块钱到手,楼主那些钱不能不能批发1K回来?
回复 支持 反对

使用道具 举报

发表于 2023-10-4 18:14:13 来自手机浏览器 | 显示全部楼层
看不懂,楼主太有耐心了
回复 支持 反对

使用道具 举报

发表于 2023-10-4 20:36:59 | 显示全部楼层
这个比较费时间,特别是程序需要反复调试。
回复 支持 反对

使用道具 举报

发表于 2023-10-4 21:27:16 | 显示全部楼层
这是让1500又焕发了青春啊。
回复 支持 反对

使用道具 举报

发表于 2023-10-4 21:49:03 | 显示全部楼层
过于专业,打击信心了
回复 支持 反对

使用道具 举报

发表于 2023-10-4 21:51:56 | 显示全部楼层
早先确实麻烦
回复 支持 反对

使用道具 举报

发表于 2023-10-5 00:17:43 | 显示全部楼层
谢谢你还记得我!加油!
回复 支持 1 反对 0

使用道具 举报

发表于 2023-10-5 06:58:40 | 显示全部楼层
这个太厉害了
回复 支持 反对

使用道具 举报

发表于 2023-10-5 10:03:09 | 显示全部楼层
技术跟不上,看不懂呀
回复 支持 反对

使用道具 举报

发表于 2023-10-5 10:06:19 | 显示全部楼层
完全看不懂,但是很厉害的样子。。。。
回复 支持 反对

使用道具 举报

发表于 2023-10-5 11:15:02 | 显示全部楼层
楼主软件硬件逻辑分析动手能力厉害!这个太牛了,
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-5-4 05:48 , Processed in 0.171601 second(s), 15 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表