-
modelsim仿真问题 赏800家园币
[i=s] 本帖最后由 awbl 于 2023-8-27 13:33 编辑 [/i] 在学习FIR的过程中遇到了仿真问题,大家帮忙看一下。1、modelsim版本:modelsim-Altera 10.3d 2、quartus版本 :Quartus II 15.0 (64-bit) 3、主程序fir.v:[list=1] [*] module fir( [*] clk , [*] rst_n , [*] key , [*] dac_mode , [*] dac_sleep , [*] dac_clka , [*] dac_dat_a , [*] dac_wra , [*] dac_clkb , [*] dac_dat_b , [*] dac_wrb [*]); [*] [*]input clk ; [*]input rst_n ; [*]input [7:0] key ; [*]output dac_mode ; [*]output dac_sleep ; [*]output dac_clka ; [*]output [7:0] dac_dat_a ; [*]output dac_wra ; [*]output dac_clkb ; [*]output [7:0] dac_dat_b ; [*]output dac_wrb ; [*] [*]//信号类型定义。 [*]reg [7:0] sin_data ; [*]reg [31:0] cnt1 ; [*]wire add_cnt1 ; [*]wire end_cnt1 ; [*]wire [16:0] addr_temp ; [*]wire [6:0] addr ; [*]reg [12:0] x ; [*]reg [7:0] dac_dat_a ; [*]wire dac_sleep ; [*]wire dac_mode ; [*]wire dac_clka ; [*]reg [1:0] cnt0 ; [*]wire add_cnt0 ; [*]wire end_cnt0 ; [*]wire [7:0] fir_dout ; [*]wire fir_dout_vld; [*]reg [7:0] dac_dat_b ; [*]wire dac_clkb ; [*]wire dac_wrb ; [*]wire [7:0] fir_din ; [*]wire [7:0] fir_dout2 ; [*]//设计正弦信号。 [*]always @(*) begin [*] case(addr) [*]0: sin_data = 8'h7F; [*]1: sin_data = 8'h85; [*]2: sin_data = 8'h8C; [*]3: sin_data = 8'h92; [*]4: sin_data = 8'h98; [*]5: sin_data = 8'h9E; [*]6: sin_data = 8'hA4; [*]7: sin_data = 8'hAA; [*]8: sin_data = 8'hB0; [*]9: sin_data = 8'hB6; [*]10: sin_data = 8'hBC; [*]11: sin_data = 8'hC1; [*]12: sin_data = 8'hC6; [*]13: sin_data = 8'hCB; [*]14: sin_data = 8'hD0; [*]15: sin_data = 8'hD5; [*]16: sin_data = 8'hDA; [*]17: sin_data = 8'hDE; [*]18: sin_data = 8'hE2; [*]19: sin_data = 8'hE6; [*]20: sin_data = 8'hEA; [*]21: sin_data = 8'hED; [*]22: sin_data = 8'hF0; [*]23: sin_data = 8'hF3; [*]24: sin_data = 8'hF5; [*]25: sin_data = 8'hF7; [*]26: sin_data = 8'hF9; [*]27: sin_data = 8'hFB; [*]28: sin_data = 8'hFC; [*]29: sin_data = 8'hFD; [*]30: sin_data = 8'hFE; [*]31: sin_data = 8'hFE; [*]32: sin_data = 8'hFE; [*]33: sin_data = 8'hFE; [*]34: sin_data = 8'hFE; [*]35: sin_data = 8'hFD; [*]36: sin_data = 8'hFC; [*]37: sin_data = 8'hFA; [*]38: sin_data = 8'hF8; [*]39: sin_data = 8'hF6; [*]40: sin_data = 8'hF4; [*]41: sin_data = 8'hF1; [*]42: sin_data = 8'hEF; [*]43: sin_data = 8'hEB; [*]44: sin_data = 8'hE8; [*]45: sin_data = 8'hE4; [*]46: sin_data = 8'hE0; [*]47: sin_data = 8'hDC; [*]48: sin_data = 8'hD8; [*]49: sin_data = 8'hD3; [*]50: sin_data = 8'hCE; [*]51: sin_data = 8'hC9; [*]52: sin_data = 8'hC4; [*]53: sin_data = 8'hBE; [*]54: sin_data = 8'hB9; [*]55: sin_data = 8'hB3; [*]56: sin_data = 8'hAD; [*]57: sin_data = 8'hA7; [*]58: sin_data = 8'hA1; [*]59: sin_data = 8'h9B; [*]60: sin_data = 8'h95; [*]61: sin_data = 8'h8F; [*]62: sin_data = 8'h89; [*]63: sin_data = 8'h82; [*]64: sin_data = 8'h7D; [*]65: sin_data = 8'h77; [*]66: sin_data = 8'h70; [*]67: sin_data = 8'h6A; [*]68: sin_data = 8'h64; [*]69: sin_data = 8'h5E; [*]70: sin_data = 8'h58; [*]71: sin_data = 8'h52; [*]72: sin_data = 8'h4C; [*]73: sin_data = 8'h46; [*]74: sin_data = 8'h41; [*]75: sin_data = 8'h3C; [*]76: sin_data = 8'h36; [*]77: sin_data = 8'h31; [*]78: sin_data = 8'h2C; [*]79: sin_data = 8'h28; [*]80: sin_data = 8'h23; [*]81: sin_data = 8'h1F; [*]82: sin_data = 8'h1B; [*]83: sin_data = 8'h17; [*]84: sin_data = 8'h14; [*]85: sin_data = 8'h11; [*]86: sin_data = 8'hE ; [*]87: sin_data = 8'hB ; [*]88: sin_data = 8'h9 ; [*]89: sin_data = 8'h7 ; [*]90: sin_data = 8'h5 ; [*]91: sin_data = 8'h3 ; [*]92: sin_data = 8'h2 ; [*]93: sin_data = 8'h1 ; [*]94: sin_data = 8'h1 ; [*]95: sin_data = 8'h1 ; [*]96: sin_data = 8'h1 ; [*]97: sin_data = 8'h1 ; [*]98: sin_data = 8'h2 ; [*]99: sin_data = 8'h3 ; [*]100: sin_data = 8'h4 ; [*]101: sin_data = 8'h6 ; [*]102: sin_data = 8'h7 ; [*]103: sin_data = 8'hA ; [*]104: sin_data = 8'hC ; [*]105: sin_data = 8'hF ; [*]106: sin_data = 8'h12; [*]107: sin_data = 8'h15; [*]108: sin_data = 8'h19; [*]109: sin_data = 8'h1D; [*]110: sin_data = 8'h21; [*]111: sin_data = 8'h25; [*]112: sin_data = 8'h2A; [*]113: sin_data = 8'h2E; [*]114: sin_data = 8'h33; [*]115: sin_data = 8'h38; [*]116: sin_data = 8'h3E; [*]117: sin_data = 8'h43; [*]118: sin_data = 8'h49; [*]119: sin_data = 8'h4E; [*]120: sin_data = 8'h54; [*]121: sin_data = 8'h5A; [*]122: sin_data = 8'h60; [*]123: sin_data = 8'h67; [*]124: sin_data = 8'h6D; [*]125: sin_data = 8'h73; [*]126: sin_data = 8'h79; [*]127: sin_data = 8'h7F; [*] endcase [*]end [*] [*]always @(posedge clk or negedge rst_n)begin [*] if(!rst_n)begin [*] cnt1 <= 0; [*] end [*] else if(add_cnt1)begin [*] if(end_cnt1) [*] cnt1 <= 0; [*] else [*] cnt1 <= cnt1 + 1; [*] end [*]end [*] [*]assign add_cnt1 = 1 ; [*]assign end_cnt1 = 0 ; [*] [*] [*]always @(*) begin [*] if(key == 0)begin [*] x = 262 ; [*] end [*] else if(key == 1)begin [*] x = 524 ; [*] end [*] else if(key == 2)begin [*] x = 786 ; [*] end [*] else if(key == 3)begin [*] x = 1029 ; [*] end [*] else if(key == 4)begin [*] x = 1311 ; [*] end [*] else if(key == 5)begin [*] x = 1573 ; [*] end [*] else if(key == 6)begin [*] x = 1835 ; [*] end [*] else begin [*] x = 2097 ; [*] end [*]end [*]assign addr_temp = cnt1 * x ; [*]assign addr = addr_temp >> 10 ; [*] [*] [*]//A通道输出。 [*]always @(posedge clk or negedge rst_n)begin [*] if(rst_n==1'b0)begin [*] dac_dat_a <= 0 ; [*] end [*] else begin [*] dac_dat_a <= 255 - sin_data ; [*] end [*]end [*] [*]assign dac_sleep = 0 ; [*]assign dac_mode = 1 ; [*]assign dac_wra = dac_clka ; [*]assign dac_clka = ~clk ; [*] [*]//设计滤波器。 [*]always @(posedge clk or negedge rst_n)begin [*] if(!rst_n)begin [*] cnt0 <= 0; [*] end [*] else if(add_cnt0)begin [*] if(end_cnt0) [*] cnt0 <= 0; [*] else [*] cnt0 <= cnt0 + 1; [*] end [*]end [*] [*]assign add_cnt0 = 1 ; [*]assign end_cnt0 = add_cnt0 && cnt0== 4 - 1 ; [*]assign fir_din = sin_data - 128 ; [*]ip_fir_1 module_2( [*] .clk (clk ), [*] .reset_n (rst_n ), [*] .ast_sink_data (fir_din ), [*] .ast_sink_valid (end_cnt0 ), [*] .ast_sink_error (2'b00 ), [*] .ast_source_data (fir_dout ), [*] .ast_source_valid (fir_dout_vld ), [*] .ast_source_error ( ) [*] ); [*]assign fir_dout2 = fir_dout + 128 ; [*]always @(posedge clk or negedge rst_n)begin [*] if(rst_n==1'b0)begin [*] dac_dat_b <= 0 ; [*] end [*] else if(fir_dout_vld) begin [*] dac_dat_b <= 255 - fir_dout2 ; [*] end [*]end [*] [*]assign dac_wrb = dac_clkb ; [*]assign dac_clkb = ~clk ; [*]endmodule [/list] 4、IP核文件 ip_fir_1.v : [list=1] [*]`timescale 1 ps / 1 ps [*]module ip_fir_1 ( [*] input wire clk, // clk.clk [*] input wire reset_n, // rst.reset_n [*] input wire [7:0] ast_sink_data, // avalon_streaming_sink.data [*] input wire ast_sink_valid, // .valid [*] input wire [1:0] ast_sink_error, // .error [*] output wire [7:0] ast_source_data, // avalon_streaming_source.data [*] output wire ast_source_valid, // .valid [*] output wire [1:0] ast_source_error // .error [*] ); [*] [*] ip_fir_1_0002 ip_fir_1_inst ( [*] .clk (clk), // clk.clk [*] .reset_n (reset_n), // rst.reset_n [*] .ast_sink_data (ast_sink_data), // avalon_streaming_sink.data [*] .ast_sink_valid (ast_sink_valid), // .valid [*] .ast_sink_error (ast_sink_error), // .error [*] .ast_source_data (ast_source_data), // avalon_streaming_source.data [*] .ast_source_valid (ast_source_valid), // .valid [*] .ast_source_error (ast_source_error) // .error [*] ); [*] [*]endmodule [/list] 5、测试文件 test_fir.v : [list=1] [*]`timescale 1 ns/1 ns [*] [*]module test_fir(); [*] [*]//时钟和复位 [*]reg clk ; [*]reg rst_n; [*] [*]//uut的输入信号 [*]reg[7:0] key ; [*] [*]//uut的输出信号 [*]wire dac_mode ; [*]wire dac_sleep ; [*]wire dac_clka ; [*]wire [7:0] dac_dat_a ; [*]wire dac_wra ; [*]wire dac_clkb ; [*]wire [7:0] dac_dat_b ; [*]wire dac_wrb ; [*] [*] [*]//时钟周期,单位为ns,可在此修改时钟周期。 [*]parameter CYCLE = 200; [*] [*]//复位时间,此时表示复位3个时钟周期的时间。 [*]parameter RST_TIME = 3 ; [*] [*]//待测试的模块例化 [*]fir uut( [*] .clk (clk ), [*] .rst_n (rst_n ), [*] .key (key ), [*] .dac_mode (dac_mode ), [*] .dac_sleep (dac_sleep ), [*] .dac_clka (dac_clka ), [*] .dac_dat_a (dac_dat_a ), [*] .dac_wra (dac_wra ), [*] .dac_clkb (dac_clkb ), [*] .dac_dat_b (dac_dat_b ), [*] .dac_wrb (dac_wrb ) [*] [*]); [*] [*] [*]//生成本地时钟50M [*]initial begin [*] clk = 0; [*] forever [*] #(CYCLE/2) [*] clk=~clk; [*]end [*] [*]//产生复位信号 [*]initial begin [*] rst_n = 1; [*] #2; [*] rst_n = 0; [*] #(CYCLE*RST_TIME); [*] rst_n = 1; [*]end [*] [*]//输入信号key赋值方式 [*]initial begin [*] forever begin [*] #(10000*CYCLE); [*] //赋初值 [*] key = 0; [*] #(10000*CYCLE); [*] key = 1; [*] #(10000*CYCLE); [*] key = 2; [*] #(10000*CYCLE); [*] key = 3; [*] #(10000*CYCLE); [*] key = 4; [*] #(10000*CYCLE); [*] key = 5; [*] #(10000*CYCLE); [*] key = 6; [*] #(10000*CYCLE); [*] key = 7; [*]end [*]end [*]endmodule [/list] 6、quartus和modelsim联合仿真报错如下图: [attach]2152750[/attach] [attach]2152748[/attach] 恳请各位指正!!
28489浏览量 7回复量 关注量 -
DAC扩展 sos
各位老师好:目前准备用APM32F105VCT6做开发,看手册这个芯片有2路DAC,我需要用4路DAC。请问怎么扩展?如果选用独立的DAC芯片,请推荐一下合适的DAC芯片。国产或者进口的均可,价格要相对低一些。单个DAC芯片的采购价格控制在10元以内。 谢谢各位老师。
1142浏览量 0回复量 关注量 -
GD32 F303系列DAC与ADC问题
程序中使用了 PA5用于 ADC 输入,PA4用于DAC模拟输出 ,但是只要在初始化中打开DAC时钟,PA5的模拟输入值就为0,初始化中屏蔽DAC时钟模拟输入值就正常,但是DAC又用不了。这是咋回事呢! 兄弟姐妹们有遇到同样情况的吗?
3940浏览量 1回复量 关注量 -
问AT32F407中TMR6,TMR7和DAC同步问题 sos
看到开发手册中说与dac同步是TMR6和TMR7特有的?但是看到DAC中发现TMR2之类的TRGOUT信号,都可以触发dac,与这此定时器的触发信号相比,TMR6/7的TRGOUT有特别吗,能否给个时序图。另外 ,TMR6/7溢出事件同样可以做为DMA请求,那是否同样与DMA具备同步。另外,手册中DMA请求表9-3,有TMR6/DAC_CH2,和TMR6_UP/DAC_CH2.这里的TMR6_UP是指什么,找不到另外的说明。
1395浏览量 0回复量 关注量 -
HC32F072将数据直接输出到DAC的问题
各位大侠有没有HC32F072直接将数据送到DAC输出口的例程?Example里有正弦波及三角波的输出,但没有直接输出DAC的例程。我简单改了下程序想直接输出,结果发现输出幅度混乱,且不能关闭DMA,否则输出不变。恳请大侠们指点。谢谢!
1383浏览量 1回复量 关注量 -
HC32F072JATA用EXVREF脚电压作为ADC和DAC参考电压,是否可行? sos
在用HC32F072JATA设计电路时,准备用19脚作为EXVREF输入引脚,作为ADC和DAC的参考电压,但数据手册上只有ADC有关于EXVREF的说明,DAC无相关说明,只在用户手册上看到DAC可以和ADC共用VREF+。目前我工作电压5V,连接到DVCC和AVCC,EXVREF脚电压4V,请有经验的大师们帮忙看看,这种方案是否可行?谢谢!
1031浏览量 0回复量 关注量 -
HK32F103VET6 DAC1 输出电压异常问题 sos
void DAC_Configuration(void) { DAC_InitTypeDef DAC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // GPIO_Init(GPIOA, &GPIO_InitStructure); //A¶Ë¿Ú //DAC_DeInit(); // DAC_Cmd(DAC_Channel_1,ENABLE); // DAC_StructInit(&DAC_InitStructure);//½«DAC_StructµÄÖµÉèΪĬÈÏ DAC_InitStructure.DAC_Trigger=DAC_Trigger_Software;//ÓÉÈí¼þ´¥·¢ DAC_InitStructure.DAC_WaveGeneration=DAC_WaveGeneration_None;//¹Ø±Õ²¨ÐÎÉú³É DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude=DAC_TriangleAmplitude_4095; DAC_InitStructure.DAC_OutputBuffer=DAC_OutputBuffer_Enable;//ʹÄÜDACͨµÀ»º´æ DAC_Init(DAC_Channel_1,&DAC_InitStructure); /* Enable DAC Channel1 */ DAC_Cmd(DAC_Channel_1, ENABLE); DAC_SetChannel1Data(DAC_Align_12b_R,4085); DAC_SoftwareTriggerCmd(DAC_Channel_1,ENABLE); while(1) { DAC_SetChannel1Data(DAC_Align_12b_R,4085); DAC_SoftwareTriggerCmd(DAC_Channel_1,ENABLE); } 源代码如上,输出电压不对,试过其他数值也不对,代码之前是用在ST上的
2230浏览量 0回复量 关注量 -
有谁用过F28377的4、5、6、7、8路cmpss的? sos
我用的主控芯片是TMS320F28377D的DSP,该型号DSP一共有8个独立cmpss,我使用了其中的三路cmpss(1、2、3路),可以将该三路的cmpss按照XBAR的映射关系将cmpss的比较结果映射到相应的管脚,但是却无法将其他的几路(4、5、6、7、8)的比较结果映射到其他管脚输出。配置都完全一样,通过XBAR的映射逻辑也都参考数据手册的要求整的。但是,只有1、2、3路正常,其他的都异常。大家是否遇到类似的为题。void Cmpss6_Initial_Function(void) { EALLOW; Cmpss6Regs.COMPCTL.bit.COMPDACE = 1; /*使能比较器的DAC*/ Cmpss6Regs.COMPCTL.bit.COMPHSOURCE = 0; /*比较器的P端输入为DAC*/ Cmpss6Regs.COMPCTL.bit.COMPLSOURCE = 1; /*需要设置比较器的N端输入为外部输入引脚*/ Cmpss6Regs.COMPCTL.bit.COMPHINV = 0; /*比较器的输出结果不反向*/ Cmpss6Regs.COMPCTL.bit.ASYNCHEN = 0; /**/ Cmpss6Regs.COMPDACCTL.bit.DACSOURCE = 0; /*配置DAC的数字输入端的值来源于影子寄存器*/ Cmpss6Regs.COMPDACCTL.bit.SELREF = 0; /*配置DAC的参考电压为VDDA 注意不是比较器的参考电压 比较器的参考电压为DAC的输出电压*/ Cmpss6Regs.COMPDACCTL.bit.SWLOADSEL = 0; /*使用系统时钟来同步DAC*/ Cmpss6Regs.DACHVALS.bit.DACVAL = 2047; /*通过配置DAC的输出电压值 来设置比较器的参考电压 该寄存器为影子寄存器 DAC的输出值只能是通过影子寄存器的设置来实现 */ /*比较器数字滤波设计 采用典型的数字滤波 */ Cmpss6Regs.CTRIPHFILCLKCTL.bit.CLKPRESCALE = 2047; Cmpss6Regs.CTRIPHFILCTL.bit.SAMPWIN = 31; Cmpss6Regs.CTRIPHFILCTL.bit.THRESH = 31; Cmpss6Regs.CTRIPHFILCTL.bit.FILINIT = 1; Cmpss6Regs.COMPCTL.bit.CTRIPOUTHSEL = 0; /*比较器输出非同步*/ Cmpss6Regs.COMPCTL.bit.CTRIPLSEL = 0; /*比较器输出非滤波*/ Cmpss6Regs.COMPHYSCTL.bit.COMPHYS = 4; /*设置滞环宽度*/ OutputXbarRegs.OUTPUT5MUX0TO15CFG.bit.MUX10 = 0; /*MUX6 = 0 XBAR4 设置比较器的为高输出结果*/ OutputXbarRegs.OUTPUT5MUXENABLE.bit.MUX10 = 1; /*使能复用开关*/ EDIS; } void Init_Cmpss6_Gpio(void) { EALLOW; GpioCtrlRegs.GPADIR.bit.GPIO29 = 1; /*配置GPIO29的方向设置为输出口*/ GpioCtrlRegs.GPAPUD.bit.GPIO29 = 1; /*禁止GPIO29的上拉功能 */ GpioCtrlRegs.GPAGMUX2.bit.GPIO29 = 0x01; /*通过设置GPAMUX寄存器和GPAGMUX寄存器的值 来将GPIO29的管脚功能映射到外设功能 参照手册P959的表8-7所示 将GPIO29映射到OUTPUTXBAR6*/ GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 0x01; EDIS; } 这个是其中一个异常的cmpss的配置和XBAR管脚配置。
2175浏览量 0回复量 关注量 -
既然DAC可以输出音频,是否单片机DAC输出视频信号?
既然DAC可以输出音频,是否单片机DAC输出视频信号? 目前音频可以通过单片机的DAC输出,也就是用单片机可以合成音频信号。好比音乐信号。 那么 这个同理。 单片机(H7等之类)的DAC是否也可以合成视频信号。模拟视频CVBS/ PAL-D/NTSC等各式的视频信号。 好比放给图,某些图片转模拟视频等。 这个有参考吗? 有没有DIY一下?
1668浏览量 5回复量 关注量