搜索
bottom↓
回复: 2

请教一个FPGA接51单片机数据的问题

[复制链接]

出0入0汤圆

发表于 2009-12-14 18:26:09 | 显示全部楼层 |阅读模式
我写了一个PWM发生程序,需要单片机给FPGA发送占空比,可是怎么也不对,用的是51单片机的P0,P2口
PWM 的verilog 代码:
`define pwm_width_addr  16'hff00
`define pwm_period_addr 16'hff01
`define no_rw 2'h0
`define rw_pwmwidth  2'h1
`define rw_pwmperiod 2'h2
module pwm(mcu_ad,mcu_a,ale,wr,rd,pwm,clk);
inout [7:0] mcu_ad;
input [7:0] mcu_a;
input ale;
input wr;
input rd;
output [5:0] pwm;
input clk;
reg [7:0] mcu_ad_reg;
reg [5:0] pwm_reg;
reg [7:0] count;
reg [7:0] width_count;
reg [7:0] period_count;
reg [1:0] addr_sel;

initial
  begin
   period_count=8'b11111111;
   width_count=8'b00000000;
  end
always @ (negedge ale)
begin
if({mcu_a,mcu_ad}== `pwm_width_addr)
  begin
   addr_sel = `rw_pwmwidth;
  end
else if({mcu_a,mcu_ad}==`pwm_period_addr)
  begin
   addr_sel=`rw_pwmperiod;
  end
else
   addr_sel= `no_rw;
end
always @ (posedge wr)
begin
if(addr_sel== `rw_pwmwidth)
  width_count = mcu_ad;
else if(addr_sel==`rw_pwmperiod)
  period_count = mcu_ad;
end
always @(negedge rd)
begin
if(addr_sel== `rw_pwmwidth)
  mcu_ad_reg=width_count;
else if (addr_sel==`rw_pwmperiod)
  mcu_ad_reg=period_count;
end
always @ (posedge clk)
begin
if(count>=period_count-1)
count<=0;
else
count<=count+1;
end
always @ (posedge clk)
begin
if(count<width_count)
  pwm_reg=6'b111111;
else
  pwm_reg=6'b000000;
end
assign mcu_ad=((rd==1'b1)||(addr_sel==`no_rw))?8'hz:mcu_ad_reg;
assign pwm=pwm_reg;
endmodule


C51 代码:
#include"reg51.h"
#include"address.h"
#include"intrins.h"

#define uint unsigned int
#define uchar unsigned char


void wr_pwm(unsigned int ADDR, unsigned char DATA)
{
*((unsigned char xdata *)ADDR)=DATA;
}

unsigned char rd_pwm(unsigned int ADDR)
{
  return   *((unsigned char xdata *)ADDR);
}

void delay_10us(uchar n)
{
   do
   {
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
   }while(--n);
}

void delay_ms(uint n)
{
  do
  {
    delay_10us(131);
   }while(--n);
}


void main()
{
  wr_pwm(pwm_period_addr,0xff);
  wr_pwm(pwm_width_addr,0x00);
  delay_ms(10);
  while        (1)
{
   pwm_width=pwm_width+1;
   wr_pwm(pwm_width_addr,pwm_width);
   if(pwm_width==0xff)
    pwm_width=0;
   delay_ms(100);
}
}

请高手指点一下,谢谢,

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2009-12-15 02:18:29 | 显示全部楼层
粗看了一下你的verilog部分代码,使用了大量的latch,这个用fpga实现可能会有一些未知的结果。另外initial是不能综合的,信号要复位。既然功能不是太复杂,能否改成时序逻辑电路,另外做一下仿真看看结果?

出0入0汤圆

 楼主| 发表于 2009-12-15 08:48:33 | 显示全部楼层
你好,能具体指点一下吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 19:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表