用verilog语言写的的BPSK数字调制器代码

用verilog语言写的的BPSK数字调制器代码,第1张

module psk(clk,clr,fcw,angle,M,EN,psk_output)

input[31:0]fcw//载波频率

input[9:0]angle//载波相位

input clk,clr

input M,EN//M为输入的序搭塌列

output [7:0]psk_output//输出波形

reg [7:0]psk_output

wire [7:0]psk_zaibo

mydds dds_ask(

.gclock(clk),

.clr(clr),

.fcw(fcw),

.pcw(angle),

.outputwave(psk_zaibo))//正弦发生模块,产生载波

always@(posedge clk)

begin

if(EN!=0)

begin

if(M==0)psk_output<=~psk_zaibo//M=0时相位为180

else psk_output<=psk_zaibo//M=1时相位为0

end

else psk_output<=0

end

endmodule

②DPSK模块:方式一

module dpsk(clk,clr,fcw,angle,EN,dpsk_output,a,M)

input[31:0]fcw//载波频率控制字

input[9:0]angle//载波相位控制字

input clk,clr//系统时钟,清零信号

input EN//系统使能信号

output [7:0]dpsk_output//输出波形

output a,M//输出产生的M序列与输出波形相对照

reg [7:0]dpsk_output

wire [7:0]dpsk_zaibo

reg a

initial //初始化模块

begin

a=0//a存放M序列上一码元的值

end

m1 m1(

.gclock(clk),

.EN(EN),

.M_code(M),

.clk(clk_M))//产生M序列

mydds dds_ask(

.gclock(clk),

.clr(clr),

.fcw(fcw),

.pcw(angle),

.outputwave(dpsk_zaibo))//正弦发生模块,产生载波

always@(posedge clk)

begin

if(EN!=0)

begin

if(M==a)dpsk_output<=~dpsk_zaibo//当前后码元相同时输出波形相位为180

else

begin

dpsk_output<=dpsk_zaibo//当前后码元不同时输出波形相位为0

end

end

else dpsk_output<=0//当系统没使能时,输出为0

end

always@(posedge clk_M)//根据M序列的同步时钟,来存储M序列当前的值,以便与M序列下一值相比较

begin

a=M

end

endmodule

③DPSK1模块:方知伍圆式二

module DPSK1(clk,clr,angle,DPSK_zaibo,EN,DPSK_out,M)

input clk,EN,clr

input[31:0]DPSK_zaibo//载波频率控制字

input[9:0]angle//载波相位控制字

output[7:0] DPSK_out

output M

reg[7:0]DPSK_out

reg[9:0]address1,address2

reg[9:0]address3,address4

wire[9:0]address

reg [9:0]dpsk_zaibo1

wire[7:0]DPSK_out1

wire[31:0]data_in

reg a

initial //初始化地址

begin

address1=0

address2=0

address2[9]=1

a=0

end

m1 m1(

.gclock(clk),

.EN(EN),

.M_code(M),

.clk(clk_M))//产橘没生M序列

add_fcw add_fcw(

.clr(clr),

.clk(clk),

.fcw(DPSK_zaibo),

.sum(data_in)

)//频率控制字累加

add_pcw add_pcw(

.clr(clr),

.clk(clk),

.pcw(angle),

.data_in(data_in),

.address(address)

) //与相位控制字相加

always@(posedge clk ) //根据前后码元的异同来修正查询地址

begin

if(EN!=0)

begin

address3=address1+address

address4=address2+address

if(M==a)dpsk_zaibo1<=address3//前后码元相同时,相位为0

else

begin

dpsk_zaibo1<=address4//前后码元不同时,相位为180

end

end

else dpsk_zaibo1<=0

end

sinrom sinrom (

.a(dpsk_zaibo1), // Bus [9 : 0]

.clk(clk),

.qspo(DPSK_out1))// Bus [7 : 0]//查询正弦查询表

always@(posedge clk_M) /根据M序列的同步时钟,来存储M序列当前的值,以便与M序列下一值相比较

begin

a=M

end

always@(posedge clk)

begin

DPSK_out=DPSK_out1

end

endmodule

m序列自己可以再网上查~

给你写一颤扒激个例子,下面是一个设计文件和一个对应的测试程序,希望能起到抛砖引玉的和用:

/此拿*

File Name : test.v

Author: www.flxc.net

Data : 2010-10-14 20:20:52

Description : This module is to shift the 32 bit input data with clock edges.

*/茄袜

`timescale 1ns/1ns

`define period 10

module test(

clk,

rst_n,

data_i,

data_o

)

input clk

input rst_n

input [31:0] data_i

output [31:0] data_o

reg [31:0] data_o

always@(posedge clk or negedge rst_n)

beg

if(!rst_n)

data_o <= 32'b0

else

data_o <= data_i >>1

end

endmodule

module test_tb

reg clk

reg rst_n

reg [31:0] data_i

wire [31:0] data_o

initial

begin

clk=1'b1

rst_n=1'b1

data_i=32'b1010_1111_1000_1111_1111_0000_0001_0000

#(`period/3)

rst_n=1'b0

#(`period/3)

rst_n=1'b1

#100000000

$stop

end

always #(`period/2) clk=~clk

endmodule


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8245476.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存