|
5#
楼主 |
发表于 2016-1-3 04:34 AM
|
只看该作者
程序是用verilog写的 仿真是在ISE下调用modelsim 现在ISE启动不了了,重装很麻烦 先给你程序参考一下吧: 是用状态机写的,并行模式: module dds_words( reset, CLK, dds_wr,//dds写管脚 dds_rd,//dds读管脚 dds_address, dds_words ); input reset; input CLK; output dds_wr; output dds_rd; //"0"有效; output [5:0] dds_address; output [7:0] dds_words;
wire dds_wr; //"0"有效 wire dds_rd; //"0"有效; reg [5:0] dds_address; reg [7:0] dds_words; reg [3:0] state; parameter IDLE = 4'b0000, DDS_CLK_MULT = 4'b0001, DDS_FREWORD1_0 = 4'b0010, DDS_FREWORD1_1 = 4'b0011, DDS_FREWORD1_2 = 4'b0100, DDS_FREWORD1_3 = 4'b0101, ...................;//parameter 部分定义了状态机的状态变量
assign dds_wr = CLK; assign dds_rd = 1'b1;
always @(posedge CLK or posedge reset) if(reset) begin state <= DDS_CLK_MULT; end
else case(state) DDS_CLK_MULT: begin dds_address <= 6'h1E; //参考时钟控制寄存器的地址 dds_words <= 8'h45; //参考时钟控制寄存器的值,此次写入的值表示对参考时钟5倍倍频 state <= DDS_FREWORD1_0;//跳转至下一个状态,开始写频率字 end DDS_FREWORD1_0: begin dds_address <= 6'h09;//09为频率字第一个地址,此状态向频率字第一个寄存器地址写入值,下一个状态DDS_FREWORD1_1写第二个寄存器地址08 dds_words <= 8'h00; state <= DDS_FREWORD1_1; end DDS_FREWORD1_1: begin dds_address <= 6'h08; dds_words <= 8'h00; state <= DDS_FREWORD1_2; end ////////////依次写完所需的寄存器值 default : state <= IDLE; endcase
endmodule |
|