《ASK编码器与译码器的EDA设计.doc》由会员分享,可在线阅读,更多相关《ASK编码器与译码器的EDA设计.doc(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、安徽大学 题目: ASK编码器和译码器的EDA设计 专 业: 08 通信工程 设计的软件平台为 Max+plus一.ASK编码器与译码器系统的具体设计 主要的目标是:在发送端对基带信号进行ASK编码调制,在接收端对已进行编码的信号进行ASK解调,还原出发送端的基带信号。对ASK编码器系统设计模型如图8所示。图8:ASK编码器系统设计模型 ASK编码调制的原理就是:基带信号为“0”,则保持不变;基带信号为“1”,则转化为一个特定的频率信号。对sys时钟信号八分频作为载波信号。产生的m序列作为基带信号,经过数据选择器编码调制载波信号,产生新的编码信号。对ASK译码系统设计模型如图9所示。图9:AS
2、K译码器系统设计模型ASK译码器的原理是对已编码的ASK信号进行判断。检测到输入信号的频率为ASK编码器设置的频率时,即还原输出为“1”,否则还原输出为“0”。2 . 伪随机序列产生器(产生m序列) m序列是常用的一种伪随机序列5-7,它是最长线性反馈移位寄存器序列的简称。本实验采用的是周期为15的伪随机序列,即m序列为简单的4级m序列。查表可得其对应的本原多项式为F(x)=x4+x+1。根据这个编写相应的m序列发生器的程序。(1)新建ASK 产生m序列的 VHDL文件,输入VHDL代码8。图10:m序列vhdl程序上图的m序列VHDL代码有两个输入管脚clk和load控制信号,mout为输出
3、信号。定义signal信号msecom为m序列寄存器,共有四个信号元素。初始化m序列寄存器,当控制信号load为0 时,设置m序列寄存器的初始值为0110。当load信号为1时,进行寄存器的移位操作。然后进行移位寄存器msecom(0)和msecom(3)的异或运算。最后输出m序列。(2) 生成的m序列的功能模块如图11所示。图11:m序列功能模块(3) 连接m序列芯片的输入与输出及时钟信号控制信号管脚,连接后如图12所示,存原理图框图文件名为askcodec.gdf。图12:m序列原理图(4) m序列的仿真,建立m序列功能模块的波形仿真文件通过NODE加入输入输出后文件如图13所示。图13:
4、加入node管脚(5) 输入时钟信号5KHZ设置的时间长度endtime 10ms 仿真时间范围为10ms。(6) 将仿真时间及输入波形设置好后如图14所示。图14:未仿真前m序列(7) 将文件进行仿真,仿真成功后结果如图15所示。图15:m序列仿真成功由仿真的波形图,可以看出输出的m序列周期长度为15,输出的码型为1101。可以验证m序列产生器的输出的m序列的正确性。3. ASK编码器的设计ASK振幅键控的调制原理就是:基带信号为“0”,则保持不变;基带信号为“1”,则转化为一个特定的频率信号。ASK编码器的设计系统由一个频率发生器和数据选择器组成,系统框图如图16所示。图16:ASK编码器
5、框图 进行ASK编码器的代码设计(1) 新建ASK 调制编码的VHDL文件,输入VHDL代码。 图17:ASK编码器程序由上图的ASK编码器采用m序列的输出mout作为基带信号,端口为datain。Sysclk时钟信号,第一个进程process中编写程序对sysclk信号进行八分频作为一个调制信号。新的频率信号可由cnthigh和cntperiod设置改变。第二个process进程中编写数据选择器datain为1时则输出信号为signal信号fsig。Datain为0时则输出的信号也为0。(2) 生成的ASK编码器功能模块如图18所示。图18:ASK编码器功能模块(3) 打开askcodec.
6、gdf文件,连接ASK编码器的输入与输出及时钟信号控制信号管脚,连接后如图19所示,保存原理图框图文件名为askcodec.gdf。图19:ASK编码器原理图(4) ASK编码器的仿真,建立ASK编码器功能模块的波形仿真文件askcodec.scf,通过NODE加入输入输出。设置仿真时间为20us,clk周期为600ns,sysclk周期为10ns。保存askcodec.scf文件,选择Start Simulation,开始仿真编码器。仿真结果如图20所示 。图20:ASK编码器仿真结果部分结果放大如图21所示。图21:ASK编码器仿真结果放大图 由仿真的波形图,可以验证ask编码器的输出正确
7、性。 由图中sysclk时钟频率为10ns经过八分频后时钟周期为80ns,周期变为原来的八倍。输入的基带信号为1101,和产生的分频信号进过数据选择器选择后输出已编码信号askcodeout。由上图可知输出的结果实现了ASK的编码调制。4. ASK译码器的设计 ASK译码器的功能是对ASK编码的码元进行解调,还原出基带信号。ASK译码器的原理是对输入的ASK编码进行判断。检测到输入信号的频率为ASK编码器设置的频率时,即还原输出为“1”,否则还原输出为“0”。 检测输入信号的频率的方法是,对输入信号相连的两个上升沿之间的时间进行计数,如果计数的结果与ASK编码器的进行分频的参数cntperio
8、d相差不超过1,则认定为检测到输入信号的频率为ASK编码器设置的频率,此时设置解调输出为“1”,否则设置解调输出为“0”。 进行ASK译码器的代码设计(1) 新建ASK 译码器的VHDL文件,输入VHDL代码8。图22:ASK译码器程序 程序使用ASK编码器的输出作为译码器的输入。译码解调的原理就是检测到译码器的输入信号的频率为ASK编码器设置的频率时,还原输出为“1”,否则还原输出为“0”。(2) 生成的ASK译码器功能模块如图23所示。图23:ASK译码器功能模块(3) 打开askcodec.gdf文件,连接ASK编码器的输入与输出及时钟信号控制信号管脚,连接后如图24所示,保存原理图框图
9、文件名为askcodec.gdf。图24:ASK译码器原理图(4) ASK译码器的仿真,建立ASK译码器功能模块的波形仿真文件askcodec.scf,通过NODE加入输入输出。设置仿真时间为40us,clk周期为600ns,sys周期为10ns。保存askcodec.scf文件,选择Start Simulation,开始仿真编码器。仿真结果如图25所示。图25:ASK译码器译码仿真图部分结果放大得如图26所示。图26:ASK译码器译码仿真结果放大由仿真的波形图,可以验证ask译码器的输出的译码波形有大约180ns的延迟,译码波形和输入的基带信号基本相同,可知本模块仿真成功。二 ASK编码器与
10、译码器的原理图设计1. m序列发生器的设计 采用设计n=3即周期为7的m序列,根据相对应的本原多项式设计。本元多项式为F(x)=x3+x+1。使用D触发器和异或门。由于对产生的m序列要求初始状态为非0,对几个D触发器的开始设置一段低电平0,其余时刻均为高电平1。clr端始终为高电平。(1) 在原理图编辑窗中设计如下所示电路图9保存文件为m.gdf。图27:m序列的原理图(2) 包装原件入库。选择File项的create default symbol将m.gdf原理图文件变成一个包装好的单一元件,以备后文使用。生成的m序列的功能模块如图28所示。图28:生成的m序列功能模块(3) m序列的仿真,
11、对m.gdf原理图文件编译后,进行波形仿真。文件通过NODE加入输入输出端。对load信号进行设置,clr信号始终置1,clk信号为40ns,endtime设置为2us。可观察到m序列的仿真输出如图29所示。图29:m序列的仿真波形有图可看出输出的m序列的周期为7,输出的码型为,可以验证m序列产生器的输出的m序列的正确性。2 ASK编码器的原理图设计 编码器原理图设计方案即将基带信号和调制信号经过与门相与后输出编码调制信号askcode。图30:原理图编码方法(1) 进行ASK原理图设计并保存原理图文件askcode.gdf。 图31:编码器原理图由上图可知,ASK编码器是对m序列的基带信号和
12、clk2作为的一个调制信号进行相与的作用,即在其中间添加一个与门。(2) 编译原理图文件后建立仿真波形文件,加入NODE端口,保存文件名为askcode.scf。进行对load控制信号的设定。clr信号置1,clk1为40ns,clk2为10ns。可观察到ASK仿真波形如图32所示。图32:编码器仿真波形部分结果放大如图33所示。图33:仿真波形放大显示输入的基带信号为,和clk2基带信号相与输出已编码信号askcode。由上图可知输出的结果实现了ASK的编码调制。4.3 ASK译码器的原理图设计译码器原理图设计方案即将载波信号和已编码的信号askcode经过输出编码调制信号askcode相与
13、。再利用低通滤波器滤除高频分量即可得到基带信号。传统意义上的相干解调框图如图34所示。图34:相干解调框图由于解调需要低通滤波器,而在仿真软件中没有,所以只能有设计方案。如图35所示。图35:译码解调原理图由于EDA实验室的硬件条件不足 所以没有做硬件的仿真主要参考文献 1 朱正伟.EDA技术及应用M.北京:清华大学出版社,2010.2 刘福奇.FPGA嵌入式项目开发实战M.北京:电子工业出版社,2009.3 王毓银。数字电路逻辑设计M.北京:高等教育出版社,2005.附录实验中的VHDL源代码1. m序列的VHDL程序library ieee;use ieee.std_logic_1164.
14、all;use ieee.std_logic_unsigned.all;entity m_xht isport( clk : in std_logic; load : in std_logic; mout : out std_logic);end m_xht;architecture one of m_xht is signal msecom : std_logic_vector(3 downto 0);-m序列寄存器beginprocess(clk)begin if clkevent and clk = 1 then if load = 0 then msecom = 0110;-初始化m序
15、列寄存器 mout = msecom(3); else msecom(3 downto 1) = msecom(2 downto 0);-进行寄存器移位操作 msecom(0) = msecom(3) xor msecom(0);-进行移位寄存器异或运算 mout = msecom(3);-m序列符号输出 end if; end if;end process;end one;2. ASK编码器VHDL程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity ask_code isgener
16、ic(cnthigh : integer:=3; cntperiod : integer:= 7);port(clk : in std_logic; datain : in std_logic; -基带数据输入 askcodeout : out std_logic); -ask调制编码输出end ask_code;architecture behave of ask_code is signal fsig : std_logic;-频率信号 signal cnt : std_logic_vector(7 downto 0);-分频计数器begin-产生一个频率信号,频率大小可由cnthigh和
17、cntperiod设置process(clk)begin if clkevent and clk = 1 then if cnt = cnthigh then fsig = 1; cnt = cnt + ; elsif cnt = cntperiod then fsig = 0; cnt = ; else cnt = cnt + ; end if; end if;end process;-数据选择进程 datain为1时askcodeout设置为fsig信号,为0时askcodeout设置为0process(clk)begin if clkevent and clk = 1 then if d
18、atain = 1 then askcodeout = fsig; else askcodeout = 0; end if; end if;end process;end behave;3. ASK译码器的VHDL程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity ask_dec isgeneric(cntperiod : integer:= 7);-频率周期参数设置port(clk : in std_logic; askcodein : in std_logic;-ASK调制编码输
19、入 dataout : out std_logic);-ASK解码输出end ask_dec;architecture behave of ask_dec is signal cnt :integer range 0 to 255; signal datacom : std_logic_vector(1 downto 0);- 对输入信号移位寄存的寄存器 signal datareg : std_logic;beginprocess(clk)begin if clkevent and clk = 1 then datacom = askcodein & datacom(1);end if;end process;process(clk)beginif clkevent and clk = 1 then-计数器cnt和cntperiod参数相差不超过1时,-则认定检测到输入信号频率为ask编码器设置的频率,设置解调输出为1 if datacom = 10 then if (cnt cntperiod - 2) then dataout = 1; cnt (cntperiod + 1) then dataout = 0; cnt = 0; else cnt = cnt + 1; end if; end if;end process;end behave;