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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)